alpha-beta剪枝的程式碼實現
阿新 • • 發佈:2019-02-03
之前在極大化極小演算法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我們在此虛擬碼的基礎上新增alpha-beta剪枝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
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節點,而且該圖例中展示了多個子節點的情況和不能成功剪枝的情況,值得參考