• 沒有找到結果。

最佳路徑的獲取

在文檔中 電腦暗棋之設計及實作 (頁 44-53)

第三章 搜尋演算法

第十節 最佳路徑的獲取

當我們對一個盤面進行搜尋完成之後,除了要得到準確的分數外,對於最佳

路徑的獲取也是很關心的。例如圖3-24,輪黑方走,進行 6 層的搜尋:

圖3-24 路徑獲取示意圖

當搜尋路徑為:B3-A3,H1-G1,A3-A4,G1-F1,A4-H4 吃仕,F1-E1,總共走了

6 步後,黑方可以得到 270 分(吃掉一隻紅仕的分數)。而當搜尋路徑為:B3-B4,

H1-G1,B4-H4 吃仕,G1-F1,G3-G2,F1-E1,黑方也一樣可以得吃掉一隻紅仕

的分數。而在實戰中,因為黑方先嘗試展開B3-A3 這條路徑,所以它走了 B3-A3

以為可以吃到紅仕,如圖:3-25,輪紅方走,而紅方走了 H1-G1 後如圖 3-26,又

輪到黑方走:

圖3-25 路徑獲取示意圖

圖3-26 路徑獲取示意圖

黑方此時又因為搜尋路徑:A3-B3,G1-F1,B3-B4,F1-E1,B4-H4 吃仕,E1-D1

先被嘗試,所以又走了A3-B3。黑方這樣反反覆覆在 B3-A3 ÙA3-B3 這兩步徘徊,

以為可以吃到紅仕,但在實戰中若這樣反覆走步卻怎樣也吃不到紅仕。

而為了解決上述的現象,其實我們可以用疊代加深搜尋(Iterative Deepening

Search)的方式來解決。以圖 3-26 黑方要進行 6 層的搜尋為例,當疊代搜尋到第

3 層時,黑方可以得到最佳路徑:A3-A4,G1-F1,A4-H4 吃仕,因此搜尋完 3 層

的最佳走步為:A3-A4。同樣地,搜尋完 4 層的最佳步也是 A3-A4。而搜尋到第

5 層時,因為會拿搜尋完 4 層的最佳步,來當做 root 第一個嘗試的走步,因此 A3-A4

這一步會比A3-B3 這步同樣可以獲得一隻仕的走步要先被搜尋,所以最後搜尋完

5 層的最佳走步,依然會是 A3-A4。同理,搜 6 層時 A3-A4 仍然會優先被搜尋,

所以最後搜完6 層之後的最佳走步就是 A3-A4。使用疊代加深搜尋可以保證,如

果能獲得利益的話,它會走出最快獲得利益的走法。因為在淺層疊代搜尋時,就

已經搜尋到的最佳走法,如果疊代搜尋到最後,走這樣的步依然可以獲得最大利

益的話,它將不會被後來同樣可以獲得一樣利益的其它走步給覆蓋。

而在劣勢時,又該怎樣挑出最頑強的抵抗手法?以圖3-27 為例,輪黑方走,

進行10 層的搜尋:

圖3-27 路徑獲取示意圖

從圖3-27 可以看得出來,黑方的象會在 10 步以內被仕跟帥夾殺,但要怎樣走出

最頑強的抵抗手法?同樣地,可以利用疊代加深搜尋的方式,確保走出來的步是

最頑強的走法,來將自己的戰線延長,增加對手犯錯的機會。如果不用疊代加深

搜尋的話,可能因為搜尋路徑:B2-B1,A1-B1 吃象,H1-G1,D3-E3,G1-F1,

E3-E2,F1-G1,E2-F2,G1-H1,F2-G2,先被搜尋(黑方的象在第 2 步 A1-B1 就

被吃了),而搜尋路徑: B2-C2 ,A1-B1 ,H1-G1,B1-B2,C2-C1,D3-D2,

G1-F1,D2-D1,C1-B1,B2-B1 吃象,後被搜尋(黑方的象在第 10 步 B2-B1 才

被吃)。那麼走這兩條路徑都是損失一隻象的分數,所以B2-B1 比 B2-C2 優先被

嘗試,使得它成為搜尋完 10 層後最佳走步。從這邊可以看的出來不使用疊代加

深搜尋的話,可能會受到著法優先嘗試順序的影響,而走出提前送子的情形。

第十一節 走棋與翻棋的抉擇

在暗棋的遊戲裡,最難的就是走棋與翻棋的抉擇。當面對一個盤面時,往往

不知道該走棋比較好還是翻棋比較好,又或是一定要翻棋時,也不知道該翻哪個

位置比較好,這一點是跟西洋棋、象棋有很大的不同。

為了在走棋與翻棋中做抉擇,我們在這次的暗棋程式實作中將搜尋拆成兩部

份:(一)明棋搜尋。(二)翻棋搜尋。明棋搜尋時只對翻開的棋子進行走步的深

層搜尋(例如:搜尋10 層),搜尋的過程中不做翻棋的動作,且根節點(第一步)

不允許走空步。而翻棋搜尋時,會對每一個尚未翻開棋子的位置,賦予其每一個

可能出現的兵種,以此狀態當做根節點,然後進行走步的淺層搜尋(例如:搜尋

6 層),同樣地,搜尋的過程中不做翻其它棋的動作。

翻棋搜尋的結果最後會拿來跟明棋搜尋的結果做比較,一開始先將某位置的

gt、sum 初始為 0,如果翻棋(翻出某一兵種)搜尋的結果好於明棋搜尋的話,則

gt = gt + 該兵種未翻開的數量;如果翻棋搜尋的結果比明棋搜尋還要壞的話,則

gt = gt – 該兵種未翻開的數量。最後,不管是好是壞都執行sum = sum + (翻棋搜

尋分數 – 明棋搜尋分數) * 該兵種未翻開的數量。這樣替每個尚未翻開棋子的位

的話,則比較sum 值,來當作是翻棋最有利的位置。

最後,要在走棋與翻棋做抉擇時,只要判斷翻棋最有利位置的gt 值是不是大

於0 即可,如果大於 0 的話,則選擇翻棋,否則就走棋。

我們以實戰中如圖3-28,輪黑方走為例,看黑方是怎樣在走棋與翻棋之間做

抉擇的:

圖3-28 走棋與翻棋抉擇示意圖

此時盤面還剩:士*2、象*1、車*2、馬*2、包*2、卒*3、仕*1、相*1、俥*2、傌

*2、炮*2、兵*2,總共 22 隻棋子還沒翻開。

現在黑方進行10 層的明棋搜尋,得到的結果是:

主要路徑:A2-A1,B1-A1,空步,C1-B1,空步,B1-C1

分數:-1(我們令 x = -1),是黑方損失一隻卒的分數。

接著進行6 層的翻棋搜尋,得到的結果是翻 F1 或 E2 最有利,因為兩個位置所算

(6)翻出卒後再搜尋:B2-A2,空步,A2-A1,空步,A1-A2,所得分數:-1,

(12)翻出兵後再搜尋:B2-A2,E1-F1,A2-A1,F1-E1,A1-A2,E1-F1,所得

分數:0,兵還有 2 個未翻開。因為所得分數 0 > x,所以 gt = gt + 2 = 6,sum = sum

+ ( 0 - x ) * 2 = -96 + 1 * 2 = -94。

最後可以得到gt = 6,sum = -94。

而最後要做走棋與翻棋的抉擇時,因為gt = 6 > 0,表示 F1 位置可能翻出 22

顆棋子,gt 值將介於-22 至 22 之間,實際算出 gt = 6,翻棋划算的機率較高,所

以黑方選擇翻棋較為有利。我們在實戰測試時黑方翻了F1 翻到紅俥,如圖 3-29:

圖3-29 走棋與翻棋抉擇示意圖

在文檔中 電腦暗棋之設計及實作 (頁 44-53)

相關文件