博弈树

下过五子棋的人都应该知道,越厉害的人,对棋面的预测程度越深。换句话讲,就是当你下完一步棋,我就能在我的脑海里假设把我所有可能下的地方都下一遍,然后考虑我下完之后你又会下在哪里,最后我根据每次预测的局势好坏来判断我的下一步棋放哪最合适。当然这只是想了一层,一个专业的棋手思考的层数会多得多。

作为一个难度较大的 AI,势必也需要能够对棋局进行深入分析,然而五子棋的棋盘大小一般是 15 * 15,可以落子的地方太多,在这种情况下,电脑的性能有限,我们需要满足 AI “思考”的层数不能太低,同时算法的效率要高。

以三子棋为例,AI 思考的过程就如同下面这课树一样,我们用圆圈代表玩家,叉号代表 AI,根节点是用户的落子。

如果继续画下一层,那么下一层就是玩家下一步的落子,这也就是 AI 思考的层数又多了一层。

有了这棵树,我们就需要得出每个节点的得分是多少,以判断哪一步是最优的。

得分

要考虑这一步棋是不是最优的,我们需要给每一步棋都设定一个得分,然后找出最忧的。当前棋面的得分多少,需要同时考虑玩家和 AI 分别的得分。

以三子棋为例,当玩家下在左上角的时候,我们考虑 AI 下在正中间时的得分。得分的计算方法是将棋面的空白地方用棋子填满,然后得出连成三个的个数有多少。(如果是五子棋,应该只需找出当前棋面上所有连子,然后根据每种连子的权重来计算得分)

如图,玩家一共有 4 个成三,而 AI 一共有 5 个,所以总得分是 5 - 4 = 1

这里需要指出的是,在博弈树中,一个节点的得分是取决于他的子节点的,也就是说,当 AI 只思考一层,也就是上图这样,这棵树的末尾就是只有两个棋子,那么这个节点的得分就是这样计算,而如果这个节点下还有子节点,那么我们只会计算叶子节点的得分,然后从叶子节点开始,一步步倒推出父节点的得分。下面来进行解释倒推的过程。

博弈

当 AI 下棋时,我们必定要让 AI 下在得分最高的位置,这毋庸置疑。但是以 AI 的角度来考虑玩家的落子,我们需要假设玩家是“聪明的”,他会下在对自己最有利的地方,也就是得分最低的地方(因为得分 = AI 分数 - 玩家分数)。

这就造成每一层的性质是不同的,在玩家落子的层里,我们要选取得分最低的;在 AI 落子的层里,我们要选取得分最高的。所以我们称玩家层为 MIN 层,AI 层为 MAX 层。

极大极小搜索

上面提到了,计算出叶子节点之后,我们需要倒推出父节点的得分,倒推的原则其实就是上面说的:MAX
层中的节点会从子节点中挑选最大得分的节点作为它的得分,MIN 层的节点会从子节点中挑选最小得分的节点作为它的得分。

以下图举例:

因为我们是根据子节点的得分来倒推父节点的得分的,所以我们是用深度优先来遍历博弈树的,在上面这棵树中,遍历顺序是 ABCDEFGHIJ,赋值过程如下:

  1. 遍历完 A B,因为 C 是 MIN 层,所以选取 AB 中最小的,即 8 作为 C 的得分
  2. 遍历完 D E,F 的得分为 6
  3. 遍历完 G H,I 的得分为 5
  4. 因为 J 在 MAX 层,所以选取 C F I 中得分最大的,即 8 作为 I 的得分

alpha-beta 剪枝

从上面可以想到,像五子棋这种可能性很多的情况,这棵树会变得非常大,当层数增加的时候,计算量也会越来越大,如果不采取一些方法,我们只能靠牺牲层数来换取运行时间。

那么 alpha-beta 剪枝就是一种行之有效的方法,顾名思义,采用这种方法,我们会剪去一些不必要的树枝,也就减少了运行的时间。

alpha-beta 剪枝的定义很绕口,但是原理很简单,还是以上面那课树为例:

当遍历到 C 的时候,计算出 C 的得分是 8,因为 J 的得分是 C、F、I 之中最大的,所以此时可以得出 J >= 8

接下来遍历到 D,D 的值为 6,因为 F 的值是 D 和 E 之中最小的,所以即使现在还没有遍历完 F 的子节点也可以得出 F <= 6,那么既然 J 已经大于等于 8 了,所以继续遍历 F 已经没有意义了,那么我们就将 F 这条枝剪掉。

同理,当 G 为 5 时,遍历 I 已经没有意义了,因为 I 不可能再大于 5,所以直接得出 J 为 8

可以看出,当节点很多的情况下,使用 alpha-beta 剪枝是能在一定程度上提高运行效率的。

原文地址:http://sunhengzhe.com/2016/07/31/five-in-a-row-game/

转载于:https://www.cnblogs.com/pbblogs/p/9541463.html

五子棋 AI(AIpha-beta算法)相关推荐

  1. 五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 五子棋AI教程第二版发布啦,地址:https://github.com/lihongxun945/myblog/labels/%E4%BA%94%E5%AD%90%E6%A3%8BAI% ...

  2. java五子棋AI算法人机对战(春物彩羽版可下载试玩PC端)

    五子棋AI算法 前言: 坐标西安,写于疫情封城期间.改进了之前写的基于极大极小值策略AI五子棋游戏,是用java实现的,采用了java老旧的jframe窗体和绘图类.写好之后整理成了这篇博客. 游戏采 ...

  3. 五子棋AI算法第二篇-极大极小值搜索算法

    AI实现的基本思路-极大极小值搜索算法 五子棋AI教程第二版发布啦,地址:https://github.com/lihongxun945/myblog/labels/%E4%BA%94%E5%AD%9 ...

  4. 基于C++实现五子棋AI算法思想

    更多精彩,请点击上方蓝字关注我们! 今天我想要分享一下我做五子棋AI的思路.因为在做这个之前,我没有接触过任何像这种类似的东西.通过这一次,我也算是有所了解,我的思路也是来自很多网络上的博客,看了很多 ...

  5. 五子棋ai:极大极小搜索和α-β剪枝算法的思想和实现(qt和c++)(四)算杀模块的简单实现

    一.什么是算杀?为什么要算杀? 算杀就是只算杀棋. 我用五子棋ai跟别人下了一阵子之后发现,用博弈树看6层深度(模拟ai走4步,模拟人走3步)其实根本不够,因为真正的高手看到的远比6层要多.高手进行谋 ...

  6. 五子棋ai:极大极小搜索和α-β剪枝算法的思想和实现(qt和c++)(一)引言和界面设计

    源代码 GitHub上:Github livingsu/Gobang-ai:极大极小搜索和α-β剪枝 引言 alphaGo击败围棋冠军李世石的新闻让我对棋类博弈产生了浓厚的兴趣,无奈本人不会围棋,但算 ...

  7. 课程设计书五子棋AI算法及其实现

    五子棋AI,能根据棋盘局势判断棋子应落在何处获胜,主要算法有权值法和博弈树法两种实现方案. 权值法 在数理统计中,有一种名为蒙特卡洛法的方法常被使用,其主要内容为:根据事件出现的概率估计某些特征,并将 ...

  8. 基于博弈树的五子棋 AI 算法及其 C++ 实现

    基于博弈树的五子棋 AI 算法及其 C++ 实现 摘要 一   五子棋的游戏规则 二   五子棋对弈的算法描述 2.1 博弈树搜索算法 2.2 α ─ β 剪枝 2.3 估价函数 三   五子棋对弈的 ...

  9. python五子棋算法_BetaMeow----利用机器学习做五子棋AI

    BetaMeow的起源 前段时间AlphaGo和李世石广受关注,作为人工智能的脑残粉,看完比赛后激动不已,因为有一定的机器学习的基础,便打算撸一个棋类的AI,但我还算有点自知之明,围棋AI,甚至goo ...

  10. (只此一篇便绝b能懂的)五子棋AI算法原理,博弈树、极大极小搜索、αβ剪枝

    我在最近撰写五子棋AI程序设计报告时,翻阅了很多的资料博客,但却发现大佬们的博客,没有一篇是能让我只看它就能理解全部的AI算法.在看了众多博客后,我终于对博弈树.极大极小搜索.αβ剪枝恍然大悟,其实这 ...

最新文章

  1. 程序员转型人工智能工程师,如何在百忙之中不走岔路
  2. MySQL数据库分组和聚合函数组合使用
  3. Ubuntu 安装软件方法
  4. 机器学习入门:一文让你快速了解机器学习
  5. 38行代码AC——L1-025 正整数A+B (15分)(~解题报告~)
  6. ubuntu14测试mysql_在ubuntu14.04中安装Hammerora-2.10——测试mysql、oracle性能够的工具...
  7. ASP.NET CORE 项目实战 ---图形验证码的实现
  8. Nginx on Docker 配置
  9. 详解 Array.prototype.slice.call(arguments)
  10. win7系统下VS2015中CUDA8.0调试程序问题
  11. matlab 提取图像轮廓(图像边缘提取)
  12. 【Proteus仿真8086】将IO接口电路封装成子电路CCT001
  13. 吹嘘自己,只是想别人从吾这里学点东西
  14. mysql查询一个月未登录_mysql函数实例-统计1周内未登陆的用户
  15. 多个EXCEL文件合并成一个
  16. device unauthorized adbd cannot run as root in production builds insufficient permissions
  17. videoder有什么用_videoder
  18. 野人与传教士过河问题
  19. QQ机器人-nonebot
  20. 华为语音解锁设置_华为手机语音转文字怎么设置,如何完成音频在线转换

热门文章

  1. php垂直对齐,CSS垂直对齐不起作用的原因及解决方法
  2. dataframe scala 修改值_【Spark学习笔记】 Scala DataFrame操作大全
  3. 多表利用DIH批量导入数据并建立索引注意事项
  4. 亚马逊增加了对Aurora的跨区域和加密复制支持
  5. py2exe将脚本生成exe可执行文件,不用安装复杂的环境了
  6. Qt 的udpSocket通信
  7. 局域网远控软件DameWareNT6500
  8. Linux分区空间不足了怎么办??
  9. css3中的渐变效果及花斑动画的实现
  10. git rm -r --cached_【Git】工作中99%能用到的git命令