实现一个围棋软件 | 版本与组成
软件版本与围棋软件的组成
01
软件版本
考虑到Python在机器学习和人工智能领域使用的广泛性和便利性,本系列文章使用Python语言来实现智能算法。现代软件工程方法可以说是日新月异,有时候各个软件包或者程序库的版本不一致,会导致代码无法运行,所以在最开始先固定好代码使用软件的版本可以最大限度地避免由于版本混乱导致的一系列运行问题。同时为了示范和演示的方便,本系列文章使用Windows操作系统来实现软件代码的编写,Python虽然支持多种操作系统,但是由于操作系统的差别,Python在个别函数上的表现会不一样,这一点需要使用其他操作系统的读者留意。如果由于软件版本的问题导致运行时报错,需要读者自行进行调整。
如果读者同时在Windows下安装了Python 2.x和Python 3.x,可以在运行时使用py-2或者py-3来指明自己是使用Python的哪个大版本。
关键软件版本清单:Windows 7(64位)、Python 3.7.6(AMD64)、TensorFlow 2.1.0。
推荐初学者安装与上面列表中相同的软件版本,本系列文章中的演示代码会尽量考虑到代码对不同软件版本的兼容性。推荐和鼓励读者使用其他计算机编程语言来复刻全部内容。Python的运行速度不是太快,所以本系列文章代码只能起到演示和说明的作用,并不适合投入实际生产当中使用。当然Python也有其优势,特别是在矩阵运算上处理非常方便,这个优秀功能可能继承自MATLAB或者R语言。
Keras是一个由Python编写的开源人工神经网络库,文章中关于神经网络的代码均基于它来实现。Keras框架现在已集成到了TensorFlow 2.x版本中。还在使用TensorFlow 1.x版本的计算机上需要额外安装Keras。本系列文章使用TensorFlow 2以上的版本,所以没有显式地指明Keras版本。
Windows下Python 2.7版本的标准软件库里已经下载不到可以使用的TensorFlow了,但是Linux的2.7版本还不受影响。
02
围棋软件的组成
Python是面向对象的语言,为了体现出这种编程方式的优越性,需要先把下围棋这件事情从现实系统中抽象出来。以如图2-1所示柯洁在2017年对战AlphaGo为例,这场对局出场的人物有柯洁、代AlphaGo执棋的一名专业棋手以及裁判(公证人)。使用的道具为一副木制棋盘以及配套的棋子。从图2-1中可以看出,下围棋这件事情一共至多需要三个相互独立的参与方,分别是棋盘、棋手和裁判。因此可以用棋盘类、棋手类和裁判类来分别对应这三个参与方,同时这三个类也是自制围棋软件中最核心的类。通过棋盘类可以记录棋手在棋盘上的落子并提供展示功能。棋手类负责根据棋盘盘面和自己的下棋策略在棋盘上落子。而裁判类则负责对棋手的落子意图进行规则判断,如果棋手的落子行为违反了游戏规则就阻止其在棋盘上落子。
■ 图2-1柯洁和AlphaGo的围棋对弈
下面将分别对这三个类进行初始化并设计相关的类方法,并顺便介绍了一种抽象棋子的方法。
围棋的棋盘比较简单,通常包含纵向与横向各19条横线。有时候19路棋盘可能太大了,人们也会缩小棋盘的规模,9路棋盘是最常见的围棋棋盘简化尺寸。据说最早的围棋棋盘是17路的,同时也有考古发现过13路的棋盘。因此,在实现棋盘类的时候不特意限制其尺寸,但是采用19路棋盘作为其默认值。一副完整的棋具除了棋盘还应该有棋子,虽然不专门为棋子设立一个程序类,但是为了方便记录棋盘上的落子情况,棋盘类里还需要专门设置存放当前棋盘盘面的变量。围棋的规则不多,禁止全局同形是其中比较重要的一条,技术上可以使用佐布里斯特散列来提取每一回合棋局盘面的特征值,通过比较历史记录来避免一局对弈中出现两次相同的棋盘盘面。代码片段2-1是创建棋盘实例时使用的类的初始化定义。
【代码片段2-1】定义棋盘类。
说明 /
(1) 棋盘默认采用标准的19路棋盘。
(2) 把棋盘放入笛卡儿坐标系里来看,棋盘的左下角为原点(0,0)。
(3) 记录棋盘上每个落子点属于哪一个棋串。围棋的子要连在一起才能表现出威力,引入棋串概念方便后续的逻辑判断。
(4) 佐布里斯特散列(Zobristhas Hinging),和MD5的作用一样,可以用来签名(特征值提取),因此也叫佐布里斯特签名。佐布里斯特散列常用在棋类游戏中用来记录每一回合的棋盘局面情况。很多棋类(不包括围棋)还使用这个散列来协助辨识蒙特卡罗树搜索时棋盘的状态,从而避免重复计算浪费计算资源。
(5) 存放一局对战的全部落子记录。
(6) 存放一局对战全部局面的佐布里斯特散列记录。
围棋只有两个人实际参与对抗,程序需要区分出智能体是执黑方还是执白方。虽然大部分智能逻辑需要在这个类里实现,但是它的初始化定义却相当简单。代码片段2-2是实例化智能体时用到的类的初始化定义。
【代码片段2-2】定义智能体类。
说明 /
(1) 用智能算法来代替下围棋的人,智能算法在这个类里实现。
(2) 智能体的初始化很简单,只需要告诉它此局对战使用的是黑棋还是白棋。
实际上,裁判类并不是必需的。除了正规比赛,胜负的判断可以由下棋的双方自行商定。而对于落子位置是否合法的校验也可以交由对弈的双方棋手自己判断。MyGo专门把裁判抽象出来作为一个工具类,目的是方便判断棋局的胜负以及落子的合法性等。读者可以不实现这个类,而把其中的功能放在另外两个类里实现。这个类由于是纯粹的工具类,可以不需要对其进行初始化设置,代码片段2-3演示了如何利用Python的classmethod装饰符使其不需要实例化就可以直接使用。
【代码片段2-3】裁判类的装饰符。
说明 /
(1) 裁决当前的落子是否符合围棋游戏的规则和一些人为定制的规则。
(2) 裁决下一回合该哪一方落子。
(3) 裁决当前棋局的胜负情况,是否终局或者双方继续行棋。
围棋规则的所有胜负计算都是围绕棋子展开的,棋子作为棋盘的附属有着举足轻重的作用。棋子一旦落在棋盘上就需要时刻去关心它的死活情况,棋盘上单个围棋棋子有4口气,两个棋子连在一起就有6口气,气多的棋子不容易被对方提掉也不容易受到对方的攻击,所以围棋落子的策略之一就是尽可能地使己方的棋子连贯。为了减少计算每颗棋子死活的复杂度,代码片段2-4专门抽象出了一个表示棋串的类。棋串在第1章
已经介绍过,棋串就是连在一起的棋子。棋串的最小单位是单枚棋子。
【代码片段2-4】棋串类的定义。
说明 /
(1) 记录该棋串属于白棋还是黑棋。
(2) 记录棋串中每个子的位置。
(3) 记录一组棋串的每个气的位置。
(4) 为棋串建立合并的方法。例如,围棋的“接”就是把原来断开的棋子连成不可分割的整体,每当下出“接”时,就应该调用这里的merge()方法。
为了方便区分下棋的双方(执黑还是执白),代码片段2-5额外引入一个表示棋子颜色的枚举类。这个类不是必需的,仅仅是为了使用上的方便。
【代码片段2-5】代表对弈双方的枚举类。
说明 /
(1) 继承枚举类Enum。如果不使用枚举方法,可以简单地用1表示执黑棋方,用-1表示执白棋方。
(2) 定义交换下棋方的方法。
03
参考书籍
本书主要内容
本书可视为一本以解决实际问题为导向的书籍,非常适合具备一定数学基础和Python基础的读者学习。读者可以在短时间内掌握本书中介绍的所有算法。
全书共分为三大部分,共有10章。
第一部分介绍计算机围棋的基础知识和传统的智能算法,包括第1~3章。
第1章围棋:黑白的世界,包括什么是围棋、围棋的规则、围棋的胜负判定方法以及围棋棋手棋力的介绍。
第2章实现一个围棋软件,包括本书使用的应用软件版本、围棋软件建模概述、佐布里斯特散列算法、实践围棋智能体、实践围棋棋盘、实践围棋规则判定和实践完整的围棋软件。
第3章传统的棋类智能,包括极小化极大算法的原理和应用举例、Alpha-Beta剪枝算法的原理和应用举例、棋类局面评估、蒙特卡罗模拟的原理和应用举例、传统监督学习的简要介绍以及对传统方法的讨论。
第二部分介绍基于神经网络的机器学习,包括第4~6章。
第4章机器学习入门,包括人工神经网络的基础知识介绍、优化神经网络和对其他人工智能方法的简介。
第5章第一个围棋智能体,包括对计算机围棋棋谱的介绍、对HDF5大数据存储文件格式的介绍、围棋智能体的数据模型、如何获取训练样本以及应用示例代码的演示。
第6章通用化围棋智能体程序,包括如何搭建自己的围棋对弈网络平台、如何让围棋智能体支持第三方围棋程序的调用,如何让围棋智能体在公开的网络平台上下棋。
第三部分介绍强化学习,包括第7~10章。
第7章策略梯度,包括原理、应用举例,并以此为基础实践围棋智能体。
第8章深度价值网络,包括传统Q-Learning、Sarsa及Sarsa-λ算法的原理、应用举例,并以此为基础实践围棋智能体。
第9章Actor-Critic算法,包括算法原理及如何实践围棋智能体。
第10章AlphaGo和AlphaZero,包括AlphaGo算法和AlphaZero算法原理,指导实践深度强化学习与蒙特卡罗树搜索相结合的算法。
本书特色
(1)问题驱动,由浅入深。
本书通过分解问题,由浅入深,逐步地对如何实践超越人类大师级水平的计算机棋类智能体的重要概念及原理进行讲解与探究,为读者更好地掌握其背后的计算机强化学习原理提供便利和支持。
(2)突出重点,强化理解。
本书结合作者多年的教学与实践经验,针对应用型本科的教学要求和学生特点,突出重点,深入分析,同时在内容方面全面兼顾知识的系统化要求。
(3)注重理论,联系实际。
本书为重要的知识点均配备了代码讲解,采用Python语言结合Keras和PyTorch工具库,通过对围棋智能体的代码实践,加深读者对机器学习,特别是强化学习的再认识。
(4)风格简洁,使用方便。
本书风格简洁明快,对于非重点的内容不做长篇论述,以便读者在学习过程中明确内容之间的逻辑关系,更好地掌握深度强化学习的内容。
实现一个围棋软件 | 版本与组成相关推荐
- 一个让围棋软件自动对弈的工具
银星围棋5的目录下有一个GTool2.exe,利用它可以让两个不同的具有人机对弈功能的围棋软件互相对弈,感觉类似于左右手互搏.:) 步骤简单介绍如下: 1)分别启动两个具有围棋对弈功能的软 ...
- bandizip最后一个无广告版本_【软件来了】这是个无广告的旧版知乎
近两天有新加入粉丝团队的小伙伴在询问G先生旧版App的事情,文章已发过很久,但是知乎的旧版本还是头一次分享给大家,所以G先生就找到了两个版本的旧版知乎,知乎V3.1和知乎V3.9这两个知乎都支持在最高 ...
- Linux打包软件版本带时间,带你写一个 linux 下的打包软件 tar
相信你对 linux 的 .tar.gz 有点熟悉,这就是先 tar 打包(.tar 后缀),再对此 tar 文件用 gzip 压缩(.tar.gz)的后缀名. 值得注意的是, tar 不是压缩软件, ...
- 软件版本命名规范(转载)
1. 软件版本阶段说明 * Base版: 此版本表示该软件仅仅是一个假页面链接,通常包括所有的功能和页面布局,但是页面中的功能都没有做完整的实现,只是做为整体网站的一个基础架构. * Alp ...
- 关于开源软件的书籍一定要尽量提供搭配好的软件版本
尝试spring live的那个例子,没有成功.一开始就遇到ant报错,没办法,只好换一个办法.拿出了前几天买的<项目实践精解:基于SSH的java开发>,跟着里面的例子做.这本书不是太好 ...
- javadoc: 错误 - 格式错误的语言环境名称_ONLYOFFICE 5.6.0 : 这是一个错误修正版本,改进了德语、法语、意大利语、葡萄牙语和俄语的翻译等...
ONLYOFFICE 5.6.0 从此版本开始,我们更改了DocumentServer的编号方案. 这是一个错误修正版本. 具有一系列新功能的下一个主要版本将是6.0.0 修正 所有编辑 •修复形状的 ...
- 软件版本具体代表什么意思
GA,RC,Beta,Release,Trial,Standard......等软件版本具体代表什么意思 经常看到软件版本里有GA,RC,Beta beta :是测试版.这个一般通用 GA,也就是:G ...
- Mendeley Desktop 很好用的一个文件管理软件
Mendeley Desktop是新出现一个学术软件,有两个显著的特点: 第一是免费使用: 第二,也是最吸引人的地方:能自动从pdf文件中提取文献信息. 官网: http://www.mendeley ...
- [摘录]软件版本GA,RC,alpha,beta,Build 含义
为什么80%的码农都做不了架构师?>>> (1)RC:(Release Candidate) Candidate是候选人的意思,用在软件上就是候选版本.Release.Cand ...
最新文章
- 13、ActiveX控件
- [转]在ubuntu上安装chrome浏览器
- foxmail、outlook发送邮件,进度条很慢
- Struts2 类型转换和数据校验
- swiper实现局部内容滚动效果
- lwIP ARP协议分析
- 现代程序设计 作业6 - 简单而有意义的题目
- 全面永久退出!又一巨头被逼上绝路!
- 深度学习《CycleGAN》
- echarts折线图,纵坐标数值显示不准确的问题解决
- linux下gimp工具栏,Gimp使用小技巧
- java jtextfield 监听_Java JTextField DocumentListener如何用?
- js+面向对象相关笔记(一)
- 电商大促作战指南之全链路压测
- 五大车载操作(VOS)系统
- 获取手机IMEI/ICCID/IMSI
- RxJS + Redux + React = Amazing!(译二)
- 问题记录:SyntaxError: Missing parentheses in call to ‘print‘.
- 如何取消Chrome浏览器自动翻译
- 使用Oracle sql_trace 工具