1. 程式人生 > >alpha-beta剪枝的程式碼實現

alpha-beta剪枝的程式碼實現

之前在極大化極小演算法minimax說得不夠清楚而且也沒有附帶虛擬碼,所以這裡再寫一篇專門關於剪枝的blog進行補充

http://blog.csdn.net/joshualiunsw/article/details/52131507

————————————————————————————————————————————————

現在已經有了普通的minimax的虛擬碼, 由於下文中需要用到α, β所以對應地將其轉換成a(alpha)、b(beta)的形式

functionminimax(node, depth)
if node is a terminal node or depth = 0
        return
the heuristic value of node if the adversary is to play at node let b := +foreach child of node b := min(a, minimax(child, depth-1)) return b else {we are to play at node} let a := -foreach child of node a := max(b, minimax
(child, depth-1)) return a
我們在此虛擬碼的基礎上新增alpha-beta剪枝
functionminimax(node, depth, a, b)
if node is a terminal node or depth = 0
        return the heuristic value of node
    if the adversary is to play at node
        //let b := +
        foreach child of node
            b := min(a, minimax
(child, depth-1, a, b)) if b <= a return b  return b else {we are to play at node} //let a := - foreach child of node a := max(b, minimax(child, depth-1, a, b))
            if a >= b 
                  return a
 return a 其實上述新增的兩個if語句的條件判斷是完全一樣的,因為根據原理在min節點只能修改beta,而在max節點只能修改alpha,這樣寫只是為了讓結構更為清晰。

下面再引用Alan Blair博士的圖例來說明這個優化的過程,他的繪圖規則我認為是比較清易懂的,特別是三角和倒三角的使用,能清晰地展示當前節點是min還是max節點,而且該圖例中展示了多個子節點的情況和不能成功剪枝的情況,值得參考