• 沒有找到結果。

第三章 搜尋演算法與資料結構

3.1 搜尋演算法

棋類遊戲中通常會利用樹狀結構將對弈雙方可能的過程表現出來,如圖 3-1 則是以井字遊戲為例的遊戲樹。如果說能夠完全的展開整顆遊戲樹,則可以保證 在所有的盤面下都能夠做出最佳的應對。

圖3-1 以井字遊戲為例的遊戲樹

16

3.1.1 MiniMax Search

從有限的深度展開遊戲樹狀態中,我們必須要將遊戲樹狀態中最底層呼叫審 局函數進行局勢評分,審局函數給予之結果用以評估目前棋局之局勢。以零和博 弈來說,當分數屬於正值時代表我方處於優勢,反之若為負值時則我方處於劣勢。

若敵我雙方都是以最佳走法進行棋局,則我方(Max 方)會想辦法將分數給提高;

而敵方(Min 方)則會想辦法將分數給降低。而 MiniMax Search 則是依據這個準則 模擬雙方最佳的走步,換句話說就是 Min 與 Max 的選擇走步策略不斷的由預設 深度最底層開始往上遞迴回傳的結果。

圖3-2 MiniMax Search 例子[10]

如圖 3-2,圓形的點為 Max 節點;而方形的點為 Min 節點。當搜尋到第 4 層 時(底層)會透過審局函數回傳一個值。當 Max 收到第一個子節點回傳時,它會先 將分數記錄起來再繼續做搜尋下一個子節點的動作。一旦有新的子節點回傳值大 於目前 Max 節點所記錄的值,則 Max 節點將會改記錄這個新的回傳值再繼續重 複的搜尋下一個子節直到沒有任何子節點為止。而 Min 節點的做法與 Max 節點 大同小異,與 Max 節點的差別在於 Min 節點只會紀錄子節點中回傳的最小值。

圖 3-3 為 MiniMax Search 虛擬碼,當 maxmizingPlayer 為 true 時,表示現在

17

是 Max 節點將尋找所有子節點中回傳最大值並儲存在 bestValue 中,待尋找完所 有子節點後再回傳給上層的 Min 節點(如果有的話);而當 maxmizingPlayer 為 false 時,表示現在是 Min 節點將尋找所有子節點中回傳最小值並儲存在 bestValue 中,

待尋找完所有子節後再回傳給上層的 Max 節點。

圖3-3 MiniMax Search 虛擬碼[10]

MiniMax Search 演算法屬於深度優先的演算法,複雜度為 kd,k 為分支數,

也就是每一手平均的合法走步以及翻子數目,d 為搜尋樹的展開深度。MiniMax Search 演算法會完整的搜尋預設層數內所有子節點。搜尋樹的節點數會呈現指數 成長。假設平均每層有 k 個分支,則必須加快約 k 倍的才能在原來的基礎上多搜 尋一層。此做法因為時常會搜尋到無用之點浪費效能,故之後由 MiniMax Search

18

所改良後的 Alpha-beta Pruning 較多人使用。

3.1.2 Alpha-beta Pruning

Alpha-beta Pruning 是 MiniMax Search 演算法的改良。McCarthy John 在 1955 年提出了這個想法,後來 Alexander Brudno 在 1963 年發表。Alpha-beta Pruning 的概念是當一個節點將要找尋的所有子節點都不能影響父節點的分數時,這些子 節點就沒有搜尋的必要。Alpha-beta Pruning 的設計原理,是在 MiniMax Search 演算法增加了 Alpha、Beta 兩個參數部分,分別表是我方與敵方最佳分數。

隨著搜尋的進行 Alpha 值可能會越來越大,Beta 值則會可能會越來越小,而 Alpha 與 Beta 所包含範圍為 Alpha-Beta Window。每個節點都會由父節點傳來自 己的 Alpha 與 Beta 值,當 Min 節點在更新自己的值後如果發現自己的值比 Beta 值小,也會將 Beta 值變成自己的值;當 Max 節點在更新自己的值後如果發現自 己的值比 Alpha 值大,也會將 Alpha 值變成自己的值。之後往下搜尋會將自己的 Alpha 值和 Beta 值傳下去。要注意的是,Max 節點不會更新自己的 Beta 值;而 Min 節點也不會更新自己的 Alpha 值。

所有的節點分數都必須落在 Alpha-Beta Window 內,如果有分支的分數落在 Alpha-Beta Window 外,則會發生 cut 將不會再搜尋這個分支。

如圖 3-4 中,B 點因為取到值 25 大於 20 而造成 C 點成 Beta Cut;E 點因為 取到值 6 小於等於 6 而造成 F 點成 Alpha Cut;H 點因為取到值 3 小於等於 6 而造 成 I 點成 Alpha Cut;J 點因為取到值 6 小於等於 20 而造成 F 點成 Alpha Cut。由 此可發現 Alpha-Beta Window 收斂的速度影響了截斷的發生時機,當收斂的越快 越能截斷更多的分支,提高整體搜尋速度。

19

圖3-4 Alpha-beta Pruning例子

圖3-5 Alpha-beta Pruning虛擬碼[10]

相關文件