【问题标题】:Minimax Alpha Beta AlgorithmMinimax Alpha Beta 算法
【发布时间】:2016-02-12 14:42:44
【问题描述】:

我想我终于了解了极小值和 Alpha beta 修剪,但实施它是另一回事!

据我了解,基础是: 您将启发式函数分数分配给某些动作(以 Gomoku 为例)。

  • 如果连续有 5 个,我们应该分配一个高值,例如 9999,因为 这是一个成功的举动。
  • 如果我们连续有 4 个,我们有两个开口端 我们应该再次分配一个高值,因为不可能阻塞 这个动作等等等等

当我们实际上必须在 Java 中实现它时,我的问题就出现了!

我有一个 Color [][] 棋盘 (8x8),其中黑色是玩家 1,白色是玩家 2,null 表示空白,我不知道该怎么做

  1. 在棋盘上搜索以查找对手的动作并分配值 给他们
  2. 在棋盘上搜索以找到我的移动并将值分配给 他们
  3. 然后选择最好的移动(我认为我可以做到 如果我知道前两个是如何工作的,因为这基本上是 算法)。

感谢您的帮助和指导!我查看了来自各种在线资源的 YouTube 教程和讲义,但在实际编写代码时,它们对我来说都没有真正意义。

如果有影响的话,游戏就是在 8x8 棋盘上玩五子棋

【问题讨论】:

    标签: java algorithm minimax alpha-beta-pruning


    【解决方案1】:

    定义状态

    首先你必须定义游戏的状态。在您的示例中,它将是表示电路板配置的二维数组。

    创建一个存储游戏配置和棋盘状态的 java 类。此类现在将成为您的极小极大树的节点。

    定义子节点

    定义极小极大树的节点后,您必须根据游戏规则定义子节点。这代表你的动作。

    有了这个,你就有了极小极大树!

    在棋盘上搜索对手的动作并为其赋值

    为分配每个板配置的值,将其存储在类本身中。此外,您不必在棋盘上搜索反对动作,因为它由您的孩子代表。 [请注意,板与每个类一起存储]

    在棋盘上搜索我的动作并为它们赋值

    同样,如果给定的类代表玩家 1 的动作,那么 children 代表玩家 2 的动作。

    然后选择最好的移动

    这是由算法定义的。如果您在最大节点中,则选择对应于最大值的移动。即您选择价值最高的孩子。
    在 min 节点的情况下,您选择最小值的子节点。

    PS:您不必事先定义整个极小极大树。它可以在做 dfs 时动态创建。这将显着减少内存。

    PPS:详情请参阅Chess Programming

    【讨论】:

    • 当您说存储游戏配置时,您的意思是存储棋盘上的哪些棋子?
    • 是的,您可以存储棋盘上的棋子。我所说的游戏配置是指可以在任何时候描述游戏状态的东西。您可以存储每个玩家的得分、特征值(如 5 行等)。
    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多