【问题标题】:What type of tree should I use for Minimax我应该为 Minimax 使用什么类型的树
【发布时间】:2015-03-05 02:21:36
【问题描述】:

我正在构建一个跳棋应用程序。

我已经开始构建 AI,并且阅读了很多关于极小极大的文章。

有些东西我不明白,我应该使用什么类型的树来构建“游戏树”(我正在用 JAVA 编程)

【问题讨论】:

  • 请注意,与二叉树、2-3 树和堆树等其他树不同,极小极大博弈树中的节点可以有任意数量的子节点,具体取决于博弈情况。这棵树由一个带有多个子节点的根节点组成,根据它们的结果,它可以再有多个子节点。以图形方式支持这一点。 commons.wikimedia.org/wiki/File:Plminmax.gif
  • 好的,谢谢,这棵树在 java 的 API 中叫什么名字?还是我应该自己构建这棵树的类?
  • 我建议您自己建造一棵树,这将使您更深入地了解树木的实际工作方式以及如何穿过树木。
  • stackoverflow.com/questions/27249304/… 的副本。您实际上不需要 minimax 的树数据结构 - 该算法遍历树,但您不需要存储它。您可以在评估节点时使用列表来存储节点的子节点。

标签: java tree artificial-intelligence minimax


【解决方案1】:

一般来说,极小极大博弈树很简单:每个节点代表一个博弈状态,并包含所有子节点的集合,这些子节点代表该状态下所有允许的移动。

这是一个可能的实现:

class Node {
    private Board state;
    private Map<Move, Node> children;
}

【讨论】:

  • 我不确定我是否理解应该如何使用它。为什么Map&lt;Move, Node&gt;
  • Node 代表一种潜在的游戏状态。 Move 表示从该状态的潜在移动。 children 映射映射了从一个状态到另一个状态的所有潜在移动。所以在国际象棋中,如果状态代表注视位置,children 会将 18 个合法的第一次移动映射到该移动之后的状态。
  • 另请注意,在许多(可能是大多数)情况下,您实际上并不需要这样的树来实现极小极大,因为您可以在计算时存储所需的状态。各种教程中有很多这样的代码示例。
【解决方案2】:

极小极大算法也可以在不显式编码博弈树的情况下实现。在每个递归步骤中,移动实际上是在游戏板的某些表示上完成的,然后再次递归调用评估,并在评估后取消移动以进行评估。这种方法的内存效率更高,因为只有所考虑的游戏树的节点被明确表示。在这种方法中,调用堆栈和游戏板表示可以一起解释为游戏树的节点迭代器。

【讨论】:

    猜你喜欢
    • 2020-07-15
    • 2022-01-18
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多