第二章、 相關研究探討
第三節、 回溯分析演算法
回溯分析演算法是利用已知的結果反過來推出前一個情況結果的方法,從最
後結果開始反過來尋找前一個情況的結果,最理想情況可以一路反過來推到一開
始的狀態。回溯分析演算法最常被用來解決棋類遊戲中盤面循環的問題,而直棋
遊戲在行子階段就存在盤面循環的問題,即於遊戲過程中存在回到已經走過盤面
的問題。
計算 Nine Men' s Morris 問題行子階段的所有盤面結果,依照回溯分析演算法
的程序:
初始化
輸盤面回溯
贏盤面回溯
初始化即產生所有盤面,並且賦予每一個盤面一個值表示「贏」、「輸」、「和」
或「未知」。跟據 Nine Men's Morris 的遊戲規則決定初始盤面的值,例如某方棋
子已經無空位可以移動就可以將其設為已輸盤面。
圖2-8 輸盤面回溯的示意圖
第二步搜尋輸的盤面,由盤面勝負值為輸的盤面可以回溯至上一個盤面並設
定上一個盤面勝負值為贏。較直覺的想法就是在上一個盤面時,知道有一種走法
可以走到對方必輸的盤面,那麼只要選擇該走法,己方必定會贏。
圖2-9 贏盤面回溯示意圖
第三步搜尋贏的盤面,現實玩家都會避免走到讓對方會贏的盤面,因此在贏
盤面回溯至上一個盤面的時候,程式必需要判斷上一個盤面的其它還可選擇的走
步是否都是已知結果為贏的盤面。
一直不斷循環第二步和第三步直到最後所有盤面的勝負結果都不變才停止
程序,最後儲存結果時,將未知跟和都存為和棋。
本論文將一個盤面可以產生的所有結果為非贏的盤面數量稱之為「分支
度」,Ralph Gasser 在贏盤面回溯程序時,為每一個贏盤面回溯至的盤面額外增加
一個記憶體空間用來儲存該盤面的分支度。
每一個贏盤面在回溯到前一個盤面時,都會讀取前一個盤面的分支度,並將
其分支度減一,當分支度降至為零時,表示前一個盤面的所有可以產生的盤面勝
負結果都為贏,就可以將前一個盤面的勝負結果設為輸。
Ralph Gasser 使用一個 buffer 來儲存已知結果為「贏」跟已知結果為「輸」
的盤面,初始化時將判定輸贏的盤面存入 buffer。當初始化結束之後,從 buffer
裡取出一個盤面,若盤面勝負結果為「輸」,則進行輸盤面回溯程序,並且將原
本結果「未知」改變為「贏」的盤面在存入 buffer;若盤面勝負結果為「贏」,則
進行贏盤面回溯程序,並且將原本結果「未知」改變為「輸」的盤面在存入 buffer。
直到存在 buffer 裡面的盤面都被取出來計算後就停止程序,當 buffer 裡的盤面數
量變為零時,就表示完成贏盤面回溯及輸盤面回溯後沒有改變任何盤面勝負結
果。