Node.js中的Anytime算法

Node.js中的Anytime算法,node.js,performance,algorithm,Node.js,Performance,Algorithm,“An是一种算法,即使问题在结束前的任何时间被中断,它也能返回有效的解决方案。该算法希望在运行的时间越长,它能找到越来越好的解决方案。” 我的问题是:如何在Node.js中编写anytime算法 我有一个如下所示的函数(伪代码): 函数findBestSolution(输入){ var bestSolutionSoFar=EMPTY_SOLUTION;//初始化 对于(var i=1;i bestSolutionSoFar.quality()) 最佳解决方案OFAR=新解决方案; } 返回最佳解

“An是一种算法,即使问题在结束前的任何时间被中断,它也能返回有效的解决方案。该算法希望在运行的时间越长,它能找到越来越好的解决方案。”

我的问题是:如何在Node.js中编写anytime算法

我有一个如下所示的函数(伪代码):

函数findBestSolution(输入){
var bestSolutionSoFar=EMPTY_SOLUTION;//初始化
对于(var i=1;i bestSolutionSoFar.quality())
最佳解决方案OFAR=新解决方案;
}
返回最佳解决方案;
}
现在,这个函数需要很长时间才能运行,因为循环很长,新解的计算也很长

我想要的是启用调用函数随时中断此函数,并获得当前的“bestSolutionSoFar”


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

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

结果是:

got to: 1790178
…或大约-正如预期的那样,最终值在1.8 mil左右反弹一点


还有其他方法可以将其打包(例如使用承诺或ES6生成器,而不是回调),以及使用其他方法触发中断。我自己也很想看到其他答案,主要是出于对知识的好奇。请说明这是否符合您的想法,或者在您计划使用的情况下,它可能存在哪些不足之处。

我不明白这与NodeJ有什么关系。听起来任何单调收敛算法和特定于节点的工具都是不相关的…@BenjaminGruenbaum正如你在答案中所看到的,有一些特定于Node.js的实现细节。答案与问题完全无关,编写它的人可能没有遇到“anytime algorithm”的概念在人工智能文学之前。“anytime算法”的概念仅仅意味着在环境需要改变的情况下,它将执行。它的特点是人工智能中勘探和开发之间的永久平衡。在这一点上,你必须停止深思熟虑,以更被动的方式作出反应。它描述了算法的理想特性。它与节点本身无关。而且,任何单调的东西都是有效的。如果不清楚的话,“在智能系统中使用任何时候的算法”就涵盖了这一点。也许在人工智能中,这个概念有不同的含义。但根据我链接到的维基百科页面,“anytime algorithm”(随时算法)的概念与用户在算法完成之前中断算法的执行有关。谢谢,这看起来是一个很好的解决方案。问题是我的“solve”函数很复杂,很难将其转换为异步函数。但这是另一个问题,不客气。我看到您对关于将函数转换为异步的另一个问题有了一些回答。希望转换不会太乏味,祝你好运。
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