node.js - Node.js 中的 Anytime 算法

标签 node.js performance algorithm

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

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

我想要的是让调用函数可以随时中断这个函数,得到当前的“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

...或者大约 - 正如预期的那样,最终值(value)在 180 万左右反弹。

还有其他方法可以打包它(例如使用 promises 或可能使用 ES6 生成器而不是回调)以及使用其他东西来触发中断。我会很好奇自己看到其他答案,主要是出于求知欲。请评论这是否符合您的想法,或者在您计划使用的情况下它可能存在哪些不足。

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

相关文章:

node.js - 表达 : how to redirect to a static file in the middle of an handler?

javascript - 向 PayPal Payouts REST API 发送请求返回 HTTP 代码 204 且无内容

algorithm - 如何判断两棵二叉树的内容是否相同?

php - 项目排名,使用 Reddit 排名算法按置信度排序

php - 调用 mysqli_fetch_assoc 最有效的方法

java - 在流中搜索字符串的有效方法

node.js - 将文件上传到本地目录以及 MongoDB

javascript - 为什么 Sequelize 时间戳没有关闭

javascript - javascript中的对象访问与数组访问

data-structures - 效率: What data structure to use. ..?