没有递归的Alpha-beta树搜索

时间:2010-11-05 08:26:24

标签: search recursion tree

我希望在没有递归的情况下看到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);

2 个答案:

答案 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上运行得更快,因此这种优化似乎太难以满足我的需求。

另见Recursion to Iteration

答案 1 :(得分:1)

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

https://github.com/Zulko/easyAI/blob/master/easyAI/AI/NonRecursiveNegamax.py

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

没有办法否认这是一些密集而复杂的代码,转换为C / Java / C#将具有挑战性。边境案件几乎没有什么。 :)

如果将其转换为C / Java / C#,我很乐意看到结果。在评论中放置一个链接?