從本節開始,咱們將從零開始,一行一行代碼的編寫,直到完整設計出當年擊垮13次世界圍棋冠軍李世石的AlphaGo,幸運的是,在人工智能思惟下,咱們不須要成爲圍棋高手就能設計出AlphaGo,例如我對圍棋就一竅不通。咱們只須要掌握圍棋的若干條基本規則,而後你熟悉Python代碼的編寫,固然也須要你具有深度學習的基本知識,好在這方面也有完善的教學視頻,假若你對深度學習的基本原理還沒有掌握,你能夠經過下面視頻鏈接進行學習:算法
學習掌握深度學習知識原理,請點擊連接編程
本節咱們先了解圍棋走法的基本規則,同時大概描述一下程序設計思路,下一節開始咱們將開門見山,迅速動手寫代碼。圍棋在全部棋類中難度最大,但有趣的是,它的規則幾乎最簡單,圍棋充分體現了大道至簡的原則。微信
圍棋的棋盤有三種規格,分別爲99,1313和19*19,它是由若干條橫線和豎線交織而成的「田」字形網格:學習
棋子必須下在線的交叉點上而不能下在方塊中間。圍棋下子基本上沒有任何約束,你下子的目的是儘量的把對手的棋子給圍住吃掉。比賽開始後,黑子先走。當你下的棋子把對方棋子全面包圍時,對方被包圍的棋子就能夠你吃掉。人工智能
圍棋的棋子間有個概念叫相連,在一個棋子上下左右四個位置有同一顏色的棋子時,連個棋子就相連,而相連具備傳遞性,若是A與B相連,B與C相連,那麼A與C就相連。上圖中加在兩個白子中間的黑子與它上方的黑子相連,而上方黑子與它右邊的黑子相連,因而三個黑子相連成一個集合。相連要看上下左右四個位置而不能看對角線,若是上圖去掉第二行最左邊的黑棋,剩下的兩個棋子就不相連。spa
一個棋子上下左右四個位置中沒有被對方棋佔據的位置叫「自由點」,這些概念是我本身構造的,不對應專業術語,能說清楚問題便可,例如上圖中小方塊標註的位置就是3個黑旗的「自由點」,當上圖中小方塊的位置被白棋佔據,那麼黑棋就被堵死,因而就能從棋盤上拿掉。圍棋有兩個目的,就是儘量的佔地盤和吃掉對方棋子。.net
在圍堵對方時,可能會出現一些特殊狀況:設計
在上圖左邊白棋造成兩個」眼「A和B,這種狀況下黑棋就沒法吃掉白棋。由於不管你下在A仍是B,白棋都存在一個自由點,所以黑棋不管如何都形不成對白旗的圍堵,除非白棋足夠蠢能讓黑棋連續堵住這兩個點。3d
而右邊則不一樣,黑棋只要堵住C點,白棋就沒有任何自由點,因而全部白棋就全被黑棋吃掉。所以下棋時你不能下在沒有自由點的位置,除非你能造成圍堵把對方棋子吃掉。orm
當結束時,須要計算雙方的分數以便決定勝負。首先要計算死棋,也就是沒法造成兩眼的棋子集合,或者是那些不可能再有自由點的棋子集合,死棋被認爲是給對方吃掉了。
圍棋有兩種計分法,一種是領土計分。棋盤上任何上下左右都被你的棋圍住的點叫領土點,計一分,對方每一個被你吃掉的棋子也計一分。第二種叫區間計分,棋盤上任何一個上下左右被你的棋子佔據的空餘點計一分,你在棋盤上還剩下的棋子各計一分,一般狀況下兩種計分法會得出相同的結果。在程序設計時,咱們採用第二種計分法。
根據上圖,咱們計算一下黑白兩棋得分,其中大×的棋就是死棋,三角形對應的是黑棋的領土點,正方形佔據的是白棋的領土點。對於第二個落子的人,在使用領土計分時它會得到6.5分作補償,在使用區間計分時會得到7.5分作補償。多餘的0.5分是爲了防止出現平局。
根據上面棋盤咱們算一下雙方得分。白棋有兩個✘,對應死棋,同時還有一個棋被黑棋吃掉(在上面沒有顯示出來),所以黑棋至關於吃掉白棋三個子,而黑棋有兩個帶✘是死棋,至關於被白子吃掉。
三角形有10個,同時被兩個帶✘白棋佔據的位置,總共有12個領土點屬於黑棋。上圖有15個小方塊,再加上兩個帶✘黑棋佔據的位置,所以白棋的領土點有17個。
除去兩個帶✘死棋,黑棋還剩27個子。除去兩個帶✘白棋,白棋還剩25個子。按照領土計分法,若是白棋是後走,白棋得分是17個領土點+2個死棋+6.5分補償=25.5分。黑棋得分是12個領土點+2個死棋+1個吃掉的白棋(沒有在上圖顯示)=15分
按照區域計分法,白棋有17個領土點+剩餘25子+7.5補償分=49.5分。黑棋有12個領土點+剩餘27子=39分,不管何種算法,白棋都被黑棋多出10.5分。在最終結果出來前,若是一方以爲本身沒但願了,隨時能夠投子認負。
其中還有一種狀況叫ko須要注意,那就是規則要防止局面進入死循環,以下圖:
如上圖右邊,當黑子下了後會把A點處的白子吃掉。此時規則禁止白棋下在A點,由於那會把上方的黑棋吃掉,因而棋盤迴滾到上一個狀態,如此就會讓棋局陷入死循環。白子必須下在除了A點以外的另外一處,而後後續步驟中,白子才容許從新下在A點。所以黑棋基本上有機會把A點堵上,除非白棋下得很巧妙,讓黑棋不得不放棄堵住A點。
有關棋類的編程設計大多基於「樹搜索」:
首先代碼先評估當前有幾種走法,而後分別模擬給定走法,也就是上圖第二層。而後代碼繼續評估對方有多少種走法,也就是上圖第三層,而後根據對方給定走法後在一次評估本方有多少種走法,咱們看上圖最下方的箭頭已經有不少個了,隨着層數的增長,箭頭數將呈現指數級擴張。
不少棋類,例如象棋,國際象棋,五子棋等均可以依靠樹搜索進行,惟獨圍棋不行,那是由於圍棋根據樹搜索,圍棋將會呈現出爆炸式增加,使得計算機根本沒法在給定時間內進行計算,圍棋搜索數以下:
根據運算國際象棋在樹搜索通過4步後,樹的分叉有八十一萬,而對圍棋而言是四十億,通過5步後,國際象棋有兩千四百萬分叉,而對圍棋而言是一萬億,所以用樹搜索編寫圍棋程序,通過七八步以後樹的分叉會超過全宇宙全部原子數量的總和!
所以常規作法沒法完成圍棋程序。在深度學習技術成熟後,電腦纔可以經過學習和運算,在這麼多的分差中根據當前棋盤局面找出合理路徑。在後續的課程中,咱們將利用樹搜索,蒙特卡洛搜索,深度學習,加強性學習等多種技術組合在一塊兒,從而打造出一個與當初AlphaGo同樣強大的圍棋智能程序。
更多配套課程請點擊’閱讀原文‘
本文分享自微信公衆號 - Coding迪斯尼(gh_c9f933e7765d)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。