Node.js中的任何时间算法

时间:2014-03-23 15:34:37

标签: node.js performance algorithm

" anytime algorithm是一种算法,即使在问题结束之前的任何时间中断,也可以返回问题的有效解决方案。该算法有望在更长时间内运行时找到更好,更好的解决方案。

我的问题是:如何在Node.js中编写任何时间算法?

我有一个看起来如下(伪代码)的函数:

function findBestSolution(input) {
  var bestSolutionSoFar = EMPTY_SOLUTION;  // initialization
  for (var i=1; i<=1000000; ++i) {
    var newSolution = findNewSolution(...);   // this might take a long time
    if (newSolution.quality() > bestSolutionSoFar.quality())
       bestSolutionSoFar = newSolution;
  }
  return bestSolutionSoFar;
}

现在,由于长循环和新解决方案的冗长计算,此函数需要很长时间才能运行。

我想要的是让调用函数随时中断此函数,并获得当前的&#34; bestSolutionSoFar&#34;。

因此,例如,用户可能开始运行该功能,然后去喝一些咖啡,然后回来中断该功能,它将为他提供迄今为止找到的最佳解决方案。

1 个答案:

答案 0 :(得分:2)

您对中断的发生方式有任何具体要求(或想法)吗?一种通用的方法就是如下(除了增加一个计数器作为其工作步骤,但希望传达一般的想法)。

function Solver(){
    this.intermediateAnswer = 0;
    this.wrapItUp = false;
    this.finalCallback = undefined;
};

Solver.prototype.interrupt = function(){
    this.wrapItUp = true;
};

Solver.prototype.solve = function(startWith, cb) {
    var self = this;
    function workStep(){
        if (self.wrapItUp)
            return self.finalCallback(self.intermediateAnswer);
        self.intermediateAnswer = self.intermediateAnswer + 1;
        setImmediate(workStep);
    };

    this.finalCallback = cb;
    this.intermediateAnswer = startWith;
    setImmediate(workStep);
};

var solver = new Solver();
solver.solve(1,function(result){
    console.log('got to: ' + result);
});

// tell it to stop after five seconds

setTimeout(function(){solver.interrupt();}, 5000);

结果:

got to: 1790178

...或左右 - 正如预期的那样,最终价值会在1.8mil左右反弹。

还有其他方法可以打包它(例如使用promises或可能是ES6生成器而不是回调)以及使用其他东西来触发中断。我会好奇地看到自己的其他答案,主要是因为知识分子的好奇心。如果这是您正在考虑的方向或在计划使用的背景下可能存在的缺陷,请发表评论。