“Ananytime algorithm是一种算法,它可以返回问题的有效解决方案,即使问题在结束之前的任何时候被中断人们期望算法能在运行的时间越长的情况下找到越来越好的解。
我的问题是:如何在Node.js中编写anytime算法?
我有一个如下所示的函数(伪代码):

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;
}

现在,这个函数需要很长的时间才能运行,因为它的循环很长,而且新解的计算也很长。
我想要的是使调用函数能够在任何时候中断此函数,并获得当前的“最佳解决方案”。
例如,用户可以开始运行这个函数,然后去喝点咖啡,然后回来中断这个函数,它会给他目前为止找到的最好的解决方案。

最佳答案

你有什么具体的要求(或想法)你想如何中断发生?一种通用的方法是如下所示(它只增加一个计数器作为它的工作步骤,但希望能传达一般的想法)。

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.8百万左右反弹一点。
还有其他方法可以打包(例如使用promises或ES6生成器而不是回调)以及使用其他东西触发中断我会很好奇看到其他的答案,主要是为了智力上的好奇请评论这是否是你正在思考的方向,或者在你计划使用的背景下,它的不足之处是什么。

关于node.js - Node.js中的随时算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22592975/

10-16 08:26
查看更多