前言:
前幾天在 csdn 下載資源的時候才發現自己 csdn 有近 200 的下載積分,看了看共享的資源,哈哈 ... 7年前寫的五子棋游戲很受歡迎。
下載地址:新手入門五子棋游戲 剛入行的時候寫的,采用的 "權值" 計算法。
在這個 AI 的浪尖風口上,借助我對游戲領域的熱愛,在工作余外的時間喚起了我的想法,學習 AI 實現一個五子棋機器人。
一、五子棋介紹
種類及區別
先說說五子棋吧,通常大家玩的五子棋分為帶禁手和不帶禁手兩個版本,
(前者稱之為連珠
Renju,后者一般稱之為五子棋
Gomoku)
然而無論哪一個版本,先手黑棋均必勝。
(所謂黑必勝
的意思是,只要黑棋按照一定的方式下,白棋選擇棋盤上的任何一個點都不可能贏棋。)
(禁手規則增加程序復雜度,暫不考慮加入)
這里只說結果,至於為什么參考文末資料:
1992年Victor Allis通過編程證明不帶禁手的五子棋,黑必勝。
2001年Janos Wagner第一次證明的帶禁手的五子棋,也是黑必勝。
先手優勢及棋譜介紹
黑棋的優勢到底有多大呢?在26個職業開局里,已經發現有19個是黑棋必勝的(一打必勝)。
因此為了進一步削弱黑棋的優勢,國際上推出五手兩打
的規則。
(就是黑棋的第三步需要下兩個點,但由白棋挑選讓其下較弱的哪一個)
可是人們發現黑棋帶禁手依然是必勝。
從實踐的角度來講,網上是可以搜索地毯譜
的,一般在幾百兆左右,可以用renlib
軟件打開,
所謂地毯譜的意思就是黑棋會指定下法,但白棋每一步都可以選擇棋盤任意位置,最后黑棋必勝。也就是說,只要按照此棋譜下棋,五子棋世界冠軍都一定會輸給你。
( 目前花月、浦月、雲月、雨月、峽月、溪月、金星、水月、寒星、明星、嵐月、新月、名月,山月,殘月都是五手兩打
必勝)
那么正式的比賽是怎么玩的呢?
現在的正式比賽通常會常用三手交換
、五手兩打
這些復雜的規則來平衡比賽,但這些規則的各個分支也是逐漸被人破解,
五子棋的比賽已經很大程度不是在考驗自己的臨場發揮,而是考驗選手對於少量黑白平衡 分支的記憶情況。
廣義的五子棋
不帶禁手的五子棋是屬於一類更為普遍的 m,n,k游戲 的一種特例,既 15,15,5。
m,n,k游戲是指m行n列,輪流下子,連成k個算贏。這個在數學中專門的研究如果在最理想下法(Perfect Play)
的情況下有什么樣不同的結果,
比如標准的三連棋(Tic-tac-toe)是3,3,3是一個平局,同樣只有六路棋盤的五子棋也是平局,當然上面我們已經說明了15,15,5是先手必勝,
還有研究發現11,11,5也是先手必勝。m,n,k游戲只有先手必勝和平局兩種結果。由於每下一個子都一定會對下子一方那一方有優勢,
所以可以通過反證法證明m,n,k游戲里不可能有后手勝利的情況。如果后手有勝利的方法,
那么先手可以提前借鑒(Strategy stealing)
過來實現必勝。
參考來自:Csdoker's Blog
二、人工智能介紹
先看圖,來自:《Google TensorFlow 深度學習架構》
AlphaGo 的介紹跳過、說說我們中國阿里巴巴的 "魯班" 號稱每秒能夠做 8000 張海報的 AI + Design 設計師。
其實也是機器學習在圖像領域的應用,通過循環訓練的方式。
在回來說本文的重點 "人機博弈" ,AlphaGo 主要是由三個部分組成:
蒙特卡羅數搜索(Monte Carlo tree search MCTS)
估值網絡(value network)
走棋網絡(policy network)
核心就是估值和走棋,故名思議。
通過在大量人類圍棋高手對弈的棋譜獲取的訓練數據,走棋網絡能夠預測 57% 人類圍棋高手的下一步;
但是通過這個還遠遠不足以戰勝人類冠軍,就融入了估值網絡,就是給當前的棋盤,判斷每個棋位輸贏的概率;
據說 AlphaGo 團隊將進入游戲領域的研究,星際爭霸2;
三、實現思路
開發語言:HTML5、JS (輕)
繪制棋盤、勝負判斷規則、界面操作功能,這些比較基礎的內容暫時不考慮;
采用一個三維數據來定義棋盤內容:
var _chessPieces = new Array(); _chessPieces[16][16][1] = -1; // [16][16] 棋盤大小:15 * 15,[1] 黑白棋子 (-1 沒有棋子,0 白色棋子,1 黑色棋子)