AI實現五子棋機械人(一)

2022-01-15 16:48:01 字數 2307 閱讀 8135

前言:

在這個 ai 的浪尖風口上,借助我對遊戲領域的熱愛,在工作餘外的時間喚起了我的想法,學習 ai 實現乙個五子棋機械人。

一、五子棋介紹

先說說五子棋吧,通常大家玩的五子棋分為帶禁手和不帶禁手兩個版本,

(前者稱之為連珠renju

,後者一般稱之為五子棋gomoku

然而無論哪乙個版本,先手黑棋均必勝。

(所謂黑必勝的意思是,只要黑棋按照一定的方式下,白棋選擇棋盤上的任何乙個點都不可能贏棋。)

(禁手規則增加程式複雜度,暫不考慮加入)

2023年victor allis通過程式設計證明不帶禁手的五子棋,黑必勝。

2023年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 設計師。

其實也是機器學習在影象領域的應用,通過迴圈訓練的方式。

蒙特卡羅數搜尋(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 黑色棋子)

Python實現AI五子棋

開發工具 python版本 3.6.4 graphics模組。環境搭建 安裝python並新增到環境變數即可。注 graphics模組在相關檔案中已經提供,就是乙個py檔案,直接放在當前路徑或者放到python安裝資料夾下的site packages資料夾內均可。原理簡介 對於五子棋這樣的博弈類ai...

五子棋 AI篇

效果圖 贏法陣列 var wins 第count種贏法 var count 0 贏法的統計陣列 var mywin var computerwin 結束標識 var gameover false var chess document.getelementbyid chess var me true ...

五子棋AI演算法簡易實現(五)

這個部分我把它分成了兩個函式 1.找出雙方所有可能下子的位置 generateallnextpossiblemove函式 2.在這些位置中進行挑選,選出能夠產生更大優勢的下子位置,減少博弈樹搜尋節點的次數 pointsfilter函式 2.2 落子位置的篩選這一部分主要參考了 這篇部落格上的寫法,這...