天天看點

從零開始再造打爆李世石的AlphaGo:圍棋的基本規則和代碼設計思路

從本節開始,我們将從零開始,一行一行代碼的編寫,直到完整設計出當年擊垮13次世界圍棋冠軍李世石的AlphaGo,幸運的是,在人工智能思維下,我們不需要成為圍棋高手就能設計出AlphaGo,例如我對圍棋就一竅不通。我們隻需要掌握圍棋的若幹條基本規則,然後你熟悉Python代碼的編寫,當然也需要你具備深度學習的基本知識,好在這方面也有完善的教學視訊,倘若你對深度學習的基本原理尚未掌握,你可以通過下面視訊連接配接進行學習:

更多内容,請點選進入csdn學院

本節我們先了解圍棋走法的基本規則,同時大概描述一下程式設計思路,下一節開始我們将開門見山,迅速動手寫代碼。圍棋在所有棋類中難度最大,但有趣的是,它的規則幾乎最簡單,圍棋充分展現了大道至簡的原則。

圍棋的棋盤有三種規格,分别為99,1313和19*19,它是由若幹條橫線和豎線交織而成的“田”字形網格:

從零開始再造打爆李世石的AlphaGo:圍棋的基本規則和代碼設計思路

棋子必須下線上的交叉點上而不能下在方塊中間。圍棋下子基本上沒有任何限制,你下子的目的是盡可能的把對手的棋子給圍住吃掉。比賽開始後,黑子先走。當你下的棋子把對方棋子全面包圍時,對方被包圍的棋子就可以你吃掉。

從零開始再造打爆李世石的AlphaGo:圍棋的基本規則和代碼設計思路

圍棋的棋子間有個概念叫相連,在一個棋子上下左右四個位置有同一顔色的棋子時,連個棋子就相連,而相連具有傳遞性,如果A與B相連,B與C相連,那麼A與C就相連。上圖中加在兩個白子中間的黑子與它上方的黑子相連,而上方黑子與它右邊的黑子相連,于是三個黑子相連成一個集合。相連要看上下左右四個位置而不能看對角線,如果上圖去掉第二行最左邊的黑棋,剩下的兩個棋子就不相連。

一個棋子上下左右四個位置中沒有被對方棋占據的位置叫“自由點”,這些概念是我自己構造的,不對應專業術語,能說清楚問題即可,例如上圖中小方塊标注的位置就是3個黑旗的“自由點”,當上圖中小方塊的位置被白棋占據,那麼黑棋就被堵死,于是就能從棋盤上拿掉。圍棋有兩個目的,就是盡可能的占地盤和吃掉對方棋子。

在圍堵對方時,可能會出現一些特殊情況:

從零開始再造打爆李世石的AlphaGo:圍棋的基本規則和代碼設計思路

在上圖左邊白棋形成兩個”眼“A和B,這種情況下黑棋就無法吃掉白棋。因為無論你下在A還是B,白棋都存在一個自由點,是以黑棋無論如何都形不成對白旗的圍堵,除非白棋足夠蠢能讓黑棋連續堵住這兩個點。

而右邊則不同,黑棋隻要堵住C點,白棋就沒有任何自由點,于是所有白棋就全被黑棋吃掉。是以下棋時你不能下在沒有自由點的位置,除非你能形成圍堵把對方棋子吃掉。

當結束時,需要計算雙方的分數以便決定勝負。首先要計算死棋,也就是無法形成兩眼的棋子集合,或者是那些不可能再有自由點的棋子集合,死棋被認為是給對方吃掉了。

圍棋有兩種計分法,一種是領土計分。棋盤上任何上下左右都被你的棋圍住的點叫領土點,計一分,對方每個被你吃掉的棋子也計一分。第二種叫區間計分,棋盤上任何一個上下左右被你的棋子占據的空餘點計一分,你在棋盤上還剩下的棋子各計一分,通常情況下兩種計分法會得出相同的結果。在程式設計時,我們采用第二種計分法。

從零開始再造打爆李世石的AlphaGo:圍棋的基本規則和代碼設計思路

根據上圖,我們計算一下黑白兩棋得分,其中大×的棋就是死棋,三角形對應的是黑棋的領土點,正方形占據的是白棋的領土點。對于第二個落子的人,在使用領土計分時它會獲得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需要注意,那就是規則要防止局面進入死循環,如下圖:

從零開始再造打爆李世石的AlphaGo:圍棋的基本規則和代碼設計思路

如上圖右邊,當黑子下了後會把A點處的白子吃掉。此時規則禁止白棋下在A點,因為那會把上方的黑棋吃掉,于是棋盤復原到上一個狀态,如此就會讓棋局陷入死循環。白子必須下在除了A點之外的另一處,然後後續步驟中,白子才允許重新下在A點。是以黑棋基本上有機會把A點堵上,除非白棋下得很巧妙,讓黑棋不得不放棄堵住A點。

有關棋類的程式設計設計大多基于“樹搜尋”:

從零開始再造打爆李世石的AlphaGo:圍棋的基本規則和代碼設計思路

首先代碼先評估目前有幾種走法,然後分别模拟給定走法,也就是上圖第二層。然後代碼繼續評估對方有多少種走法,也就是上圖第三層,然後根據對方給定走法後在一次評估本方有多少種走法,我們看上圖最下方的箭頭已經有很多個了,随着層數的增加,箭頭數将呈現指數級擴張。

很多棋類,例如象棋,國際象棋,五子棋等都可以依靠樹搜尋進行,唯獨圍棋不行,那是因為圍棋根據樹搜尋,圍棋将會呈現出爆炸式增長,使得計算機根本無法在給定時間内進行計算,圍棋搜尋數如下:

從零開始再造打爆李世石的AlphaGo:圍棋的基本規則和代碼設計思路

根據運算國際象棋在樹搜尋經過4步後,樹的分叉有八十一萬,而對圍棋而言是四十億,經過5步後,國際象棋有兩千四百萬分叉,而對圍棋而言是一萬億,是以用樹搜尋編寫圍棋程式,經過七八步之後樹的分叉會超過全宇宙所有原子數量的總和!

是以正常做法無法完成圍棋程式。在深度學習技術成熟後,電腦才能夠通過學習和運算,在這麼多的分差中根據目前棋盤局面找出合理路徑。在後續的課程中,我們将利用樹搜尋,蒙特卡洛搜尋,深度學習,增強性學習等多種技術組合在一起,進而打造出一個與當初AlphaGo一樣強大的圍棋智能程式。

更多内容,請點選進入csdn學院

更多技術資訊,包括作業系統,編譯器,面試算法,機器學習,人工智能,請關照我的公衆号:

從零開始再造打爆李世石的AlphaGo:圍棋的基本規則和代碼設計思路

繼續閱讀