Javascript 国际象棋AI需要一个非递归的、基于迭代的negamax算法吗

Javascript 国际象棋AI需要一个非递归的、基于迭代的negamax算法吗,javascript,algorithm,recursion,artificial-intelligence,chess,Javascript,Algorithm,Recursion,Artificial Intelligence,Chess,对于非递归、基于迭代的negamax算法,有什么想法或伪代码吗 我使用negamax作为我的国际象棋AI的搜索中心 我的引擎是用JavaScript编写的,根据文献,如果使用迭代而不是递归,则可以受益4倍 就节点深度而言,JavaScript到C的代价大约慢3倍。这一调整可能会使竞争环境更加公平,但对这两个因素都持保留态度:) 而不是较长的negamax代码。类似的递归代码是我的“静态交换评估”(请参阅) 函数_参见(sq、fen、depth、maxDepth、color、chess){ “严

对于非递归、基于迭代的negamax算法,有什么想法或伪代码吗

我使用negamax作为我的国际象棋AI的搜索中心

我的引擎是用JavaScript编写的,根据文献,如果使用迭代而不是递归,则可以受益4倍

就节点深度而言,JavaScript到C的代价大约慢3倍。这一调整可能会使竞争环境更加公平,但对这两个因素都持保留态度:)

而不是较长的negamax代码。类似的递归代码是我的“静态交换评估”(请参阅)

函数_参见(sq、fen、depth、maxDepth、color、chess){
“严格使用”;
如果(chess.fen()!==fen){
控制台错误(“s fen/chess同步错误”);
国际象棋负荷(分);
}
if(chess.in_checkmate()| chess.game_over()){
返回配偶;
}else if(chess.in_check()){
返回0;/????
}
var值=0,移动,索引,移动分数,tfen,foo,bar;
if(深度<最大深度){
下棋({
平方:平方,,
详细:正确
});
如果(移动长度>0){
counter.seeNodes=counter.seeNodes+1;
移动=\链(移动)
//只捕获
.拒绝(功能(e){
return!e.hasOwnProperty('captured');
})
//材料MVV
.sortBy(功能){
返回评估件(s件);
})
//捕获LVA
.sortBy(功能){
返回-评估文件(已捕获);
})
.value();
//counter.sDepth=Math.max(深度,counter.sDepth);
//counter.maxSDepth=Math.max(maxDepth,counter.maxSDepth);console.error(JSON.stringify(moves));
对于(索引=0;索引}
您可以使用堆栈将递归算法转换为迭代算法。通常,在堆栈上推送的对象将与递归调用时使用的参数相同。

我在EasyAI python库中编写了一个非递归Negamax例程作为选项。具体源代码位于:

它使用一个带有固定对象数组(大小由目标深度决定)的简单循环,以有序方式在树上上下移动。对于我正在使用它的特定项目,它比递归版本快六倍。但我相信每一场比赛都会有不同的反应

没有办法否认这是一段密集而复杂的代码,转换成Javascript将是。。。具有挑战性的这几乎只是边境案件


如果您将其转换为Javascript,我希望看到结果。在注释中放置链接?

发布当前代码将有助于获得更好的解决方案。我最近编写了一个通用的非递归Negamax例程,它使用一个简单的对象数组。该库是用Python而不是Javascript编写的;但是你可以毫无疑问地转换代码。具体的源文件是:好主意,我看到你的逻辑。我的直觉是,堆栈方法的性能可能只比递归稍微好一点,但受到相同的限制和类似的内存占用。不是我需要的时钟速度的3倍提升。你有javascript伪代码吗?