我试图将Alpha Beta剪枝算法应用到给定的这棵树上。
当我处理到节点C时遇到了困难,因为在展开B的所有子节点后,我给A的值是>= -4,然后我展开C得到I = -3,这确实大于-4 (-3 >= -4)。因此,我应该将A更新为-3吗?如果是的话,之后我是否应该因为-3 >= -3而剪枝J和K?我在处理这个例子时,剪枝了J、K、M和N。我对此真的很不确定 =(
编辑:
另一个问题:在探索B并将B的值传递给A之后,我们是否将这个值传递给C,从而传递给I?我看到一个例子是这样的。这里是链接:http://web.cecs.pdx.edu/~mm/AIFall2011/alphabeta-example.pdf
然而,在这个例子中,http://web.cecs.pdx.edu/~mm/AIFall2011/alphabeta-example.pdf,似乎没有向下传递值,而是只向上传播值。我不确定哪个是正确的,或者这是否有任何区别。
回答:
在展开B
的所有子节点后,A
的α=-4, β=∞
。
当你到达I
时,α=-4, β=-3
。因为α < β
,所以J
和K
不会被剪枝。需要评估它们以确保它们不会低于-3,从而降低C
的评估值。在C
展开后,A
的值更新为α=-3, β=∞
。在评估J
时,你不能使用A
更新后的alpha值,因为它还没有被更新。
如果I
是-5,J
和K
就会被剪枝。在这种情况下,J
和K
是什么并不重要,因为我们已经知道C
的评估值比B
差,因为-5 < -4
,而J
和K
只能使情况更糟。
每个节点将其alpha和beta值传递给其子节点。子节点然后会根据轮到谁来更新它们自己的alpha或beta值,并返回该节点的最终评估值。这将用于更新父节点的alpha或beta值。
有关示例,请参见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 β// Initial callalphabeta(origin, depth, -infinity, +infinity, MaxPlayer)