• 沒有找到結果。

放子階段的作法

第三章、 如何破解台灣直棋

第三節、 放子階段的作法

放子階段是指將手中的棋子放置在盤面上的空白交叉點上,其搜尋深度固定

加上不會出現循環盤面影響樹搜尋演算法的效率[6],因此放子階段使用樹搜尋的

方式求得第一步最佳放置棋子的位置,似乎是一件非常容易的事情。

樹搜尋的速度取決於一個節點的分支數跟搜尋深度,雖然在放子階段的搜尋

深度是固定的,但節點分支數的大小卻不是固定的,因為吃子步數量最大可以是

非吃子步兩倍,存在吃子步的盤面搜尋時間是不存在吃子步盤面搜尋時間的兩~

三倍。我們一開始考慮採取 MIN-MAX search 演算法[4]進行裁剪,在 Six Men'

Morris 的放子階段採用 MIN-MAX search 演算法實驗之後,發現到使用樹搜尋的 方式並不足夠有效率的得到解答。

有鑑於此,我們嘗詴在放子階段也使用回溯分析演算法尋找第一步最佳放置

棋子的位置,首先對應放子階段的特性改良原本的回溯分析演算法,回溯分析演

算法的主要觀念是從結束往開始回溯,在放子階段的結束即是行子階段的開始,

因此結束盤面勝負結果就是行子階段盤面的勝負結果。放子階段時,還要考慮到

的是現在雙方手中還有幾顆棋子還未放置於棋盤上,因為不同盤面表示的不止棋

子在盤面上的分佈情形。

圖3-8 放子階段回溯分析演算法示意圖

配合放子階段特色改良的回溯分析演算法跟行子階段的差別,在於沒有初始

化跟回溯的階段,只留下讀取資料庫部分。不需要初始化的原因在於放子階段不

會出現結束盤面,也就是說在放子階段中每一個盤面都一定存在下一個盤面,反

而言之就是放子階段的盤面都可以由其下一個盤面往回產生,因此不需要初始化

程序。因為不會發生循環的情形,所以不會需要重覆檢查盤面勝負值是否有改

變,只要將資料庫的盤面讀完,剩下的就是所有盤面的結果了。

儲存資料的方式是採用資料庫的想法,因為盤面數量太多而記憶體無法儲存

所有盤面,所以需要將資料庫作一個分割,分割資料庫的方式是依據回合數量跟

盤面雙方棋子數分配,不管有沒有吃子行為發生都會跳到另外一個資料庫。

圖3-9 放子階段的資料庫部分關係圖

殘局資料庫以盤面上雙方棋子數及存在的回合數為命名,例如 1-0-4 表示第 4

回合盤面上黑方玩家棋子數為 1 顆;白方玩家棋子數為 0 顆。

放子階段存取硬碟的次數遠比行子階段還要多很多,由上圖可以發現要製作

第 4 回合盤面黑方一個棋子白方一個棋子(1-1-4)的所有盤面勝負資料庫時,需要

讀取兩個資料庫,然而在製作下 2-1-4 的所有盤面勝負資料庫時,也會重覆讀取

相同的資料庫。為了減少從硬碟抓資料到記憶體的次數,將製作資料庫順序依使

用時間先後次序排序,並且已經讀進記憶體的資料庫一直保留到確定沒有其它資

料庫還需要讀取其內容的時候,再將其存在的空間留給其它尚未讀取到的資料庫

使用。如此在理想狀態下可以使得將硬碟資料讀進記憶體的次數減少為原本的三

分之一。

相關文件