第二章、 研究背景
2.3 證明數演算法(Proof Number Search)
證明數演算法(Proof Number Search)[8][9][10],簡稱 PNS,是 Allis 在 1994 年提出,為一種 best first search,建構在 AND/OR 樹上,用在兩位玩家的遊戲上 面,像是六子棋、五子棋、象棋、圍棋等等,其目的是在證明 true or false,像是 棋局勝敗、圍棋是否吃子等問題,該演算法也實際的解決了許多棋局勝敗問題。
PNS 是個適用於證明勝敗的演算法,但是其存在著一些問題,像是記憶體的 限制,因此之後有很多人提出 PNS 變形的演算法,來彌補這些不足。
13
為了解釋方便,以下假設 PNS 目的是證明勝敗。
2.3.1 AND/OR 樹
AND/OR 樹上的節點分為兩種,AND 節點及 OR 節點;正方型的節點代表 OR 節點,圓形的節點代表 AND 節點(如圖 7 所示)。
圖 11 AND/OR 樹
OR 節點要證明為必勝,必須其中一個子節點為勝;AND 節點要證明為必勝,
必須所有子節點都為勝。反之,OR 節點要證明為必敗,必須所有子節點為敗;
AND 節點要證明必敗,必須其中一個子節點為敗(如圖 11 所示)。
圖 12 AND/OR 樹勝敗關係
14
2.3.2 證明數(Proof Number)
證明數(之後簡稱 PN)代表要證明目前盤面必勝,至少還需展開多少節點(如 圖 13 所示,節點左下方的數字代表 PN)。
圖 13 證明數
其更新方式:
OR 節點 : 取子節點中最小的 PN
AND 節點 : 取子節點中 PN 的加總
2.3.3 反證數(Disproof Number)
反證數(之後簡稱 DN)代表要證明目前盤面必敗,至少還需展開多少節點(如 圖 14 所示,節點又下方的數字代表 DN)。
圖 14 反證數
15
其更新方式:
OR 節點 : 取子節點中 DN 的加總
AND 節點 : 取子節點中最小的 DN
2.3.4 PNS 演算法步驟
上面介紹了 PNS 建構在怎麼樣子的搜尋樹上面,並介紹節點上 PN/DN 所代 表的意義,接來下要說明 PNS 搜尋的方式。
PNS 主要分為三個步驟:選點、展開、更新 PN/DN 數值。接下來依依介紹這 三個步驟。
2.3.4.1 選點
決定哪一個 leaf 節點要展開。
當在 OR 節點時,要證明必勝只需一個子節點勝,就可以證明該節點必勝,
然而要證明該節點敗,則需要證明所有子節點必敗;因此在 OR 節點時,會去選 擇子節點中 PN 值最小的子節點,因為在證明敗的角度上,所有子節點皆須證明 必敗,選哪個子節點並沒有差別。反之在 AND 節點時,由於證明必勝,則需證 明所有子節點勝,證明必敗只需其中一個子節點敗即可,因此在 AND 節點時,
會去選擇子節點中 DN 值最小的子節點(如圖 15)。
依上述選擇方式,會選擇到一個 leaf 節點,該 leaf 節點稱為最佳證明節點 (Most Proving Node),簡稱 MPN,接下來會對 MPN 做展開的動作。
16
圖 15 PNS 選擇 MPN
2.3.4.2 展開
展開選定的 MPN。將該節點所有的下法產生出來。圖 15 展開如圖 16。
圖 16 PNS 展開節點
2.3.4.3 更新 PN/DN 數值
首先要先決定新產生出來節點的 PN/DN 數值,主要分為三種狀況,必勝、
必敗、無勝敗;在必勝的情況下,則令 PN/DN 為 0/∞ ;在必敗的情況下,則令 PN/DN 為∞/0;無勝敗的情況下,則令 PN/DN 為 1/1。接著在依照 2.3.2 中的規
17
則,更新目前 PNS 搜尋樹上的 PN/DN 值。
圖 17 PNS 更新 PN/DN 數值
2.3.4 PNS 的缺點
本章介紹 PNS 演算法兩個常見的缺陷,記憶體限制和重複盤面問題。
2.3.4.1 PNS 記憶體限制
PNS 為一種 Best First Search,會去往最有機會證明結束的分支去搜尋,其 會將整顆搜尋樹儲存在記憶體裡面,以尋找最佳的節點,相較於 Depth First Search,只會儲存目前搜尋節點走的路徑上的節點,記憶體的用量相對大非常 多。
為了彌補 PNS 記憶體用量大的不足,有許多改良自 PNS 的演算法,像是 PN2, PDS、Df-PN 接是其變型[11][12][13][19][20][23][24]。
PN2 為一種兩階層式的 PNS,演算法如同 PNS 一樣,差別在於會對新展開 的節點做另一次的 PNS,來估計該節點初始的 PN/DN 值。
PDS、Df-PN 則是一種 Depth First 的 PNS,搜尋樹會往某一個分支挖深搜尋 下去,該演算法中會有一組門檻(Threshold),證明數門檻(Proof Number Threshold)
18
及反證數門檻(Disproof Number Threshold),來決定何時停駛繼續挖深。
JL-PNS 由於每個節點都是由 NCTU6 產生,這些節點都是經由程式些做第 一次篩選而產生,搜尋樹通常只會有數萬個節點,因此在 JL-PNS 沒有記憶體的 問題。
2.4.3.2 PNS 重複盤面
在許多的搜尋樹中,常常會有相同盤面的問題,如圖 18 所示,而如果以上 述的邏輯,更新 PN/DN 值時,就會發生數值更新錯誤,以圖 18 的例子,在根節 點實際的 PN/DN 應該是 1/1,然而卻會錯誤的更新程 1/2。由於 PN/DN 值錯誤的 更新,會使得在展開節點時,可能選擇到較差的節點。
根節點錯誤的 PN/DN 值 實際 PN/DN 值
圖 18 PNS 相同盤面問題