IBM的深蓝战胜国际象棋大师卡斯帕罗夫很大程度上要归功于α-β剪枝算法[2],那么什么是α-β剪枝算法呢?我们从极小-极大过程开始讲起。

1. 极小-极大过程

我们先看看人是如何下棋的。人在下棋时首先根据当前局面考虑若干总可能的走法,再对每种可能的走法考虑对方会如何走,再考虑自己会如何应对……高手会这样往前看很多步,根据最后的局面判断哪种走法是最优的。换句话说,高手会选择那种即使对方正确应对的情况下,己方依然占据最大优势的走法,而不是把希望寄托在对方犯错上。人类棋手的这种思考方法可以用一个“极小极大过程”来描述,其中“极小”是指因为对方的正确应对,使己方收益最小,而“极大”是指假设对方让自己收益最小的前提下,通过己方走棋使自己收益最大。

图1:极小-极大过程

如图1所示,其中方框表示轮到我方走棋,圆圈表示轮到对方走棋。最上面的方框表示当前棋局状态。从当前状态开始向下搜索4步,最下方的数字给出了四步之后的棋局得分,数字越大表示对我方越有利,数字越小表示对对方越有利(在深蓝系统中,这些得分来自于国际象棋大师总结的相关知识)。有了这棵搜索树,就可以自底向上倒推每个节点的得分。如何倒推呢?显然,在双方都不犯错的前题下,我方会选择得分更高的走法,对方会选择得分最低的走法。基于这一原则,圆圈节点的分值是其所有子节点的最小分值,而方框节点是所有子节点的最大分值。由此可自底向上得到所有节点的分值,如图1所示。

基于图1所示的各节点得分,可以看到在双方都没有出现错误的情况下,如果己方向左走将得到0分,而向右走的话,将得到1分。显然我方应该选择向右走,如红色箭头所示,这将保证无论对方如何应对,我方至少获得1分的优势,这就是极小-极大过程。本质上,这一过程保证在最差情况下(对手完美走棋)选择对自己最有利的走法,因此可表现出稳定的棋力。极小-极大过程由香农于1949年提出[3],是包括深蓝在内的众多计算机对奕机系统的基础。

2. α-β剪枝

当搜索深度增加,极小-极大过程将产生规模庞大的搜索树,出现“组合爆炸”问题。据深蓝开发者估算,如果不做改进的话,即便每次走棋只往前考虑十步左右,每步棋也需要“思考”17年。

如何解决这一问题呢?我们先看看人类棋手是如何处理的。众所周知,有经验的棋手在思考可能的走法时,并不是对每种可能性都平权考虑,而是根据自己的经验选择几种可能的走法进行尝试。计算机可以借鉴这一思路,在搜索的过程中减掉一些不必要的路径分枝,以提高搜索的效率,这一方案称为剪枝。利用极小-极大过程的特点(我方选择最大子节点,对方选择最小子节点),可以设计剪枝算法,在保证决策不变的前提下,去掉大量不必要的搜索路径。α-β剪枝算法正是这样一种算法。

我们假定节点是按照深度优先的方式边搜索边产生的,如图2所示。从根节点s开始,顺序产生a、b、c三个节点,达到了搜索深度后,计算c的两个子节点的得分。由于c是极小节点,所以两个子节点中最小得分(0)即为c的得分。由于b是极大节点,因此b的得分最小为0。由b向下扩展生成节点d和e,e的得分为-3,而d又是极小节点,从而我们知道d的值最大为-3。到此我们会发现,b的最小值为0,d的最大值为-3,因此节点f得分多少已经不重要了,所以f可以被剪掉,不需要生成。这样由b得分为0,我们有a的最大值为0。同样我们扩展a的另一个子节点,并向下延伸到k,得到k的分数为3。由于h没有其他的子节点,我们推断极大节点g最小为3。从前面我们知道极小节点a最大为0,它的子节点g是极大节点,最小为3,所以g的其他子节点得分是多少也不重要了,可以不需要生成。

图2:α-β剪枝示意图

上面的例子可以总结成如下剪枝规则:

1,后辈极小节点的值≤祖先极大节点的值时, 发生剪枝,称为α剪枝。

2,后辈极大节点的值≥祖先极小节点的值时, 发生剪枝,称为β剪枝。

请注意,这里发生剪枝的条件都是后辈跟祖先比较,不只是跟父节点比,只要有一个祖先满足剪枝条件就发生剪枝。

上述剪枝方法被称为α-β剪枝算法,由人工智能创始人之一,图灵奖获得者约翰-麦卡锡提出(同期多位学者做过相关研究并独立提出了该算法)[1]。α-β剪枝算法显著提高了搜索效率,允许在有限的时间内做更深的搜索,从而得到更好的性能。需要强调的是,α-β剪枝算法是一个“无损”算法,即剪枝只会提高搜索效率,不会影响走棋决策。

什么是α-β剪枝算法?相关推荐

  1. 收藏 | 一文总结70篇论文,帮你透彻理解神经网络的剪枝算法

    来源:DeepHub IMBA本文约9500字,建议阅读10+分钟 本文为你详细介绍神经网络剪枝结构.剪枝标准和剪枝方法. 无论是在计算机视觉.自然语言处理还是图像生成方面,深度神经网络目前表现出来的 ...

  2. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  3. 决策树准确率低原因_机器学习决策树算法--剪枝算法

    一.剪枝算法决策树生成算法递归地产生决策树,直到不能继续下去为止.这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象.过拟合的原因在于学习时过多地考虑如何 ...

  4. 象棋中常用的最小值最大值算法及剪枝算法

    1.象棋中通常需要推算当前局面下,每走一步之后的局面分,通常我们可以设定考虑几步棋,通常我们所说的算棋,而计算机的AI算法中最常用的就是最大值最小值算法,而剪枝算法是对最大值最小值算法的一种优化. 如 ...

  5. Error Based Pruning剪枝算法、代码实现与举例

    EBP(Error Based Pruning): 下列算法转载自链接: weka3初体验以J48(C4.5)构造决策树以及setoptions各参赛含义 EBP算法的具体实现在 http://www ...

  6. python井字棋ai_实现AI下井字棋的alpha-beta剪枝算法(python实现)

    代码参考自中国大学mooc上人工智能与信息社会陈斌老师的算法,我在原来的基础上增加了玩家输入的异常捕获 AlphaBeta剪枝算法是对Minimax方法的优化,能够极大提高搜索树的效率,如果对这个算法 ...

  7. 决策树剪枝算法(二)

    转自:http://www.cnblogs.com/starfire86/p/5749334.html 上一章主要描述了ID3算法的的原理,它是以信息熵为度量,用于决策树节点的属性选择,每次优选信息量 ...

  8. 基于阿尔法贝塔剪枝算法的五子棋_C4.5算法剪枝2

    作者:柏安之    封面:自己想吧 1 悲观错误剪枝 在讲解悲观剪枝思路的时候,将会运用统计学的相关知识,所以我们将对这部分知识进行粗略的复习,再进行悲观错误剪枝的学习. 首先,我们认为决策树构建期间 ...

  9. 决策树-剪枝算法(二)

    上一章主要描述了ID3算法的的原理,它是以信息熵为度量,用于决策树节点的属性选择,每次优选信息量最多 的属性,以构造一颗熵值下降最快的决策树,到叶子节点处的熵值为0,此时每个叶子节点对应的实例集中的实 ...

  10. minimax算法及α-β剪枝算法

    minimax算法通常用于二人博弈游戏中,如井字棋,chomp游戏等.我对这个算法的理解是这样的:(以人和电脑下棋为例) 电脑要确定哪一步下棋使得优势最大,假设棋盘大小为nxm,不 考虑其他因素,那么 ...

最新文章

  1. java程序分为哪两大类_JAVA程序基础(第1-2章分类)复习-1
  2. 职称计算机考试选择题,职称计算机考试综合选择题「附答案」.docx
  3. iOS之CocoaPods二进制化的实现方案
  4. 用python写linux中的ls,Python实现Linux环境下的ls命令
  5. 内存heap_哪个内存更快?Heap或ByteBuffer或Direct?
  6. 数据库行转列在现实需求中的用法
  7. java getcharat_Java UTF8.getCharArray方法代码示例
  8. 选择物联网卡平台时需要重点考虑的标准
  9. ubuntu下rz,sz命令用法
  10. 目标检测之Faster RCNN理论概述
  11. Linux执行composer出现killed问题解决
  12. python+sklearn实现随机森林模型
  13. 用python制作微信小程序_微信小程序能用python开发
  14. 【北亚数据恢复】raid6磁盘阵列硬盘故障掉线导致上层虚拟机数据丢失的数据恢复案例
  15. Web前端学习笔记(五)--- 手风琴菜单
  16. 后台管理系统UI选型推荐
  17. Three TextureLoader纹理贴图不显示图片(显示黑色)
  18. 每个月5千的工资不想干了想转行测试,软件测试薪资待遇怎么样?
  19. 【机器学习】模型评估与选择--西瓜书第二章
  20. JAR 文件是什么?

热门文章

  1. function 与 => 的区别
  2. cpu性能指标(cpu性能指标字长是指什么)
  3. hdmi 修改分辨率 android,【折腾】Firefly-RK3288 Android 5.1 HDMI输出4K(重新修改)
  4. 面试:25匹马,5个赛道,选出前三,最优解
  5. linux添加include环境变量,Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量
  6. php编写一个简单计算器程序,PHP 简单计算器代码实现
  7. SQL:多表级联查询数量时避免笛卡尔积
  8. 霍兰德职业测试皮肤软件,霍兰德职业兴趣测试
  9. Z-Libary最新地址检测,再也不用担心找不到ZLibary了
  10. 另类弹窗十倍放大流量