1. 程式人生 > >例析Alpha-Beta剪枝

例析Alpha-Beta剪枝

本文使用三子棋問題簡單描述Alpha-Beta剪枝的原理。順序是:先描述三子棋問題,接著描述三子棋問題的極小極大演算法,最後描述三子棋問題的Alpha-Beta剪枝演算法。

對三子棋問題描述如下:

下棋的一方是計算機(記為“MAX",執棋子“X”),另一方是人(記為”MIN“,執棋子“O”);

機器先手,雙方輪流在九宮格中落子;

先取得三子一線的一方勝,可以是橫向、豎向、主對角線方向或次對角線方向;

要求設計一個演算法,為計算機找到最佳的走法。

評分函式(靜態估計函式):

為了選出最佳的走法,須要量化棋局對於我方的優勢,以便對可能的走法產生的後續棋局進行分析比較。為此,定義一個對棋局p的評分函式 f(p):

若p對於任何一方都不是獲勝的棋局,則

f(p) = (將p中所有空格都放上MAX的棋子後,MAX三子成線的總數) — (將p中所有空格都放上MIN的棋子後,MIN三子成線的總數)。

極小極大演算法描述如下:

1. 以空棋局為根節點,以某個棋局1步後的棋局的該棋局節點的子節點,廣度優先生成一棵博弈樹。然後從樹根開始輪流給每層結點賦予MAX和MIN的稱號。(本文限定博弈樹的深度為3,即只分析雙方各下一子的情況。)

2. 使用評分函式 f(p) 計算各個葉子節點分值。

3. 當葉子節點的分值計算出來後,再逆層向推算出各層非葉子節點的得分。推算的方法是:對於處於MAX層的節點,選其子節點中一個最大的得分作為該節點的得分,這是為了使自己在可供選擇的方案中選一個對自己最有利的方案;對處於MIN層的節點,選其子節點中一個最小的得分作為該節點的得分,這是為了立足於最壞的情況,這樣計算出的父節點的得分為倒推值。

4. 如此反推至根節點下的第一層孩子,如果其中某個孩子能獲得在其兄弟節點中最大的倒推值,則它就是當前棋局最佳的走法。

下圖描述了三子棋問題第一階段的極小極大演算法。節點右上角的值為其非葉子節點的倒推得分。


這樣的極小極大演算法,能夠求出最佳走法,但在效率上不夠理想。計算機每次走步都得估計往下N層棋局的所有情況並估值,層數雖然可以控制,但在大棋局(如五子棋,象棋等)遊戲中如此生成的博弈樹分支葉子相當龐大,由此有了在此基礎上進行“剪枝”的改進演算法–Alpha-Beta剪枝演算法。此演算法主要優點在於其在邊生成博弈樹時候邊計算評估各節點的倒推值,並且根據評估出的倒推值範圍,及時停止擴充套件那些已無必要再擴充套件的子節點,即相當於剪去了博弈樹上的一些分枝,從而節約了機器開銷,提高了搜尋效率。

Alpha-Beta剪枝演算法:(再次強調此演算法是建立在極小極大演算法之上的)

1. 對於一個MIN層節點,若能估計出其倒推值的上確界Beta,並且這個Beta值不大於其的父節點(MAX層節點)的估計倒推值的下确界Alpha,即Alpha≥Beta,則就不必再擴充套件該MIN節點的其餘子節點了,因為這些節點的估值對MIN父節點的倒推值已無任何影響了,這一過程稱為Alpha剪枝。

下圖描述了三子棋的Alpha剪枝。節點左上角符號為節點編號。


2. 對於一個MAX層節點,若能估計出其倒推值的下确界Alpha,並且這個Alpha值不小於其父節點(MIN層節點)的估計倒推值的上確界Beta,即Alpha≥Beta,則就不必再擴充套件該MAX節點的其餘子節點了,因為這些節點的估值對MAX父節點的倒推值已無任何影響了。這一過程稱為Beta剪枝。

3. 在實際的修剪過程中,Alpha、Beta的值根據當前可用的知識隨時修正,但MAX層節點的倒推值下界Alpha永不下降,且總是等於當前已確定的其子節點倒推值(估值)中最大的值;MIN層節點的倒推值上界Beta永不上升,且總是等於其子節點當前最小的最終倒推值。

下圖描述了Alpha值的更新。圖左上角標識為節點編號。極小層節點⑨估值下界Beta值為1,極大層初始節點s的估值上界Alpha隨即更新為1。


Alpha-Beta剪枝演算法與極小極大演算法的區別

極小極大演算法通過計算所有子節點的分值後得出當前節點的分值,而Alpha-Beta剪枝演算法使用某種方法估計Alpha、Beta的值,比較估得的對應Alpha、Beta值進行剪枝,減小計算量。

參考文獻:

[1]. 林堯瑞,馬少平.人工智慧導論[M].北京:清華大學出版社, 1989:118-119;

轉載於 http://blog.csdn.net/tianranhe/article/details/8301756