了解alpha-beta修剪算法中的截止条件

use*_*661 3 algorithm search artificial-intelligence alpha-beta-pruning

我无法理解我在维基百科上发现的alpha beta修剪的伪代码:

function alphabeta(node, depth, ?, ?, Player)         
    if  depth = 0 or node is a terminal node
        return the heuristic value of node
    if  Player = MaxPlayer
        for each child of node
            ? := max(?, alphabeta(child, depth-1, ?, ?, not(Player)))     
            if ? ? ?
                break (* Beta cut-off *)
        return ?
    else
        for each child of node
            ? := min(?, alphabeta(child, depth-1, ?, ?, not(Player)))     
            if ? ? ?
                break (* Alpha cut-off *)
        return ?
Run Code Online (Sandbox Code Playgroud)

令我困惑的是if Player = MaxPlayer条件.我理解整个递归调用函数not(Player)来获取最小值,然后递归调用函数Player,重复直到达到深度限制或找到目标状态.但是,我不明白

if ? ? ?
    break 
Run Code Online (Sandbox Code Playgroud)

声明.我的理解是,找到高于前一个call(?)中找到的最小值的第二个值,即使用的值.但由于这是函数的MAX部分,我们不想要HIGHEST值,而不仅仅是大于beta的任何值吗?

ami*_*mit 7

这是算法的修剪阶段,在MaxPlayer子句中(当检查此节点中播放器的最大值时):

Beta是函数的参数,即"修剪因子".它代表了迄今为止您找到的最低分数.这意味着当前节点的父节点(最小化节点)已经找到了一个beta的解决方案.

现在,如果我们继续迭代所有孩子,我们将得到至少与当前alpha一样好的东西.因为beta <= alpha- 父节点 - 最小化节点 - 永远不会选择这个alpha(或任何大于它的值) - 它将选择一个beta或更低的值 - 并且当前节点没有机会找到这样的,所以我们可以修剪计算.

例:

     MIN
    /   \
   /     \
  /       \
 /         \
5          MAX
          / | \
         /  |  \
        /   |   \
       6    8    4
Run Code Online (Sandbox Code Playgroud)

在评估MAX节点时,如果我们应用正常的最小 - 最大算法,我们将返回8.但是,我们知道MIN函数会这样做min(5, MAX(6, 8, 4)).因为在我们读完6后我们知道max(6, 8, 4) >= 6,我们可以在没有继续计算的情况下返回6,因为上层的MIN计算将是min(5, MAX(6, 8, 4)) = min(5, 6) = 5.

这是一个级别的直觉,它当然是递归地以相同的想法"流动"到所有级别.

同样的想法适用于MIN顶点中的修剪条件.