第三章 框架設計
3.2 棋譜編輯器框架之設計
3.2.2 工作層級模組(Job-Level Module)
工作層級模組提供一個能簡單實作自動化送出工作的應用程式介面。
我們會分兩個部分來說明:
工作層級演算法:說明如何快速實作工作層級搜尋演算法。
遊戲策略:說明如何快速套用演算法至某特定棋類。
3.2.2.1 工作層級演算法(Job-Level Algorithm)
所謂的工作層級是指在演算法運作時,將搜尋節點作為一個工作丟到 電腦對局遊戲桌機網格,並等待其結果回來的一種方式,如圖 13(NCTU6 是我們的六子棋人工智慧)。由[25],我們從工作層級證明數搜尋中歸納 出整個階段分三類觸發事件:使用者要求開始執行、有空閒工作者、工 作結果回傳。
圖 13:工作層級搜尋演算法概念圖
初始化發生於使用者要求執行演算法時,這時需開始做演算法的初始 化工作;當有空閒工作者時,這時需決定該選擇哪個節點包裝成工作並 送到網格系統中,並進行更新;當結果回傳時,需更新該工作對應的節 點並確認是否做收尾工作。
我們採用了 Template Method 設計樣式,將這些共通行為全部定義成 八個純虛擬函式,利用覆寫的方式讓各演算法發展者可以清楚地切割演 算法的行為。八個函式分別為:
Initialize:進行初始化。
Select:選擇要作為工作送出的節點。
Pre-Update:預先更新樹,避免下次仍會選到同個點。
Dispatch:包裝工作並送出。
Parse:將送回的資料放入資料結構中。
Update:根據送回的資料更新搜尋樹。
CheckFinish:確認是否完成。
Finalize:進行收尾的工作。
圖 14:初始化階段
圖 15:空閒工作者階段
圖 16:工作結果回傳階段
3.2.2.2 遊戲策略(Game Policy)
當我們執行一個 Job-Level 演算法時,會有些資料屬於演算法層級的。
舉例來說,此節點下的哪個子節點是應該下一個被訪問的;但同時也會 有一些是只跟遊戲人工智慧有關的,像是特徵數量或盤面的估計值等等。
要我們將這些全部都設計在一個結構內是不可能的。所以我們將這些資 料分成兩類:遊戲的資料與演算法的資料。
圖 17:資料觀點
而要讓演算法能適用各棋類,它們必須知道該棋類人工智慧的資料;
以演算法的角度來說,知道演算法的資料很自然,但因為演算法與遊戲 應該分開的,所以演算法不應該知道遊戲人工智慧的資料。若我們照之 前的作法用繼承解決這問題的話,演算法數量會有爆炸性的成長。
因此,我們將人工智慧資料的處理對每一演算法,內部會有一個稱作 遊戲策略(Game Policy)的物件來處理關於遊戲的資料。它會負責處理 關於遊戲的資料,並作為一個代理人來進行一些關於遊戲的決定。如果 有需要,遊戲策略也能依需求,來取出屬於遊戲人工智慧的資料。如此 一來,演算法就能從遊戲內獨立出來。