第二章 相關文獻及基礎理論
第一節 Min-Max 搜尋演算法
下棋之決策過程都可以視為一顆決策樹,透過樹狀搜尋尋找對雙方都可以滿
意的下法。而這個算法稱為“最小-最大搜索”(Min-max Search)。最先由 John von
Neumann 完整描述[14]:
1. 假設能對棋局評分,來評估我方和敵手的勝負或者是和棋。正分代
表我方優勢,負分代表對方優勢,零分代表雙方持平。
2. 我方的任務是盡量提昇棋局的分數。
3. 敵方的任務是盡量減少棋局的分數。
4. 假設雙方都選擇最有利的著法。
假設有一簡單的遊戲如圖一:
圖一 一個簡單的遊戲樹
那麼在這遊戲中,雖然我方如果走著法 A 最高評分有 12 分,但敵方必然
不會選擇著法 C 而選擇對他最有利的著法 D,使得評分變為-2 分。所以,在這
著法則為 E,達到雙方都比較滿意的局面。
第二節 Alpha-Beta 搜尋演算法
Min-Max 搜尋演算法常伴隨著搜尋層數加深,而出現搜尋節點指數暴漲的
情形,以象棋來說,一般中局盤面平均有 35 種走法,如果搜尋 8 層大約要搜尋
150 萬個節點,搜尋 9 層大約要搜尋 5000 萬個節點。這樣的搜尋數量實在太大,
幸好 Alpha-beta 搜尋法的出現,在不犧牲精確度的情況下,還能大量減少搜尋節
點數。
Alpha-beta 搜尋法[5]精神在於修剪去除不影響雙方作最佳決策的分支,透過 搜尋所得到的結果限制下邊界 Alpha 及上邊界 Beta 的範圍,如果其後的搜尋發
現某些子樹並不會影響到搜尋結果,也就是不落在 Alpha 與 Beta 的區間內,那
我們便將其切捨(cut off)。如圖二,我們只要搜尋到 A21 就可以知道 A22 和 A23
其分數不論是多少,都不會影響到雙方的最佳決策。
圖二 alpha-beta 搜尋
第三節 NegaScout 搜尋演算法
上述的 Alpha-Beta 演算法中,上邊界 Beta 及下邊界 Alpha 所圍成的範圍,
我們稱之為一個搜尋窗口,如果搜尋的窗口越小,其發生剪裁的機會越大,搜尋
速度也就越快,此外走法的排序也影響到剪裁的機率,也就是說如果我們能夠優
先搜尋到好的走法,就越能剪裁掉後面不好的走法。所以 NegaScout 搜尋演算法
[11]就針對這兩個影響 Alpha-Beta 搜尋剪裁的重要因素進行改良,其假設,第一
個搜尋的走法通常都是最好的走法,所以第一個展開的子節點使用正常的
(alpha,beta)窗口展開,其餘子節點使用(beta-1,beta)的窗口展開,因為不可能有分
數介於 beta-1 與 beta 之間,所以此窗口又稱為零窗口,這個作法的巧妙之處在
於,當我們只要搜尋完第一個我們認為最好的走法,接下來的零窗口加速搜尋,
雖然無法得到正確的分數,但我們只要知道其分數是大於等於 beta,則我們就可
以將其剪裁,但若零窗口搜尋後的分數不是大於等於 beta,則代表我們的假設錯
誤,必須重新以(alpha,beta)窗口展開,以得到正確的分數。
第四節 疊代加深搜尋(iterative deepening)
好的走法排序可以增加 Alpha-beta 搜尋法的切捨,那如果我們正要搜尋第 D
層,最理想的走法排序當然可以事後用第 D 層搜尋後的結果得知,但在搜尋之
前,拿 D-1 層搜尋後的最佳走法排序來代替,是不是也是不錯的選擇呢?疊代加
深搜尋[7]使得這想法變為可能。
由於在固定時間內,我們無法得知可以搜尋多深,而疊代加深法每次搜尋完
一層如果還有足夠的剩餘時間,便會往下加深搜尋一層,直到時間用盡,且淺一
層的搜尋結果排列得到的走法順序,可以在深一層搜尋時使用,如此可以產生比
較大量的切捨,比單純使用 Alpha-beta 搜尋法迅速很多,且同形表的利用,使得
重複搜尋淺層的部分幾乎不費任何力氣。
第五節 寧靜搜尋(quiescence search)
如果搜尋時間用盡,在最後一層發生兌子的情形,我們常常會誤以為吃子方 佔優,但事實常不是如此。譬如說我方搜尋八層之後時間用盡,我方在第八層用
車吃兵,則我們認為局勢稍稍佔優,但隨後對手第九層應法可能是馬吃車,造成
我方局勢大不利,這都是我方對於兌子盤面看得不夠深造成的,我們稱之為水平
效應(horizontal effect)。
為了解決這問題,有人提出寧靜搜尋法(quiescence search)[4],針對兌子盤面
和解將盤面作出延伸搜尋。把盤面延伸直到平靜沒有吃子或叫將的平靜盤面才停
止往下搜尋,好讓我們能比較正確地評估盤面分數。
第六節 向前切捨法(forward pruning)
為了加速搜尋速度,因而出現了向前切捨法(Forward Pruning),其精神
在於使用一些方法判定某些較無益的分支,然後將其切捨來提高搜尋速度,
但這些方法如: 剃刀切捨(Razoring)和無益切捨(Futility Pruning)[10],常伴隨
著很大的風險,直到 1989 年 Beal 提出一個更有效的方法,那就是空步搜尋
(Null move)[3]。
第七節 空步搜尋(null move)
現在頂尖的象棋軟體幾乎都使用空步搜尋來加速,空步搜尋法錯誤! 找不到
參照來源。的前提在於假設多走了一步棋會比不走棋有更高的分數,所以當輪自
己走步時,自己不動子,相當於允許對方連走兩步做淺層搜尋,如果這樣還無法
使情況變成讓對方更為有利,便不用再多花時間搜尋。
雖然空步搜尋法所承擔的風險較小,但仍受水平效應與將軍盤面影響,所以
只有在搜尋深度夠深且非處在將軍盤面時使用較為安全。還有一種情形會造成空
步搜尋誤判,就是違背前提:也就是走子後評估值比走子前還低。這樣的情況被
稱為被迫走步盤面,多發生於殘局時,因此在殘局大多不使用空步搜尋。
第八節 適應性空步剪裁(adaptive null move)
Ernst Heinz 在 1999 提出一種作法[9],依據不同的搜尋深度決定空步剪裁淺 層搜尋的深度,因為空步剪裁淺層搜尋時,有個淺層搜尋因子 R 決定其淺層搜
尋深度;若原本搜尋深度為 D,則空步淺層搜尋深度則為 D-R-1,R 值越大空步
搜尋時越快,不過伴隨的水平效應也就越大;根據西洋棋大量測試結果發現 R=2
時,空步搜尋有較好的效果,但 R=3 時增快的搜尋速度又是如此吸引人,所以
仍有不少人冒險使用 R=3。Ernst Heinz 嘗試在深度小於等於 6 時,使用 R=2 的
空步剪裁,在深度大於 8 時,使用 R=3 的空步剪裁,在深度等於 7 或 8 時,且
擁有棋子個數大於等於 3 個,則使用 R=3,否則使用 R=2;而這樣的嘗試根據
Ernst Heinz 實驗後也得到不錯的效果。
第九節 帶驗證的空步剪裁
而後 Tabibi 在 2002 年提出更好的策略改進空步剪裁[13],不但使得搜尋節 點更少,且更重要的是在被迫走步的盤面還能使用空步搜尋,使得棋力也有不少
提升。
其作法在於,使用淺層搜尋因子 R=3,以增加空步剪裁搜尋速度,但如果搜
尋結果為大於等於 beta,則我們再做比原本搜尋深度少一的驗證搜尋一次,看是
否能採信之前淺層搜尋的結果。如果不能採信,則仍必須作完整搜尋。整體來看,
雖然驗證是額外的時間負擔,但其省下的搜尋節點數,還有提升空步剪裁的正確
性來看,都彌補了這些額外的時間花費。