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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tyler_download/article/details/88036387

从本节开始,我们将从零开始,一行一行代码的编写,直到完整设计出当年击垮13次世界围棋冠军李世石的AlphaGo,幸运的是,在人工智能思维下,我们不需要成为围棋高手就能设计出AlphaGo,例如我对围棋就一窍不通。我们只需要掌握围棋的若干条基本规则,然后你熟悉Python代码的编写,当然也需要你具备深度学习的基本知识,好在这方面也有完善的教学视频,倘若你对深度学习的基本原理尚未掌握,你可以通过下面视频连接进行学习:

更多内容,请点击进入csdn学院

本节我们先了解围棋走法的基本规则,同时大概描述一下程序设计思路,下一节开始我们将开门见山,迅速动手写代码。围棋在所有棋类中难度最大,但有趣的是,它的规则几乎最简单,围棋充分体现了大道至简的原则。

围棋的棋盘有三种规格,分别为99,1313和19*19,它是由若干条横线和竖线交织而成的“田”字形网格:

屏幕快照 2019-02-28 下午3.29.01.png

棋子必须下在线的交叉点上而不能下在方块中间。围棋下子基本上没有任何约束,你下子的目的是尽可能的把对手的棋子给围住吃掉。比赛开始后,黑子先走。当你下的棋子把对方棋子全面包围时,对方被包围的棋子就可以你吃掉。

屏幕快照 2019-02-28 下午3.34.50.png

围棋的棋子间有个概念叫相连,在一个棋子上下左右四个位置有同一颜色的棋子时,连个棋子就相连,而相连具有传递性,如果A与B相连,B与C相连,那么A与C就相连。上图中加在两个白子中间的黑子与它上方的黑子相连,而上方黑子与它右边的黑子相连,于是三个黑子相连成一个集合。相连要看上下左右四个位置而不能看对角线,如果上图去掉第二行最左边的黑棋,剩下的两个棋子就不相连。

一个棋子上下左右四个位置中没有被对方棋占据的位置叫“自由点”,这些概念是我自己构造的,不对应专业术语,能说清楚问题即可,例如上图中小方块标注的位置就是3个黑旗的“自由点”,当上图中小方块的位置被白棋占据,那么黑棋就被堵死,于是就能从棋盘上拿掉。围棋有两个目的,就是尽可能的占地盘和吃掉对方棋子。

在围堵对方时,可能会出现一些特殊情况:

屏幕快照 2019-02-28 下午3.47.44.png

在上图左边白棋形成两个”眼“A和B,这种情况下黑棋就无法吃掉白棋。因为无论你下在A还是B,白棋都存在一个自由点,因此黑棋无论如何都形不成对白旗的围堵,除非白棋足够蠢能让黑棋连续堵住这两个点。

而右边则不同,黑棋只要堵住C点,白棋就没有任何自由点,于是所有白棋就全被黑棋吃掉。因此下棋时你不能下在没有自由点的位置,除非你能形成围堵把对方棋子吃掉。

当结束时,需要计算双方的分数以便决定胜负。首先要计算死棋,也就是无法形成两眼的棋子集合,或者是那些不可能再有自由点的棋子集合,死棋被认为是给对方吃掉了。

围棋有两种计分法,一种是领土计分。棋盘上任何上下左右都被你的棋围住的点叫领土点,计一分,对方每个被你吃掉的棋子也计一分。第二种叫区间计分,棋盘上任何一个上下左右被你的棋子占据的空余点计一分,你在棋盘上还剩下的棋子各计一分,通常情况下两种计分法会得出相同的结果。在程序设计时,我们采用第二种计分法。

屏幕快照 2019-02-28 下午4.04.59.png

根据上图,我们计算一下黑白两棋得分,其中大×的棋就是死棋,三角形对应的是黑棋的领土点,正方形占据的是白棋的领土点。对于第二个落子的人,在使用领土计分时它会获得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需要注意,那就是规则要防止局面进入死循环,如下图:
屏幕快照 2019-02-28 下午4.33.40.png

如上图右边,当黑子下了后会把A点处的白子吃掉。此时规则禁止白棋下在A点,因为那会把上方的黑棋吃掉,于是棋盘回滚到上一个状态,如此就会让棋局陷入死循环。白子必须下在除了A点之外的另一处,然后后续步骤中,白子才允许重新下在A点。因此黑棋基本上有机会把A点堵上,除非白棋下得很巧妙,让黑棋不得不放弃堵住A点。

有关棋类的编程设计大多基于“树搜索”:

屏幕快照 2019-02-28 下午4.48.56.png

首先代码先评估当前有几种走法,然后分别模拟给定走法,也就是上图第二层。然后代码继续评估对方有多少种走法,也就是上图第三层,然后根据对方给定走法后在一次评估本方有多少种走法,我们看上图最下方的箭头已经有很多个了,随着层数的增加,箭头数将呈现指数级扩张。

很多棋类,例如象棋,国际象棋,五子棋等都可以依靠树搜索进行,唯独围棋不行,那是因为围棋根据树搜索,围棋将会呈现出爆炸式增长,使得计算机根本无法在给定时间内进行计算,围棋搜索数如下:

分支.png

根据运算国际象棋在树搜索经过4步后,树的分叉有八十一万,而对围棋而言是四十亿,经过5步后,国际象棋有两千四百万分叉,而对围棋而言是一万亿,因此用树搜索编写围棋程序,经过七八步之后树的分叉会超过全宇宙所有原子数量的总和!

因此常规做法无法完成围棋程序。在深度学习技术成熟后,电脑才能够通过学习和运算,在这么多的分差中根据当前棋盘局面找出合理路径。在后续的课程中,我们将利用树搜索,蒙特卡洛搜索,深度学习,增强性学习等多种技术组合在一起,从而打造出一个与当初AlphaGo一样强大的围棋智能程序。

更多内容,请点击进入csdn学院

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/tyler_download/article/details/88036387
今日推荐