【问题标题】:Alpha-beta tree search without recursion无递归的 Alpha-beta 树搜索
【发布时间】:2010-11-05 08:26:23
【问题描述】:

我希望看到一个没有递归的 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);

【问题讨论】:

  • 发布您的结构和一些带有递归的代码将有助于为您解除递归的人。至少你会更准确地得到你想要的。
  • 谷歌:java alpha-beta search negamax
  • @battal,我有正常的递归代码。我找不到非递归的。
  • 在搜索词中添加“非递归”的变体看起来可以提供一些结果,但确实没有多少这方面的例子。看来你可能得补一个了。对了,this 有关系吗?

标签: search recursion tree


【解决方案1】:

Knuth 和 Moore 在 1975 年使用一种特殊的 Algol 语言发布了一个迭代的 alpha-beta 例程。

An Analysis of Alpha Beta Pruning(第301页)

也在“算法分析论文选”第9章中

将其转换为 C# 看起来并不容易,但它可能会帮助那些想要为纯粹的优化乐趣而这样做的人。

我对国际象棋编程很陌生,所以这超出了我的能力范围。另外,我最大的性能提升是当我从“Copy-Make”切换到“Make-Unmake”时。我正在使用 XNA,因此将我的 GC 延迟降至几乎 0 解决了我所有的性能问题,现在它在我的 360 上运行得比在我的 PC 上运行得更快,所以这种优化似乎很难满足我的需求。

另见Recursion to Iteration

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      相关资源
      最近更新 更多