从零开始再造打爆李世石的AlphaGo:围棋的基本规则和代码设计思路

从本节开始,咱们将从零开始,一行一行代码的编写,直到完整设计出当年击垮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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索