我希望在没有递归的情况下看到alpha-beta搜索的实现(negamax更精确)。我知道基本的想法 - 使用一个或多个堆栈来跟踪关卡,但拥有一个真正的代码可以节省我很多时间。
使用Java,C#或Javascript是完美的,但C / C ++很好。
这是(简化的)递归代码:
function search(crtDepth, alpha, beta)
{
if (crtDepth == 0)
return eval(board);
var moves = generateMoves(board);
var crtMove;
var score = 200000;
var i;
while (i<moves.length)
{
crtMove = moves.moveList[i++];
doMove(board, crtMove);
score = -search(crtDepth-1, -beta, -alpha);
undoMove(board, crtMove);
if (score > alpha)
{
if (score >= beta)
return beta;
alpha = score;
}
}
return alpha;
}
搜索(4,-200000,200000);
答案 0 :(得分:1)
Knuth和Moore在1975年使用ad-hoc Algol语言发布了一个迭代的alpha-beta例程。
An Analysis of Alpha Beta Pruning(页301)
同样在“选择的算法分析论文”第9章
转换到C#看起来并不容易,但它可能会帮助那些想要实现优化的纯粹乐趣的人。
我对国际象棋编程很陌生,所以它超出了我的能力范围。另外,我最大的性能提升是从“Copy-Make”切换到“Make-Unmake”。我正在使用XNA,因此将我的GC延迟降低到几乎为0会修复我的所有性能问题,现在它在我的360上比在我的PC上运行得更快,因此这种优化似乎太难以满足我的需求。
答案 1 :(得分:1)
对于最近的一些代码,我在EasyAI python库中编写了一个非递归的Negamax例程作为选项。具体的源代码位于:
https://github.com/Zulko/easyAI/blob/master/easyAI/AI/NonRecursiveNegamax.py
它使用一个带有固定对象数组(由目标深度确定的大小)的简单循环,以有序的方式在树上上下移动。对于我使用它的特定项目,它比递归版本快六倍。但我确信每场比赛都会有不同的反应。
没有办法否认这是一些密集而复杂的代码,转换为C / Java / C#将具有挑战性。边境案件几乎没有什么。 :)
如果将其转换为C / Java / C#,我很乐意看到结果。在评论中放置一个链接?