王新民 编译

量子位 报道 | 公众号 QbitAI

要创建一个简单的象棋AI,我们在开始编程之前要先了解四个基本的概念:移动生成、棋局评估、最大最小搜索和α-β剪枝搜索过程。

在每个步骤中,我们将会在已有的程序上加入上述经典的象棋编程优化技术,来进行改进我们的象棋机器人。同时我会向大家演示各种优化参数是怎么影响算法的下棋风格和计算速度的。

作者Lauri Hartikka提到:“我已经无法战胜我创造出来的象棋机器人。我觉得导致这个结果的原因不是因为我下棋技术太烂,就是算法已经足够优秀。”

步骤1:移动生成和棋局可视化

我们将使用chess.js库实现移动生成功能,并使用chessboard.js来可视化棋局。chess.js库基本上实现了象棋的所有规则。基于这个应用库,我们可以在给定某个棋局状态下计算出所有合法操作。

图1:对移动生成功能进行可视化:起始位置作为输入,输出是该棋局的所有可能移动.

使用这些库将有助于我们专注于最核心的任务:创建找到最佳走法的算法。接下来先创建一个函数,该函数能从棋局中所有可能的移动中返回一个随机移动的结果。

虽然加入这个函数的机器人还不是一个高超的象棋玩家,但这是一个很好的开始,因为我们已经可以与其进行对战。

图2:黑色点代表下一步所有的合法移动

步骤2:位置评估

现在我们来试试看一下在确定位置上双方的哪个棋子具有更高的评估强度。实现这一点的最简单的方法是使用下表来计算棋局中的相对强度。

通过这个评估表,我们可以创建一个算法,能够让棋子选择具有最高评估分数的移动方向。

目前已经有了不错的进展,因为我们的算法现在已经可以尽可能吃掉对方的棋子。

图3:借助简单的评估功能,双方进行游戏

步骤3:使用Minimax搜索树

接下来,我们要利用Minimax(极大极小)搜索树算法,它可以从多种选择中确定最佳方法。

在该算法中,能将递归树的所有可能移动探索到给定深度,并且在递归树的子节点处评估该位置的好坏。

之后,我们将子节点的最小值或最大值返回给父节点,父节点通过下步将移动白棋还是黑棋来选择合适值。也就是说,我们试图尽可能地减少或最大限度地提高每一级的评估值。

图4:在人为选择位置时,可视化极大极小算法。白棋的最佳走法是b2-c3,此时能够达到评估为-50的位置

通过加入极大极小算法,我们的算法了解象棋的基本策略。

图5:深度级别为2的极大极小算法

评估极大极小算法的有效性,在很大程度上取决于计算性能可以实现的搜索深度。我们接下来的工作是通过优化算法来加大搜索深度。

步骤4:α-β剪枝搜索

α-β剪枝搜索是极小极大算法的一种优化方法,允许我们忽略搜索树中的一些分支,这有助于我们在使用相同的计算资源时更深入地评估极大极小搜索树。

α-β剪枝搜索的原理是是如果我们找到比已经发现的动作更糟糕的情况,那我们可以停止评估搜索树那一部分的情况。

α-β剪枝搜索不会影响极大极小算法的结果,而是大大加速其计算过程。

如果我们碰巧刚开始就得到了产生最优操作的路径,那么α-β剪枝算法也更有效。

图6:我们不需要关注使用α-β剪枝搜索所删去的分支,以及是否按照规定顺序访问搜索树

使用α-β剪枝搜索,我们可以显着提升极大极小算法的计算速度,如下例所示:

图7:如果我们要执行深度为4的Minmax算法,使用α-β剪枝的优化算法和正常算法所需要评估的位置数

步骤5:改进评估功能

初始的评估功能非常简单,因为我们只能计算在棋局上发现的信息。为了改善这一点,我们将棋子的位置也作为评估的一个因素。在实际情况中,棋盘中心的棋子比棋盘边缘的棋子更好,因为它有更多的选择,显得更加活跃。

我们将使用在维基象棋编程中提出的一种棋子价值表。

图8:对棋子价值表进行可视化,我们可以根据棋子的位置减少或增加评估值。

通过如上改进,我们已经获得了象棋机器人,至少已经能够与业余玩家进行对战了。

图9:加上评估方法和α-β剪枝优化的极大极小算法表现,设置搜索深度为3。

结论

对于一个简单的象棋机器人,它的优点是不会产生愚蠢的错误操作。但是它仍然缺乏对象棋的战略性理解。

通过上面介绍的方法,我们能够创建一个象棋机器人,可以和你一起玩象棋。最终的实现代码只有200行,这意味着这个算法的基本概念实现起来非常简单,你可以在GitHub上查看象棋机器人的最终版本。

我们还可以对这个算法进行深入的改进,例如移动排序、更快的移动生成和对残局的具体评估等。如果您想了解更多关于象棋机器人的信息,请查看维基上象棋项目程序,去探索更多关于搜索算法的优化程序。今天AI界还有哪些事值得关注?在量子位(QbitAI)公众号会话界面回复“今天”,看我们全网搜罗的AI行业和研究动态。笔芯❤~

想和更多小伙伴一起学习进步,欢迎加量子位小助手的微信:qbitbot,注明“加入门群”,如果是认真学习的好同学,小助手会带你进群。

python国际象棋ai程序_只需五步!手把手教你搭建国际象棋AI机器人相关推荐

  1. centos7如何精简容量_只需3步!教你打造精简win10,去除系统自带程序,运行更快...

    说到win10系统,真是让人很头痛,尤其是系统不断更新的同时,也不断变大! 结果,一些配置相对没有这么好的电脑,安装win10系统之后,除了卡之外,还发现系统中有一大堆这辈子都不怎么用的系统程序组件之 ...

  2. win10 minikube镜像位置_只需3步!教你打造精简win10,去除系统自带程序,运行更快!...

    说到win10系统,真是让人很头痛,尤其是系统不断更新的同时,也不断变大! 结果,一些配置相对没有这么好的电脑,安装win10系统之后,除了卡之外,还发现系统中有一大堆这辈子都不怎么用的系统程序组件之 ...

  3. 程序win10_只需3步!教你打造精简win10,去除系统自带程序,运行更快!

    说到win10系统,真是让人很头痛,尤其是系统不断更新的同时,也不断变大! 结果,一些配置相对没有这么好的电脑,安装win10系统之后,除了卡之外,还发现系统中有一大堆这辈子都不怎么用的系统程序组件之 ...

  4. 实现歌词效果自动滚动_只需五步,专业Pr软件实现视频歌词渐变色效果,你学会了吗?...

    大家好,现如今短视频行业的飞速发展,造就视频的花样百出,形成不同视角冲击,其中音乐播放器的歌词渐变效果是我们平常接触最多的一个效果(如下图),今天我就来给大家讲解如何用Premiere软件快速简单制作 ...

  5. 不小心合并了icloud通讯录_只需两步!教你如何从iCloud恢复iPhone通讯录

    自从iOS5发布以后,iCloud无疑成为系统中最大的特色功能.有了iCloud,我们就可以在任意有网络的地方备份或者恢复自己设备上的数据,摆脱了以往只能从本地计算机中存储的备份中恢复的方式. 今天笔 ...

  6. 只需两步手把手教你玩转图像识别

    1.打开ModelArts控制台 https://console.huaweicloud.com/modelarts 2.找到AI市场,并点击进入 我们找一个花卉识别的模型玩下,点击导入至我的模型 填 ...

  7. 只需三步,教你搭建一个进销存管理系统!

    如果你常常面临:进销存软件功能不全.功能冗余.价格昂贵,性价比不高的情况-- 可以考虑使用[零代码搭建]了! 在简道云可以根据自身需求快速搭建出进销存管理系统.相比较其他标准进销存软件,用简道云搭建进 ...

  8. 网站优化只需五步技巧分享推广无界限

    目前很多企业或者个人的网站都已经很普遍使用了,但是一个网站有好的排名和流量就必须要有好的优化,并且网站自身的关键词优化布局也是非常重要的,不过网站优化一般只需五步就可以达到效果,这五步你都知道吗? 我 ...

  9. 如何将瀑布流里的图片加链接_只需5步!魔幻丛林瀑布后期揭秘

    去年的旅行,我跋山涉水,翻山越岭,探索了很多的幽谷密林. "海蓝时见鲸,林深处遇水"我记录下了很多瀑布的影像. 下面是一组后期处理前后的对比图 如何将原本干涩直白的画风打造出如梦游 ...

最新文章

  1. command-line: line 0: Bad configuration option: PermitLocalCommand
  2. php静态方法调用变量吗,php静态方法怎么调用非静态变量?
  3. python类中方法的执行顺序-Python中实例化class的执行顺序示例详解
  4. 奇异值值分解。svd_推荐系统-奇异值分解(SVD)和截断SVD
  5. pointer-events(禁止鼠标事件)
  6. 做消息推送 8 年的极光,为何做物联网 JIoT 平台?
  7. Drawable之color示例
  8. 作业1-3 求1+2!+3!+...+20!的和
  9. C语言返回值深入研究
  10. C语言程序设计第三版微课版,C语言程序设计(第3版 微课版)
  11. A-priori算法的简单实现
  12. 第2章 Spring Boot实践,开发社区登录模块(上)
  13. win10通过开启teredo访问ipv6
  14. ARM32 寄存器分类
  15. 超漂亮的前台页面模板——html+css+js+框架
  16. WPS 两个 word 合并
  17. oppo什么时间升鸿蒙系统,鸿蒙正式发布进入倒计时!华为正式发出邀请,OPPO之后小米也婉拒...
  18. TI高精度实验室-运算放大器-第九节-低失真运算放大器的设计
  19. 博弈树中关于α-β剪枝树要点
  20. Rejecting re-init on previously-failed class java.lang.Class<org.apache.commons.httpclient.HttpClien

热门文章

  1. 39-网上商城数据库-用户信息数据操作
  2. 【沃顿商学院学习笔记】宏观经济学——03国际移民与城市发展Immigration and Cities
  3. Mantel test: 两个矩阵相关关系的检验
  4. 如何安装适用于win11的安卓子系统(WSA)的谷歌框架安卓13版本
  5. Calico on Kubernetes 从入门到精通
  6. EXCEL——自定义单元格格式
  7. 微信开发者工具中预览ApiCloud生成代码
  8. 【Java】Java编译时错误:A JNI error has occurred, please check your installation and try again
  9. blacklist regions:NGS测序数据中的黑名单
  10. 苹果不显示订阅服务器,苹果xr找不到订阅管理?苹果xr找不到订阅管理解决办法...