【问题标题】:How to implement iterative deepening with alpha beta pruning如何使用 alpha beta pruning 实现迭代加深
【发布时间】:2017-01-20 05:03:40
【问题描述】:

我正在编写一个玩点和盒子的程序,我想通过在迭代深化方案中根据它们的启发式值对我在 alphaBeta 中考虑的移动进行排序,从而提高我的时间效率。本质上,我想进入搜索树,增加每次迭代的深度,并使用 alphaBeta 评估每个节点。在每次连续迭代中,我考虑节点的顺序将由前一次迭代中节点的启发式值决定。但是,我无法理解这将如何实现。有人可以提供伪代码来说明标准 alphaBeta 程序如何适应使用迭代深化进行搜索吗?谢谢!

【问题讨论】:

    标签: java minimax alpha-beta-pruning iterative-deepening


    【解决方案1】:

    嗯,Iterative Deepening 实现起来并不难。如果你已经有一个函数来执行搜索,我们就叫它alphaBetaAtRoot,它执行一个固定距离的搜索,你只需重复调用它,从距离1开始:

    for(int distance = 1; distance < MAX_DISTANCE && !outOfTime(); distance++) {
      bestmove = alphaBetaAtRoot(position, distance);
    }
    play(bestmove);
    

    不过,重要的是您实现了Transposition Table。否则,您将无法从更好的移动排序中受益,因为每次搜索都将从零知识开始。

    【讨论】:

    • 谢谢!我没有意识到转置表的必要性。我已经阅读了更多内容,这对我很有帮助。
    • 我不确定这有多好用,因为距离每增加一次,你就会再次搜索之前的深度。例如,在距离 1 处搜索完所有内容后,您必须在深度 2 处搜索之前再次研究距离处的所有内容。
    • @DavidChopin 这是两个观察的结合:首先,移动顺序非常重要。从最好的移动开始可以节省搜索树的重要部分。其次,随着搜索树随着搜索深度呈指数增长,研究似乎减少了开销。最后,您需要再次搜索的树比最高级别的树要小得多。
    • 啊,好点子。在搜索给定深度之后,我们可以修剪更多的兄弟节点,以便在我想的更深的深度进行任何后续搜索。
    【解决方案2】:

    我找到了以下链接:https://github.com/nealyoung/CS171/blob/master/AI.java 希望对你有帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 2021-06-04
    • 2015-07-11
    • 2021-12-09
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多