• 沒有找到結果。

遊戲樹(Game Tree Search)相關介紹

第三章 演算法及資料結構文獻探討及研究

3.1 遊戲樹(Game Tree Search)相關介紹

就棋類遊戲的人工智慧程式來說,最重要的概念就是遊戲樹的展開。對於程式 而言如何去找到下一個著手(或走步),則需要我們給予程式一個關於現在盤面的定 義,也就是這顆遊戲搜尋樹的起點。如下圖 5 所示,我們以圈叉遊戲做為範例,若 現在這個盤面輪到X,那麼合法的走步便是剩下的三個空格,於是我們針對這三個 合法走步展開,接下來第二層變輪到另一方根據當下的盤面展開可能的合法走步。

最後遊戲樹可能會因為符合勝/敗條件而停止,也可能因為時間、空間或者其他限 制而停止。例如在這個遊戲當中,三個連成一線即為勝方,因此 100 則當作 X 方 勝利的獎勵分數,而-100 則當作 X 方敗的懲罰分數。

3.1.2 Min-Max Search

當知道一顆遊戲樹如何展開之後,接下來則是要以適當的策略來讓電腦程式知 道符合什麼樣的盤面或者狀態的時候,可以停止搜尋。除了時間和空間的限制之外,

最常使用的便是給予審局分。審局分的定義通常來自於棋盤上的子力總和、距離最 終目標盤面的步數、或者是其他已經量化過的盤面狀態,其使用的目的是要告訴程 式:當審局分超過多少或少於多少的時候,表示當下的局面是極優或者極差的狀況,

讓程式知道所謂的好或不好的盤面。特別是雙人遊戲時我們常會使用 Min-Max 的 方式來展開搜尋樹,以下圖 6 所示,當搜尋樹被展開的同時,期望找到對我方最有 利的盤面,亦即 max,則該盤面相對敵方來說反而會是得分最少的盤面,亦即 min。

圖 6 Min-Max 示意圖[15]

而我們也在下方表 2 列出 Min-Max 搜尋法的虛擬碼當作參考。

intMinMax(int depth){

3.1.3 Alpha-Beta Search

在 Min-Max Search 的搜尋樹展開過程當中,因為將所有合法走步都展開的緣故,

準確度相當高,但是因為每一個合法步(節點)都必須拜訪過一次,所以耗費的時間 相當多。實際上若透過適當的技巧將多餘的搜尋樹分枝剪裁掉亦是可以在得到正確 結果的情形下省下很多時間的。Brudno[16]在 1963 年首先發表了第一篇關於 Alpha-Beta Search 的論文,之後,1975 年 Knuth 和 Moore[10]在數學上證明了 Alpha-Beta Search 的正確性。

Alpha-Beta Search 是透過邊界 Alpha 及 Beta 對搜尋樹所得到的審局分,限制其 必須落在固定的範圍,否則將予以裁切。Alpha-Beta Search 屬於深度優先搜尋(DFS),

如果在搜尋過程中發現:某些後來展開的子樹節點結果不會落在 Alpha 和 Beta 的 邊界值之內,則該子節點以及其子樹將不會影響最後搜尋結果,就不必搜尋而進行 裁剪(cut off),以節省搜尋的時間。

Alpha-Beta Search 演算法搜尋的效率與展開搜尋的子節點之排序有很大的關係,

如上圖 7 所示,如果右半邊子樹盤面分數-2 與 6 的節點互換順序,就不會發生裁剪

呈現 Min-Max Search 的架構。並且在最佳走法搜尋順序時,Knuth 和 Moore 證明

intalphaBetaMax( int alpha, int beta, int depth ) { intval;

return alpha;

}

intalphaBetaMin( int alpha, int beta, int depth ) { intval;

3.1.4 Nega-Max Search

從 alpha-beta search 的虛擬碼我們可以發現其程式碼為兩部分,然而在 1975 年 Knuth 和 Moore 提出了 Nega-Max 演算法,將取得最小值和最大值的方法透過負號

intAlphaBeta ( int alpha, int beta, int depth) { intval;

return alpha;

}

表 4 Nega-Max 虛擬碼[15]

相關文件