带有Alpha-Beta剪枝的Minimax(回溯分析)

带有Alpha-Beta修剪的Minimax

极小极大算法是一种在两人游戏中寻找最佳移动的方法。 Alpha-beta修剪是一种找到最佳minimax解决方案的方法,同时可以避免搜索不会被选择的动作子树。在两人游戏的搜索树中,有两种节点,一种代表您的 举动,另一种代表对手的举动。

  • 代表您的移动的节点通常绘制为正方形(或可能是朝上的三角形):

    这些也称为MAX节点。MAX节点的目标是最大化以该节点为根的子树的值。为此,MAX节点选择具有最大值的子节点,该子节点成为MAX节点的值。

  • 代表对手动作的节点通常绘制为圆形(或可能绘制为向下的三角形):

    这些也称为MIN节点。MIN节点的目标是最小化以该节点为根的子树的值。为此,MIN节点选择值最小(最小)的子节点,该子节点成为MIN节点的值。

Alpha-beta修剪的名称来自计算过程中传递的两个边界,这些边界根据已经看到的搜索树部分限制了可能的解决方案集。特别地:

  • Beta是可能解决方案 的最小上限

  • Alpha是可能解决方案 的最大下限

因此,当任何新节点被视为解决方案的可能路径时,它仅在以下情况下起作用:

其中,N是节点值的当前估计。

为了可视化,我们可以使用数字线。在任何时间点,alpha和beta都是可能的解决方案值集的上下限,如下所示:

随着问题的进展,我们可以基于最小节点(可能会设置上限)和最大节点(可能会设置下限)来假设可能的解决方案范围(受到限制)。当我们在搜索树中移动时,这些界限通常会越来越近:

只要在alpha和beta范围内有一些重叠,这种收敛就不会成为问题。在评估节点的某个时刻,我们可能会发现它已经移动出了边界,从而在alpha和beta的范围之间不再有任何重叠:

至此,我们知道该节点永远不会产生我们将考虑的解决方案路径,因此我们可以停止处理该节点。换句话说,我们停止生成其子级,然后移回其父级节点。对于此节点的值,我们应该将更改后的值传递给父级,该值超出了另一个范围。为了演示带有alpha-beta修剪的minimax,我们以下面的minimax树为例:

就本minimax教程而言,此树等效于列表表示:

(  
    ((((3 17)(2 12))((15)(25 0))) 
    ((((2 5)(3))((2 14)))
 ) 

顺便说一句,如果这是现实中的极小极大问题,那么您将不会像这样预先生成所有树。如果您已经浪费了用于生成所有状态的空间以及用于在确定深度处计算所有评估值的时间,那么执行minimax的时间可以忽略不计。alpha-beta修剪是为了避免必须生成所有状态并计算所有评估函数。如果您需要一些有关alphamax-beta修剪的minimax实际版本与您的版本之间的差异的注释,请查看此链接

对于本示例,我将仅显示到目前为止已评估或当前正在评估的树的一部分。我还将描述这种行为,就好像是在生成子状态而不是遍历提供给您的树的情况一样。本着这种精神,我们试图通过向前看两个完整的动作(即我和我的对手分别的两个动作)来找到最佳的动作。因此,我们将假定一个4层深度的树,通过分析整个过程来评估状态。

在问题开始时,您只能看到当前状态(即棋盘上棋子的当前位置)。至于上限和下限,您所知道的是它是一个小于无穷大且大于负无穷大的数字。因此,这是初始情况:

相当于:

由于边界仍然包含有效范围,因此我们通过生成第一个子状态并沿当前边界集开始问题。此时,我们的搜索如下所示:

我们仍未深入到第四层,因此我们再次生成第一个子节点并传递当前的alpha和beta值:

还有一次:

当我们到达深度为4处的第一个节点时,我们在状态上运行评估函数(结点的值是通过评估函数来生成的),并获得结点值3。因此,我们有:

我们将此节点传递回上面的min节点。由于这是一个最小节点,因此我们现在知道该节点的minimax值必须小于或等于3。换句话说,我们将beta更改为3。

请注意,树中较高级别的alpha和beta值没有改变。当处理实际返回到那些节点时,它们的值将被更新。如果将来有可能再次更改这些值,则在树中传播这些值不会有任何实际收益。alpha和beta值的唯一传播是在父节点和子节点之间。如果我们在数字线上绘制alpha和beta,它们现在看起来像这样:

接下来,我们查看第四层min结点的另一个子结点,运行评估函数,并返回值17(与之前的3作比较,来判断是否要更新第四层的min结点):

由于第四层的min结点是一个最小节点,并且17大于3,因此将忽略这个17的子节点。现在我们已经看到了第四层这个min节点的所有子节点(17和3),因此我们将beta值返回到上面第三层的最大max节点。由于它是一个最大节点,我们现在知道它的值将大于或等于3,因此我们将它的alpha值更改为3:

请注意,beta值没有更改。这是因为max节点只能对下限做出限制。进一步注意,传递最小min节点中beta的最终值会更改其父级的alpha值。同样,传递最大max节点中的alpha最终值会更改其父级的beta值。在我们当前正在评估的最大节点上,数字行当前如下所示:

我们搜索第三层max结点的另一个孩子,并将边界传递给它:

由于此节点不在目标深度,因此我们搜索其第一个子节点,在该节点上运行评估函数,然后返回其值:

由于这是一个最小节点,因此我们现在知道该节点的值将小于或等于2,因此我们将beta更改为2:

现在,数字行如下所示:

从数字线可以看到,以alpha和beta为边界的区域之间不再有任何重叠。本质上,我们发现,在此节点上找到解决方案路径的唯一方法是,如果找到一个子节点,且该子节点的值都大于3且小于2。因为这是不可能的,所以我们可以停止评估此节点的子节点,然后返回beta值(2)作为该节点的值。诚然,我们不知道节点的实际值。该节点的其他子节点中某处可能有1、0或-100。但是,即使有这样一个值,对其进行搜索也无法帮助我们在搜索树中找到最佳解决方案。仅2就足以使此子树无果而终,因此我们可以修剪其他任何子树并将其返回。

这就是beta修剪的全部内容!回到父级最大节点,我们的alpha值已经是3,比2更具限制性,因此我们不会更改它。至此,我们已经看到了该第三层max节点的所有子节点,因此我们可以将其值设置为最终的alpha值:

现在我们转到第二层的父最小min节点。对于第一个子结点的值3,我们知道min节点的值必须小于或等于3,因此将beta设置为3:

现在数字线上的alpha和beta图形如下所示:

由于我们仍然有一个有效范围,因此我们继续探索下一个孩子。我们生成最大节点…

…这是第一个子min节点…

…最后是目标深度处的最大节点,沿着这条路径,我们只传递了alpha和beta边界。

至此,我们已经看到了第四级min节点的所有子节点,并且尚未更改beta值。由于尚未超出限制,因此应返回节点的实际最小值。请注意,这与我们修剪的情况不同,在这种情况下,您返回了beta值。其原因很快就会变得显而易见。

现在,我们将该值返回到第三级父最大节点。基于此值,我们知道此最大节点的值将为15或更大,因此我们将alpha设置为15:

现在数字线上的alpha和beta图形如下所示:

Alpha和Beta边界再次越过,因此我们可以修剪该节点的其余子节点,并返回超出边界(即15)的值。请注意,如果我们返回了子min节点的beta值(3)而不是实际值(15),那么我们将无法在此处修剪。

现在第二层父级min节点已经看到了所有子级,因此可以选择其子级的最小值(3)并返回。

最后,我们完成了根最大节点的第一个孩子。现在我们知道解决方案至少为3,因此我们将alpha值设置为3,然后继续第二个子级。

沿途传递alpha和beta值,我们生成根节点的第二个子节点…

…及其第一个孩子…

…及其第一个孩子…

…及其第一个孩子。现在我们处于目标深度,因此我们调用评估函数并得到2:

最小节点父级使用此值将其beta值设置为2:

现在数字线上的alpha和beta图形如下所示:

我们再次可以修剪此节点的其他子节点,并返回超出界限的值。由于此值不大于父max节点的alpha边界,因此我们不会更改边界。

从这里,我们生成max节点的下一个子节点:

然后我们生成它的子对象,该子对象位于目标深度。我们调用评估函数并获得其值为3。

父min节点使用此值将其上限(beta)设置为3:

此时,alpha和beta的数字线图如下所示:

换句话说,此时alpha = beta。我们应该在这里修剪吗?我们实际上并没有超出界限,但是由于alpha和beta相等,因此我们知道在此子树中我们并不能做得更好。答案是肯定的,我们应该修剪。原因是,即使我们不能做得更好,也可能会做得更糟。请记住,minimax的任务是找到在顶层max节点表示的状态下进行的最佳移动。 碰巧我们已经完成了该节点的子节点,所以我们返回最小值3。

上面的max节点现在已经看到了所有子节点,因此它返回已看到的所有子节点的最大值,即3。

该值返回其父min节点,该父min节点的新上限为3,因此将beta设置为3:

现在数字线上的alpha和beta图形如下所示:

再次,我们处于将alpha和beta绑定在一起的位置,因此我们要修剪。 请注意,一个真正的解决方案不仅指示数字,而且导致该数字的变化。如果要在示例开头给出的列表版本上运行minimax,则minimax将返回3的值,并且将检查6个终端节点。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值