畢業也有兩個月了,寫這篇文章算是紀念我的畢設——圍棋博弈程式的設計與實現。選了這個找抽的課題作為畢設,一度不知該如何?,還好萬能的微博讓我得知了現代電腦圍棋的核心演算法——UCT演算法。而蒙特卡羅局面評估演算法是UCT演算法的基礎。本文作為本系列第一篇文章,先介紹蒙特卡羅局面評估演算法。
電腦圍棋博弈問題的一大痛點在於難以設計簡單有效局面評估演算法。傳統的圍棋程式主要採用影響函數等專家知識進行局面評估,由於圍棋的專家知識難以抽象出來(想想厚味,薄味,氣合等詞……),往往評估得不準。so怎樣才能精確評估呢?窮舉!沒錯,如果黑白雙方的接下來每手棋都“正確”,最後黑棋贏了,那麼當時的局面一定是黑棋優勢。
量子電腦還沒幹出來,還是想點可行的方法吧——再假設,如果黑白雙方棋力不高卻相當,來續下這個局面,最後是黑棋贏了,當時的局面是誰優勢呢?你大概會說,黑棋優勢的可能性更大一些。進一步,同樣的局面續下了1000次,有800次是黑棋贏了,你是不是基本相信黑棋優勢呢?
那麼,如果黑棋和白棋都不會圍棋,只會隨機落子呢?他們針對這一局面續下了1000次,竟然有800次是黑棋贏了……
這就是蒙特卡羅局面評估演算法,so easy~
************分割線**************
論文中有些不自量力,試圖從數學上探討蒙特卡羅局面評估演算法的合理性(後來才知道早就有人證明了),以下貼論文……
3.3.4 一種圍棋“棋步價值”的數學定義與精確量化的方法
Monte Carlo方法的理論依據是機率統計學中的“大數定理”。在本節中,我將試圖從數學的角度對MonteCarlo方法應用於圍棋局面評估的合理性作一些探討。
總的想法是:圍棋中每一手棋的價值都是可以用數學的方法精確量化的,本文提出一種對於“棋步價值”的數學定義(以及一系列圍棋領域中相關概念的數學定義),同時也是精確量化“棋步價值”的方法。
首先,對於圍棋這樣的完備資訊的零和博弈遊戲而言,對於任意一個給定的局面,對於落子方而言客觀上一定存在“最佳棋步”(使己方在終局時領地最多的棋步),並且理論上可以通過窮舉法來找到“最佳棋步”,以下給出窮舉法遞迴實現的虛擬碼:
表3-7 虛擬碼2
Move bestMove(GoBoard board) { for (move in board.next_move_set) { next_board = board.move(move); value = bestMove(next_board); 用best_move記錄本迴圈value的最大值; } return best_move; } |
設圍棋局面的集合為S,對弈雙方為 ,當前局面的可下點集合為 ,那麼對於局面 ,玩家 ,若有棋步 , 則存在棋步m的價值函數 , 的計算步驟如下:
1) 對於局面a,記棋步m後的局面為b,之後雙方都應以“最佳棋步”,終局時p收益計為C。
2) 對於局面a,p方pass(也就是改變落子方),之後雙方都應以“最佳棋步”,終局時p得收益D。
3) V(m) = C - D。
於是“最佳棋步”又可以定義為,令 取最大值的m,記為m'。易得,“棋步價值” 也是一個遞迴定義。容易想到, 還可用來表徵局面a的“激烈程度”。
根據以上的定義又可以引入“棋步品質”的概念,“棋步品質” 。當 時,即“最佳棋步”,當q= 0時,即通常所說的“廢棋(沒有價值的棋)”。當棋局已結束時(即m'=0),“棋步品質”q無定義。
進一步地,可以對圍棋中的常用名詞“棋力”(形容一個人圍棋水平高低)給出數學定義:設某人一段時間來以來(或某一局棋中)產生的棋步集合為 ,則此人的“棋力”計算式如下:
“棋力”w也就是“棋步品質”的平均值。需要指出的是,“棋力”是一個對局者本身固有的屬性,上式僅僅是它的求值方法,這個情況類似於電學公式 。
基於以上的數學定義,我認為要從數學上證明Monte Carlo方法應用圍棋局面評估的合理性,需要證明以下2個猜想:
1) 對於給定局面a,雙方都應以最佳棋步,得終局收益A。同樣對於局面a,由兩個“棋力”相等的對局者續下,終局收益的數學期望為B。則A約等於B。
2) 一個只會產生隨機棋步的下棋者r,通過大量的對局可以得出r的“棋力”R,R是一個未知常數。
本文未能對以上2個猜想給出數學證明,但我個人相信這2個猜想都是正確的。
******分割線********
最後沒能證明,最後一句話有點無賴………