MinMax 树 - 当 Min 可以分两步获胜时

Posted

技术标签:

【中文标题】MinMax 树 - 当 Min 可以分两步获胜时【英文标题】:MinMax trees - when Min can win in two steps 【发布时间】:2012-01-06 17:40:15 【问题描述】:

所以,我一直在玩最小最大树,以在两人棋盘游戏中创建一个简单的计算机玩家。我了解算法的基础知识,但有一个案例让我的火鸡大脑无法理解……当 MIN 可以分两步获胜时会发生什么?

例如,假设一个四连击/井字游戏类型的游戏,其中只有两个玩家中的一个可以拥有一个方格。如何让 MAX 占据一个方格仅仅是为了防止 MIN 获得方格?

让我们尝试一个简化的示例(以漂亮的 ASCII 艺术显示),其中选项是左和右。假设他的树太大而无法一直遍历到终端状态,所以中间值是根据启发式函数计算的(下面用 * 标记)。 -INF 是 MIN 获胜的最终状态。

                MAX (a)             
                /   \
               A     B
              /       \
           MIN (b)    MIN (c)     
           /  \       /  \
          A    B     A    B
         /     |     |     \
      -INF    *5    *22    *20

MIN 将选择状态 (b) 中的动作 A,得分为 -INF MIN 将选择状态 (c) 中的动作 B,得分为 +20 MAX 将选择状态 (a) 中的动作 B,得分为 +20

当然,问题是如果 MAX 选择 B,那么 MIN 将执行操作 A(因为该方块仍然可用),因此 MIN 将获胜。我需要让MAX来实现在状态(a)中选择动作A的价值,以防止MIN在下一步中得到-INF。

我会在代码中进行大量测试以检查 MIN 是否可以获胜,但在我看来,算法应该解决这个问题。我认为我在确定导致此问题的 MAX 值时遗漏了一部分。

(编辑澄清)

【问题讨论】:

【参考方案1】:

极小极大树中的每个节点都是一个完整的游戏状态。当玩家选择一个动作时,游戏进入该状态,限制两个玩家的动作(无法从另一个分支中选择另一个动作)。因此,在您的示例中,如果处于状态 (a) 的玩家 Max 选择动作 B,则游戏现在处于状态 C。此时最小玩家的唯一两个选择是 A(22) 和 B(20)。树的深度无关紧要;最大和最小玩家总是会从游戏的当前状态中选择他们最好的动作。

对于井字游戏,每个状态都需要是一个完整的棋盘(当然可行)。例如,第一层将是 X 可以放置其标记的每个可能位置。然后这些状态的每个子​​状态将是 O 可以放置的每个可能的位置,给定父状态(X 放置的位置),等等...

当您无法表示整个博弈树(例如,国际象棋)时,启发式很有帮助,但不要改变极小极大树的使用方式。

【讨论】:

【参考方案2】:

如果认为问题出在启发式函数上。如你所说,如果MAX在状态(a)中选择B,

MIN 将执行操作 A(因为该方块仍然可用),因此 MIN 将获胜

但是在树上你用 *22 标记它而不是 -Inf 应该是(MIN 获胜)。

【讨论】:

我不明白的一件事:如果 MAX 在状态 (a) 中选择 A,是否允许 MIN 在状态 (b) 中选择 A(正如您所说,A 在一个位置上,它不是t 不再可用)。

以上是关于MinMax 树 - 当 Min 可以分两步获胜时的主要内容,如果未能解决你的问题,请参考以下文章

仅当 min 位于数组的较低索引位置时才使用 .minmax 返回值

min25筛

地暖分水器开关上的minmax是啥意思啊

html 分两步创建站点地图

SQL order by 分两步

std::minmax使用的注意事项