這幾天把圍棋a.i.最後的部分寫好了,9路小棋盤上看上去執行得還不錯,更名為foolgo。先講一下uct博弈樹的實現。
鑑於foolgo的mc模擬速度和棋盤物件的大小,如果直接用樹結構實現,用不了幾分鐘,我的mbp的4g記憶體就會被棋盤擠爆。所以要通過置換表實現博弈樹。
雜湊演算法當然是zobrist雜湊。如果雜湊值的型別是uint32_t的話,不同棋局雜湊衝突的概率就是1 / ~(uint32_t)0——可以認為不同的雜湊值意味著不同的棋局。不用自己寫雜湊表,c++11新增有標準容器unordered_map,很含蓄的名字,就是雜湊表。
zobrist雜湊值可以增量計算,不過實現起來有些麻煩,暫不實現,因為foolgo目前的效能瓶頸還是在落子動作上。
uct搜尋過程中多處要取到子節點的雜湊值,如果為此落子很昂貴,因此置換表項須要攜帶子節點的雜湊值,然後通過childkey函式取得雜湊值:
template hashkey engine有了這個置換表後,易實現uct博弈樹。只是剛寫完時bug較多,這種海量計算的函式,debug起來比較頭疼……::childkey(const boardingm&parent,
pointindex indx)
const
else
}
棋盤上面的數值是foolgo對該落子點的評估(即下在那裡的話最後能佔幾子)
之前走成裂形了,可以看到foolgo對局面的評估也持悲觀,不過這串的滾打包收還不錯。
雙方地域基本確定,黑棋敗勢已定……
額操作失誤了,我的測試程式沒法悔棋,pk到此為止。
**:
開源的圍棋軟體
alphago 和李世石的大戰很吸引眼球,除了alphago,是否有其他的圍棋軟體,特別是開源的,可以看看演算法是如何實現的。找了一下,發現下面一下軟體 gnugo。go 是英語圍棋的意思,源自日語的 發音go 最新的版本是 3.8,2009年最後更新,看來也是很久沒有弄了。這裡直接提供了乙個 cu...
圍棋程式 圍棋資料結構 圍棋演算法
圍棋程式 圍棋資料結構 圍棋演算法 e.g.各種典型的棋局或對弈程式 棋盤的資料結構 19x19 二維陣列 各種典型的下棋步驟即記錄棋局對弈過程的一系列具體的演算法 曉輝是這樣想的 如果所有可能的布局都蘊含在棋盤的序位關係之中,那麼,這種蘊含的棋局只有在被具體的對弈雙方選用的時候,才能由隱而顯。20...
flash 圍棋 圍棋怎麼玩,最還有flash
2008 02 13 回答 第一條 圍棋的棋具 一 棋盤 盤面有縱橫各十九條等距離 垂直交叉的平行線,共構成361個交叉點 以下簡稱為 點 在盤面上標有幾個小圓點。稱為星位,的星位又稱 天元 二 棋子 棋子分黑白兩色。均為扁圓形。棋子的數量以黑子181 白子180個為宜。第二條 圍棋的下法 一 對局...