Node.js中的Anytime算法
“An是一种算法,即使问题在结束前的任何时间被中断,它也能返回有效的解决方案。该算法希望在运行的时间越长,它能找到越来越好的解决方案。” 我的问题是:如何在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=新解决方案; } 返回最佳解
函数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