• 沒有找到結果。

工作層級模組(Job-Level Module)

第三章 框架設計

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)的物件來處理關於遊戲的資料。它會負責處理 關於遊戲的資料,並作為一個代理人來進行一些關於遊戲的決定。如果 有需要,遊戲策略也能依需求,來取出屬於遊戲人工智慧的資料。如此 一來,演算法就能從遊戲內獨立出來。

相關文件