虽然我理解了MiniMax树和alpha-beta剪枝的概念,但我无法理解为什么在许多关于alpha-beta剪枝的资源中(例如维基百科)会出现α >= β这样的条件。特别是“等于”让我感到困惑。据我所知,alpha-beta剪枝会返回与minimax相同的移动,但通常速度更快。然而,这个例子似乎与之相矛盾:
. / | \ 1 3* 2 / | / \ | \ \ 1 1 5 3 4 3 2
上图是原始的min-max树。我们可以看到它会选择得分为3的移动。现在让我们进行alpha-beta剪枝:
. / | \ 1 3* 3* / | / \ | \ 1 1 5 3 4 3
它剪掉了最右边的移动,因为3 >= 3。但这样一来,算法可以在两个得分相同的移动中选择,但正如我们在min-max中看到的,右边的选择稍微差一些。如果算法只是指定α > β,就不会发生这种情况,这样它还需要搜索2这个分支。
那么,维基百科的伪代码(以及许多其他资源)中这是个打字错误吗?还是我误解了什么重要的东西?
回答:
维基百科上的算法并不返回一个移动,它返回的是根节点的得分,即3。这个得分与minimax的结果相同。你需要稍微修改算法才能得到要执行的移动而不是得分。
一种方法是针对当前状态的每个可能移动运行alphabeta函数,并选择得分最高的那个。按照维基百科上的链接,可以找到一个实现,它就是这样做的。
我认为你也可以在alphabeta函数中跟踪找到的最佳移动,但如果同一层级的多个节点有相同的得分,则返回找到的第一个。这可能更好,因为需要评估的节点更少。