極大極小樹的剪枝演算法1 alpha-beta剪枝
Alpha-Beta 剪枝演算法用於減小極大極小演算法所搜尋的節點數目,Alpha-Beta 剪枝演算法的效率很大依賴於節點的排列,在理想的排序下,演算法複雜度為O(b^(d/2)),可以使搜尋節點的數量減小一半,從而使在相同時間下的搜尋深度增加一倍。在隨機排序下,演算法複雜度平均為O(b^(d*3/4))
演算法使用了兩個值,分別為alpha和beta,分別代表最佳得分的最小下界和最大上界,最初alpha,beta被設為無窮大和無窮小,隨著搜尋的進行,這個上界和下界逐漸收斂。
1) 任何max節點的alpha值大於其父節點的beta值,則把該節點剩餘的枝剪去,因為這說明在該節點之前至少有一個節點的alpha值比它的上界要小,而父節點
2) 同理任何min節點的beta值小於其父節點的alpha值,則把該節點剩餘的枝剪去。
下面引用一個wiki上的例子
上圖中第4層的4 beta = 4 比 其父節點的 alpha值5要小,所以將其剩餘的枝剪去
下面是演算法的虛擬碼
下面是其更簡潔的negaMax形式alphaBeta(node,alpha,beta,depth,player) if (depth = 0) return valuation(player)呼叫估值函式 else if (player = maxplayer) foreach child of node value :=alphaBeta(child,depth-1,alpha,beta,minplayer) if(value>alpha)alpha:=value if(alpha>=beta)break return alpha else foreach child of node value :=alphaBeta(child,depth-1,alpha,beta,maxplayer) if(value<beta)beta:=value if(alpha>=beta)break return beta
negaAlphabeta(node,alpha,beta,depth)
if (depth = 0)
return valuation()呼叫估值函式
else
foreach child of node
value :=-negaAlphabeta(child,depth-1,-beta,-alpha)
if(value>alpha)alpha:=value
if(alpha>=beta)break
return alpha
使用時將alpha beta初始值設為-∞和+∞