第四章 切捨樹演算法
第一節 對局樹的搜尋演算法
對局樹的搜尋在人工智慧的領域中扮演著非常重要的角色,相當於一個程式
的大腦,思索著一個問題的解答。對於簡易的小遊戲(例如人工智慧裡常常提到的
井字遊戲)而言,目前的電腦速度絕對可以直接搜尋整個對局樹,列舉所有的狀態
以求得最佳的著手,但對於象棋或是西洋棋來說,已無法在有限的時間、有限的
空間內以暴力法窮舉所有狀態,以求得最佳解答,是以大多運用搜尋的技術,來
達成需求。
MiniMax Search:
由象棋知識庫本身所儲存的審局評估分數當作資訊,按照分數的大小而有所
排序。當對局樹全部展開後,由葉節點開始,雙方都會選擇對自己擁有最佳分數
的著手,並替對方設想所有可能採取的方案,反覆直到根節點時,即為最佳路徑。
如下圖 4-1 粗線的部份為最佳路徑:
圖 4-1 MiniMax Search Tree
NegaMax Search:
在搜尋 MiniMax Search 時,會有必須交替選擇最大及最小值的困難,因此加上負
號,使得在搜尋對方走步時也以最大值來看,則搜尋對局樹就只需搜尋最大值即
可,也可方便程式上的編寫。如下圖 4-2:
圖 4-2 NegaMax Search Tree
Alpha-Beta Search:
MiniMax Search 採行深度優先(depth first)的搜尋方式,在奇數層要選最大值,偶
數層選最小值。當奇數層節點的 Alpha 值已經大於其子節點的 Beta 值時,就不可
能選擇這個子節點的著手,所以就可以不用展開此節點,這個技巧稱為 Alpha 切
割,相對的當偶數層的 Beta 值已經小於其子節點的 Alpha 值時,就可以不用展開
此節點,稱為 Beta 切割。對於 MiniMax Search 而言,子節點的展開順序並不重
要,但對 Alpha-Beta 來說,越能先展開較好的子節點,就越能刪除更多的節點。
如下圖 4-3:
圖 4-3 Alpha-Beta Search Tree
第二節 切捨樹演算法
象棋是屬於二人對局零和、完整訊息的遊戲,兩人對局的遊戲中,玩家會分
所謂的先、後手去對奕,我們採用 Perfect Ordered Tree 去分析,所謂 Perfect Ordered
Tree 即在展開搜尋樹時,能夠確定那一個節點為最好的著手,而其它著手並不需
要判定[15、26]。將 Perfect Ordered Tree 的節點分為三種類型,其樹狀可以如下
圖 4-4 來表示:
。B節點:對局樹中的根節點或是B或O節點之子節點中最佳著手的節點。
。O節點:B節點之子代節點中除了最佳著手節點以外的其餘子節點。
。D節點:可被刪除的節點,也就是O節點之子代節點中除了最佳著手節點以外的
其餘子節點,以及D節點下的所有子節點。
圖 4-4 Perfect Order Tree 的三類節點
建立 Perfect Ordered Tree 時,必須要事先設法找出最佳的子節點,以便作為
排序的依據,而何謂最佳的子節點,將於本章第三節中詳細討論其對策。以下二
圖 4-5、4-6 分別為原先審局後的節點樹及以審局分數當主要排序依據的 Perfect
Ordered Tree。
圖 4-5 原先的 Tree
圖 4-6 Perfect Ordered Tree
在對奕時,電腦象棋程式若不以隨機亂數去挑選開局走法的前題下,則會有
個固定開局走步的演算法,下面分別由電腦方及人類方執紅先下的對局樹,粗線
的部份為可能走的着手,細線的部份為不可能走的著手但在原開局庫中有儲存的
棋步。
圖 4-7 由電腦方執紅先下的對局樹
圖 4-8 由人類方執紅先下的對局樹
由於人類方(我們也可視為敵方)的走步電腦方只能做猜測,所以在對局樹
中,凡是輪到人類方走步,我們就把開局庫中儲存的所有下一手走步都留下來,
以符合原先開局知識庫的用意,避免過早的脫譜。將其簡單以樹狀表示如下圖來
表示兩方各下兩到三手的對局樹。
圖 4-9 兩方各下兩到三手的對局樹
將上圖 4-9 兩個對局樹以不論電腦方先下或是人類方先下合併後,即為下圖
4-10。
圖 4-10 合併電腦方及人類方各自執先的對局樹
下圖 4-11 為舉例說明審局過後的開局知識庫,在不論那方先下的情況下所有
可能的走步,我們稱為合併對局樹。
圖 4-11 合併對局樹
由上圖 4-11 我們可以看到合併對局樹會留有細線的部份,主要是因為我方電
腦的開局演算法只會固定走分數最高的那步,其它的走法均不會走到,所以細線
的部份為不需要記錄留下來的節點。以 Perfect Ordered Tree 的三類節點來看,上
圖 4-11 細線的部份即是下圖 4-12Perfect Ordered Tree 的 D 類節點。
圖 4-12 Perfect Ordered Tree
圖 4-13 Perfect Ordered Tree(刪除了 D 類節點)
圖 4-14 切捨樹
最後所得的 Perfect Ordered Tree(刪除了 D 類節點),我們稱之為切捨樹(cutoff
Tree)。其運作的流程圖如下:
讀入一個節點
父節點是否為B
把自己標記為O
是否為相同父親 的最佳子走步
改標記為B yes
yes
父節點是否為O no
把自己標記為D
是否為相同父親 的最佳子走步
改標記為B yes
yes
no
把自己標記為D B:代表為此代的最佳節點
O:除了最佳節點以外的節點 D:代表可被刪除的節點
no no
後代節點數
>門檻值
yes no
後代節點數
>門檻值 改標記為D
no
yes
結束這個節 點的標記
圖 4-15 切捨樹的流程圖
第三節 最佳子節點
以下將探討一般最佳子節點的判斷,可以依審局函數去評斷盤面所给的分數
高低來當依據,但這就牽涉到了審局函數的準確度精不精準的問題。而另一種方
案,採用其走步的後代子節點數數量之大小來當依據,遇到在開局的階段,有人
故意走冷門的開局,那結果往往對我們比較不利。甚至若出現如下圖的情況,一
邊是後代節點數目較多,一邊為勝局數較多,那該如何去做最佳節點的選擇?
圖 4-16 (甲)後代節點數較多
上圖 4-16 (甲)若紅方走炮八平六,則獲得資訊為:後代節點數有 9506 盤,
紅方勝局數 31 盤,黑方勝局數 34 盤,雙方和局數 28 盤。
圖 4-17 (乙)勝局數較多
上圖 4-17 (乙)若紅方不走炮八平六,改走車二進四,則獲得資訊為:後代節
點數有 8204 盤,紅方勝局數 158 盤,黑方勝局數 102 盤,雙方和局數 187 盤。
這邊我們建議以能平衡後代節點數量之比率跟勝局數的勝率權重來選擇最
佳子節點較為恰當。亦即:
勝率權重 weight=
DrawCnt LoseCnt
WinCnt
DrawCnt
* 0.5 WinCnt
+ +
+
(其中 WinCnt=勝局數,LostCnt=輸局數,DrawCnt=和局數)
後代節點數量之比率 Branch_ratio=自己後代的節點數/父節點的後代節點數
=>最佳子節點為 Max{ Branch_ratio*weight }
採用以後代節點數量之比率乘上紅方(或黑方)的勝率權重 weight 來評估最佳
子節點,並且設定一個門檻值,當此後代節點數小於此門檻值或總局數
(WinCnt+LoseCnt+DrawCnt)小於某一數值時,我們也把它標記為 D 以便捨棄,這
樣就比較能維持我們的開局棋力之水準。