版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址http://www.cnblogs.com/Colin-Cai/p/7502410.html 作者:窗户QQ:6679072E-mail:6679072@qq.com

  

  提到这个名字,很多人会想到前段时间让全世界振奋的围棋人工智能Alphago,想曾经我也了解过一些围棋的AI。我也正想花点时间说说alphago相关的东西,包括alphago的架构以及模型引申等,不过这篇文章里我只说围棋规则的实现,和人工智能无关。

  规则

  说到围棋规则的实现不得不先说围棋规则,一般来说,至少有三种围棋规则:中国规则,日本规则,应氏规则。其实还有中国古代规则,和这三种规则都有一点差别。应氏规则和中国规则实际差距非常非常小,小到很多人认为可以忽略不计。但中国规则和日本规则的差别有些大,个人认为中国规则更科学,日本规则不收单官导致了很多问题,比如盘角曲四算死棋(这一点个人觉得挺让人吐血,因为如果盘角曲四和双活同在,那盘角曲四的死毫无道理),再比如不提三目(这个简直就是强盗逻辑了,至于什么叫不提三目,请自行搜索)。从这一点上,至少中国规则不会导致这样的争议,一切实战解决。另外一点,日本规则的双活不算目,这个给计算机数目带来了问题,并且不容易解决。所以,本篇还是基于中国规则。

  基本数据结构

  很自然的就可以想到,可以用一个19X19的二维数组来代表棋盘上当前的棋面(一般称枰面)。棋盘上的每个点可以有三种状态:无子、黑子、白子。那么,这个19X19的二维数组就是基本的数据结构。

  下棋

  从第一步开始,黑白轮流下,无论对于谁下,其实都是要判断这个二维数组所下坐标下的点的状态是不是无子,如果不是无子,当然是不允许下的。

  另外一点,还有一个气紧的问题,就是说,把自己的一块棋走成没有气是不允许的(应氏规则除外,它可自杀),除非可以吃子。气紧和吃子最终可以归结为一个算法:判断连通的一块棋有没有气。这里连通的一块棋是狭义的,只是通过横竖紧密的连在一起的才是一块棋。

  

  如上图,左边7个黑子紧密的连在一起,我们称之未一块。右边这个中心标记为红色的黑子,却不是属于这一块的。

  看起来稍微形式化一点的定义如下:

  先定义坐标相邻,(A,B)与(C,D)相邻的意思是A=C且|B-D|=1,或者B=D且|A-C|=1

  坐标(A,B)所在的一块棋是一个坐标的集合S;

  坐标(A,B)在S内,坐标(C,D)与(A,B)相邻,并且(C,D)坐标上有棋子且棋子颜色和(A,B)一致,那么(C,D)也在S内。

  以上的内容很像连通图的定义,实际上,如果把相邻的同色子的连线当成图的边,那么连通的一块棋实际上就是连通图,那么判断一块棋有没有气可以利用连通图的遍历,只是如果发现在遍历的过程中找到一颗棋子有气,那么整块棋子都有气。

  要注意打劫,打劫的时候不可立即回提。

  

  如上图即为打劫。

  打劫至少有两种简单的判断手段:

  (1)当出现提1子时,记录当前子的坐标和提子的坐标;若下棋的时候,只提一子,并且上一步对方也是提一子,并且当前子的坐标就是上一步提子坐标,当前提子坐标就是上一步下的棋子坐标,那么则是打劫回提,是犯规的。

  (2)每一步都记录当前的棋面。如果当前下完棋子之后,棋面和上一步没下时一模一样,则是打劫回提。

  打劫是一种绝对需要避免的同局再现,至于三劫、四劫、长生、双提这一类导致无胜负的局面,则可以用记录每一次的棋面,然后与几次之前的进行对比,如果存在相同,也就是同局再现,可以判断是无胜负,基本同判断打劫的算法2,只是不是和上一步的比。

  计算

  最终计算胜负的时候,自动算十分复杂,之前网络上的围棋对战平台程序也是反复改进了很久才准确。我们这里只讨论手动的方式。

  首先是点掉死子。手动一个个的点掉死子自然可以,但效率太低,一般都是一点就点掉“连同”的一片死子。

  

  如图中两块死子,是希望清除其中一个子就清除掉所有其他“连通”的。

  这里的连通概念和上面连通的一块棋有点不同,这里的连通是同一个颜色或者空格在一起的一块,而之前的只强调一个颜色的一块。

  比如上面的图的上面那块权掉白棋死子所在的连通块是5个白子加旁边六个空格。

  

  其实依然是图,只是遍历图的时候边的定义改了一下,之前是相邻棋子颜色相同则是边,现在是相邻两个左边不出现不是死子颜色的是边。

  这样就可以遍历死子,确定一个死子坐标,就可以扫掉所有与之“相连”的死子。

  点掉所有死子之后数空定胜负。数空还是利用连通图,只是这里连同图指的是空格。如果空格的连通图在遍历中发现只和黑子相邻则是黑子的空,只和白子相邻则是白子的空,和黑白都有相邻则是公气,计算时得一方一半才可。数空是要依次遍历所有的空格连通图,直到整个棋盘上所有的空格都属于某个遍历出来的连通图。

  遍历连通图

  上面基本所有的算法都可以归结于连通图的遍历。图的遍历一般有深度遍历和广度遍历,围棋这里算连通图采用广度遍历比较方便。

  需要一个数据结构来记录哪些坐标被遍历过了,防止重复遍历,每次遍历了坐标之后就记录下,这个数据结构以二维数组最合适。

  建立一个空队列,然后把开始遍历的第一个坐标进队。

  从遍历的第一个位置开始,每次把这个位置相邻的坐标中所有与之相连并且没有遍历过的点(注意相连在不同的判断里意义不同)进队,并把当前坐标出队,同时记录该坐标已遍历。

  如此循环,直到队空,则已遍历了整个连通图。

  

  

转载于:https://www.cnblogs.com/Colin-Cai/p/7502410.html

围棋规则的计算机实现相关推荐

  1. 围棋提子后的子放哪_围棋入门知识点:围棋规则 —— 禁入点

    对于围棋初学者而言,围棋规则十分简单,但有些场景却怎么也弄不明白.禁入点的判断,就是基础规则中最有代表性的一个例子.如图所示:      图1                    图2        ...

  2. 翻译Deep Learning and the Game of Go(3)第2章:围棋是一个机器学习难题(规则部分就不翻了)

    本章涵盖 为什么游戏是AI的好项目? 为什么围棋是深度学习的难题? 围棋的规则是什么? 您可以通过机器学习解决游戏的哪些方面? 2.1 为什么要用游戏? 游戏是AI研究中最喜欢的主题,而不仅仅是因为它 ...

  3. AI与人类围棋士的差距到底有多大?

    来源:计算广告 四年前,谷歌旗下DeepMind公司开发的围棋人工智能AlphaGo以4-1战胜韩国大国手李世乭九段. 今天,AlphaGo在大众视野中掀起的惊涛骇浪已渐平息,AlphaGo和李世乭都 ...

  4. 被清华免试录取的围棋天才,横扫60位围棋大师的最强AI,竟然都输给了高中生!?...

    全世界只有3.14 % 的人关注了 爆炸吧知识 术业有专攻 前不久,漫改剧<棋魂>的热播,让围棋狠狠火了一把. 图片来源于豆瓣 火到什么程度?有网友看完直接就打开了B站的围棋教程. 但大部 ...

  5. “阿法狗”之父:关于围棋,人类3000年来犯了一个错

    读:AlphaGo之父杰米斯·哈萨比斯(Demis Hassabis),2017年的时候曾在母校英国剑桥大学做了一场题为"超越人类认知的极限"的演讲,解答了世人对于人工智能.对于阿 ...

  6. 百度正用谷歌AlphaGo,解决一个比围棋更难的问题 | 300块GPU在燃烧

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 9102年,人类依然不断回想起围棋技艺被AlphaGo所碾压的恐怖. 却也有不以为然的声音:只会下棋的AI,再厉害也还是个运动员啊! 百度 ...

  7. 稳定的围棋服务器,中国古典围棋服务器对奕说明

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 感谢自由软件运动带来的源代码自由分享使我们有机会设置自己的服务器.谢谢nngs的所有开发者和支持者. 这个服务器代码完全基于遵循GPL2许可协议的nngs ...

  8. Katago+Sabaki个人围棋AI工具安装配置

    作为亲身经历第一届中日围棋擂台赛的菜鸟老棋迷和1995年拥有第一台自己电脑的IT从业人员,AlphaGo出现后经历了两年多的震惊.关注.学习.羡慕,直到出现了Leela和Katago等开源围棋AI,终 ...

  9. 解密Google Deepmind AlphaGo围棋算法:真人工智能来自于哪里?

    2016年1月28日,Google Deepmind在Nature上发文宣布其人工智能围棋系统AlphaGo历史性的战胜人类的职业围棋选手!这条重磅新闻无疑引起了围棋界和人工智能界的广泛关注!3月份A ...

  10. “阿法狗”之父:关于围棋,人类3000年来犯了一个错!

    AlphaGo与柯洁之战开始之前一个多月,AlphaGo之父杰米斯·哈萨比斯(Demis Hassabis)在其母校英国剑桥大学做了一场题为"超越人类认知的极限"的演讲,解答了世人 ...

最新文章

  1. ZOJ2158,POJ1789
  2. P4342:[IOI1998]Polygon(区间dp)
  3. 关于客户端无法获得服务器端GP服务(Geoprocessing Service)结果的解决办法
  4. Python-接口开发入门
  5. docker Redis集群
  6. 网络通讯原理简介以及演示通讯过程
  7. Docker Compose如何与SkyEye完美结合
  8. javascript 刷新div_用 JavaScript 实现寻路算法 —— 编程训练
  9. 山西财经大学的计算机科学与技术怎么样,山西财经大学计算机科学与技术专业2017年在福建理科高考录取最低分数线...
  10. bcc语料库下载_CCL语料库与BCC语料库各自的特点是什么?
  11. matlab怎么创建数组对象,数组 – matlab初始化对象数组
  12. 功能设计:如何实现一个扫码上传附件的功能
  13. 51单片机定时器流水灯控制
  14. centos7开机无法进入图形界面,出现 sda assuming drive cache write through
  15. 连续仨月霸占牛客榜首,京东T8呕心巨作:700页JVM虚拟机实战手册
  16. Wireshark之攻击流量分析
  17. 神奇的主力成本线!居然能将主力成本运筹帷幄?!
  18. 计算机编程ebcdic码,EBCDIC和BCD码
  19. Android 带你玩转实现游戏2048 其实2048只是个普通的控件
  20. js实现实时问候,不同时间显示不同问候语

热门文章

  1. 阿里云kafka安装
  2. 深入理解计算机系统 csapp 家庭作业(第三章完整版)
  3. mysql消除冗余_mysql剔除冗余数据
  4. 电脑双系统怎么删除一个呢?教你快速删除
  5. python标点符号换成空格_产品:“这输入框所有标点符号替换成空格!”
  6. pytorch中维度dim的理解
  7. 38、稀疏矩阵的十字链表表示和创建
  8. Notes V11内存不足?
  9. SOLIDWORKS产品设计学习
  10. linux 配置局域网内部www服务器,局域网内部邮件服务器搭建方法