看本章之前,請先參看前一篇文章《minimax演算法及例項分析》
由於minimax演算法有乙個很大的問題就是計算複雜性。由於所需搜尋的節點數隨最大深度呈指數膨脹,而演算法的效果往往和深度相關,因此這極大限制了演算法的效果。
alpha-beta剪枝是對minimax的補充和改進。採用alpha-beta剪枝後,我們可不必構造和搜尋最大深度d內的所有節點,在構造過程中,如果發現當前格局再往下不能找到更好的解,我們就停止在這個格局及以下的搜尋,也就是剪枝。
alpha-beta演算法可以看成變種的minimax,基本方法是從根節點開始採用深度優先的方式構造格局樹,在構造每個節點時,都會讀取此節點的alpha和beta兩個值,其中alpha表示搜尋到當前節點時已知的最好選擇的下界,而beta表示從這個節點往下搜尋最壞結局的上界。由於我們假設對手會將局勢引入最壞結局之一,因此當beta小於alpha時,表示從此處開始不論最終結局是哪乙個,其上限價值也要低於已知的最優解,也就是說已經不可能此處向下找到更好的解,所以就會剪枝。
下面同樣以上述示例介紹alpha-beta剪枝演算法的工作原理。我們從根節點開始,詳述使用alpha-beta的每乙個步驟:
根節點的alpha和beta分別被初始化為−∞
,和+∞
。深度優先搜尋第乙個孩子,不是葉子節點,所以alpha和beta繼承自父節點,分別為−∞
,和+∞
搜尋第三層的第乙個孩子,同上。
搜尋第四層,到達葉子節點,採用評價函式得到此節點的評價值為1。
此葉節點的父節點為max節點,因此更新其alpha值為1,表示此節點取值的下界為1。
再看另外乙個子節點,值為20,大於當前alpha值,因此將alpha值更新為20。
此時第三層最左節點所有子樹搜尋完畢,作為max節點,更新其真實值為當前alpha值:20。
由於其父節點(第二層最左節點)為min節點,因此更新其父節點beta值為20,表示這個節點取值最多為20。
搜尋第二層最左節點的第二個孩子及其子樹,按上述邏輯,得到值為50(注意第二層最左節點的beta值要傳遞給孩子)。由於50大於20,不更新min節點的beta值。
搜尋第二層最左節點的第三個孩子。當看完第乙個葉子節點後,發現第三個孩子的alpha=beta,此時表示這個節點下不會再有更好解,於是剪枝。
在c分支搜尋時遇到了與b分支相同的情況。因此講c分支剪枝。
此時搜尋全部完畢,而我們也得到了這一步的策略:應該走a分支。
可以看到相比普通minimax要搜尋18個葉子節點相比,這裡只搜尋了9個。採用alpha-beta剪枝,可以在相同時間內加大minimax的搜尋深度,因此可以獲得更好的效果。並且alpha-beta的解和普通minimax的解是一致的。
Alpha beta剪枝演算法例項分析
原帖 看本章之前,請先參看前一篇文章 minimax演算法及例項分析 由於minimax演算法有乙個很大的問題就是計算複雜性。由於所需搜尋的節點數隨最大深度呈指數膨脹,而演算法的效果往往和深度相關,因此這極大限制了演算法的效果。alpha beta剪枝是對minimax的補充和改進。採用alpha ...
Alpha beta剪枝演算法例項分析
看本章之前,請先參看前一篇文章 minimax演算法及例項分析 由於minimax演算法有乙個很大的問題就是計算複雜性。由於所需搜尋的節點數隨最大深度呈指數膨脹,而演算法的效果往往和深度相關,因此這極大限制了演算法的效果。alpha beta剪枝是對minimax的補充和改進。採用alpha bet...
AlphaBeta剪枝演算法
關於alphabeta剪枝的文章太多,這個方法是所有其它搜尋方法的基礎,得多花些時間認真地理解。先把基本概念再回顧一遍 節點 在中國象棋中就是乙個棋盤的當前局面board,當然該輪到誰走棋也是確定的。這裡的圓形節點表示終止節點,在中國象棋裡就是一方被將死的情況 或者到達了搜尋的最大深度 後續不會再有...