博弈树

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

作为一个难度较大的 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 剪枝是能在一定程度上提高运行效率的。

 
 

五子棋 AI(AIpha-beta算法)的更多相关文章

  1. 五子棋AI教程

    https://github.com/Chuck-Ai/gobang 我写了非常详细的中文教程,教你如何一步步编写自己的五子棋AI: 五子棋AI设计教程第二版一:前言 五子棋AI设计教程第二版二:博弈 ...

  2. 使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细)

    五子棋AI实现 五子棋游戏介绍 五子棋的定义 五子棋是全国智力运动会竞技项目之一,是具有完整信息的.确定性的.轮流行动的.两个游戏者的零和游戏.因此,五子棋是一个博弈问题. 五子棋的玩法 五子棋有两种 ...

  3. 五子棋AI大战OC实现

    Gobang 五子棋AI大战,该项目主要用到MVC框架,用算法搭建AI实现进攻或防守 一.项目介绍 1.地址: github地址:Gobang 2.效果图: 二.思路介绍 大概说下思路,具体看代码实现 ...

  4. 五子棋AI清月连珠开源

    经过差不多两年的业余时间学习和编写,最近把清月连珠的无禁手部分完善得差不多了.这中间进行了很多思考,也有很多错误认识,到现在有一些东西还没有全面掌握,所以想通过开源于大家共同交流. 最近一直发表一些五 ...

  5. 人机ai五子棋 ——五子棋AI算法之Java实现

    人机ai五子棋 下载:chess.jar (可直接运行) 源码:https://github.com/xcr1234/chess 其实机器博弈最重要的就是打分,分数也就是权重,把棋子下到分数大的地方, ...

  6. 五子棋AI算法

    原理框图总结 参考链接 http://blog.csdn.net/xiaoyu714543065/article/details/8746876 http://blog.csdn.net/pi9nc/ ...

  7. 【五子棋AI循序渐进】关于VCT,VCF的思考和核心代码

    前面几篇发布了一些有关五子棋的基本算法,其中有一些BUG也有很多值得再次思考的问题,在框架和效果上基本达到了一个简单的AI的水平,当然,我也是初学并没有掌握太多的高级技术.对于这个程序现在还在优化当中 ...

  8. 【五子棋AI循序渐进】——开局库

    首先,对前面几篇当中未修复的BUG致歉,在使用代码时请万分小心…………尤其是前面关于VCF\VCT的一些代码和思考,有一些错误.虽然现在基本都修正了,但是我的程序还没有经过非常大量的对局,在这之前,不 ...

  9. 五子棋AI的思路

    隔了一年才把AI思路给写了... 需求分析与设计方案:http://www.cnblogs.com/songdechiu/p/4951634.html 如需整个工程,移步http://download ...

随机推荐

  1. [转]阿里巴巴十年Java架构师分享,会了这个知识点的人都去BAT了

    1.源码分析专题 详细介绍源码中所用到的经典设计思想,看看大牛是如何写代码的,提升技术审美.提高核心竞争力. 帮助大家寻找分析源码的切入点,在思想上来一次巨大的升华.知其然,并知其所以然.把知识变成自 ...

  2. django 路由系统中name应用

    作用:对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL ***** name的两大应用 url(r'^asdfasdfasdf/', views.index, name= ...

  3. 依赖、耦合、解耦、控制反转(IOC)、依赖注入(DI)

    随着net的深入学习,出现了很多概念性的东西需要理解,现在统一记录一下. 1.依赖:现阶段在任何一个有请求作用的系统,都会出现A类调用B类的情况,这时候A类就依赖于B类,A类和B类存在依赖关系. 2. ...

  4. Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能

    1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和导出. 该 ...

  5. USB3.0及NVME SSD安装WIN7X64

    USB3.0及NVME SSD安装WIN7X64https://tieba.baidu.com/p/4822034273?pn=1所有的人都是菜鸟过来的,不过有些人懂得自己动手找到答案:有些人则是懒得 ...

  6. bui框架nav导航图标一览

    权限  .nav-permission   仓库  .nav-storage   库存  .nav-inventory   用户  .nav-user   订单  .nav-order   商品  . ...

  7. weakSelf 和 strongSelf的区别和用处

    block会copy要在block中使用的实变量,而copy会是变量的retainCount + 1,如若在不注意很容易造成循环引用.而所谓的循环引用的本质就是,两个对象相互引用,从而造成对象不能正常 ...

  8. [UE4]ProgressBar,进度条

    准备好2张进度条图片 一.新建名为“testProgress”的UserWidget,添加一个名为“ProgressBar_0”的ProgressBar到默认容器Canvas Panel 二.进度条进 ...

  9. Unable to complete the scan for annotations for web application [/wrs] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.

    tomcat启动报错:Jul 20, 2018 11:48:37 AM org.apache.catalina.core.ContainerBase addChildInternalSEVERE: C ...

  10. kettle 无法正常启动问题

    Java环境配置后,双击spoon.bat无法打开 修改spoon.bat里内存配置: if "%PENTAHO_DI_JAVA_OPTIONS%"=="" s ...