Alpha-Beta 剪枝

这篇具有很好参考价值的文章主要介绍了Alpha-Beta 剪枝。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Minimax 算法

定义

Minimax$ 算法又叫极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。1

在局面确定的双人对弈里,常进行对抗搜索,构建一棵每个节点都为一个确定状态的搜索树。奇数层为己方先手,偶数层为对方先手。搜索树上每个叶子节点都会被赋予一个估值,估值越大代表我方赢面越大。我方追求更大的赢面,而对方会设法降低我方的赢面,体现在搜索树上就是,奇数层节点(我方节点)总是会选择赢面最大的子节点状态,而偶数层(对方节点)总是会选择我方赢面最小的的子节点状态。

过程

Minimax 算法的整个过程,会从上到下遍历搜索树,回溯时利用子树信息更新答案,最后得到根节点的值,意义就是我方在双方都采取最优策略下能获得的最大分数。

解释

来看一个简单的例子。

称我方为 MAX,对方为 MIN,图示如下:

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

例如,对于如下的局势,假设从左往右搜索,根节点的数值为我方赢面:

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

我方应选择中间的路线。因为,如果选择左边的路线,最差的赢面是 3;如果选择中间的路线,最差的赢面是 15;如果选择右边的路线,最差的赢面是 1。虽然选择右边的路线可能有 22 的赢面,但对方也可能使我方只有 1 的赢面,假设对方会选择使得我方赢面最小的方向走,那么经过权衡,显然选择中间的路线更为稳妥。

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

实际上,在看右边的路线时,当发现赢面可能为 1 就不必再去看赢面为 12、20、22 的分支了,因为已经可以确定右边的路线不是最好的。

朴素的 Minimax 算法常常需要构建一棵庞大的搜索树,时间和空间复杂度都将不能承受。而α − β 

剪枝就是利用搜索树每个节点取值的上下界来对 Minimax 进行剪枝优化的一种方法。

需要注意的是,对于不同的问题,搜索树每个节点上的值有着不同的含义,它可以是估值、分数、赢的概率等等,为方便起见,我们下面统一用分数来称呼。

alpha-beta 剪枝

过程

对于如下的局势,假设从左往右搜索:

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

若已知某节点的所有子节点的分数,则可以算出该节点的分数:对于 MAX 节点,取最大分数;对于 MIN 节点,取最小分数。

若已知某节点的部分子节点的分数,虽然不能算出该节点的分数,但可以算出该节点的分数的取值范围。同时,利用该节点的分数的取值范围,在搜素其子节点时,如果已经确定没有更好的走法,就不必再搜索剩余的子节点了。

记 v 为节点的分数,且 α ≤ v ≤ β,即 α 为最大下界,β 为最小上界。当 α ≥ β 时,该节点剩余的分支就不必继续搜索了(也就是可以进行剪枝了)。注意,当 α = β 时,也可以剪枝,这是因为不会有更好的结果了,但可能有更差的结果。

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

初始化时,令 α = −∞, β = +∞,也就是 −∞ ≤ v ≤ +∞。到节点 A 时,由于左 子节点的分数为 3,而节点 A 是 MIN 节点,试图找分数小的走法,于是将 β 值修 改为 3,这是因为 3 小于当前的 β 值(β = +∞)。然后节点 A 的右子节点的分数 为 17,此时不修改节点 A 的 β 值,这是因为 17 大于当前的 β 值(β = 3)。之 后,节点 A 的所有子节点搜索完毕,即可计算出节点 A 的分数为 3。

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

节点 A 是节点 B 的子节点,计算出节点 A 的分数后,可以更新节点 B 的分数范 围。由于节点 B 是 MAX 节点,试图找分数大的走法,于是将 α 值修改为 3,这是 因为 3 大于当前的 α 值(α = −∞)。之后搜索节点 B 的右子节点 C,并将节点 B 的 α 和 β 值传递给节点 C。

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

对于节点 C,由于左子节点的分数为 2,而节点 C 是 MIN 节点,于是将 β 值修改 为 2。此时 α ≥ β,故节点 C 的剩余子节点就不必搜索了,因为可以确定,通过节 点 C 并没有更好的走法。然后,节点 C 是 MIN 节点,将节点 C 的分数设为 β,也 就是 2。由于节点 B 的所有子节点搜索完毕,即可计算出节点 B 的分数为 3。

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

计算出节点 B 的分数后,节点 B 是节点 D 的一个子节点,故可以更新节点 D 的分 数范围。由于节点 D 是 MIN 节点,于是将 β 值修改为 3。然后节点 D 将 α 和 β 值 传递给节点 E,节点 E 又传递给节点 F。对于节点 F,它只有一个分数为 15 的子 节点,由于 15 大于当前的 β 值,而节点 F 为 MIN 节点,所以不更新其 β 值,然 后可以计算出节点 F 的分数为 15。 

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

 计算出节点 F 的分数后,节点 F 是节点 E 的一个子节点,故可以更新节点 E 的分 数范围。节点 E 是 MAX 节点,更新 α,此时 α ≥ β,故可以剪去节点 E 的余下分 支。然后,节点 E 是 MAX 节点,将节点 E 的分数设为 α,也就是 3。此时,节点 D 的所有子节点搜索完毕,即可计算出节点 D 的分数为 3。

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

计算出节点 D 的分数后,节点 D 是节点 H 的一个子节点,故可以更新节点 H 的分 数范围。节点 H 是 MAX 节点,更新 α。然后,按搜索顺序,将节点 H 的 α 和 β 值依次传递给节点 I、J、K。对于节点 K,其左子节点的分数为 2,而节点 K 是 MIN 节点,更新 β,此时 α ≥ β,故可以剪去节点 K 的余下分支。然后,将节点 K 的分数设为 2。

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

计算出节点 K 的分数后,节点 K 是节点 J 的一个子节点,故可以更新节点 J 的分 数范围。节点 J 是 MAX 节点,更新 α,但是,由于节点 K 的分数小于 α,所以节 点 J 的 α 值维持 3 保持不变。然后,将节点 J 的 α 和 β 值传递给节点 L。由于节 点 L 是 MIN 节点,更新 β = 3,此时 α ≥ β,故可以剪去节点 L 的余下分支,由于 节点 L 没有余下分支,所以此处并没有实际剪枝。然后,将节点 L 的分数设为 3。

alphabeta剪枝算法,算法基础,搜索算法,剪枝,算法,c++

 实现

int alpha_beta(int u, int alph, int beta, bool is_max) {
  if (!son_num[u]) return val[u];
  if (is_max) {
    for (int i = 0; i < son_num[u]; ++i) {
      int d = son[u][i];
      alph = max(alph, alpha_beta(d, alph, beta, is_max ^ 1));
      if (alph >= beta) break;
    }
    return alph;
  } else {
    for (int i = 0; i < son_num[u]; ++i) {
      int d = son[u][i];
      beta = min(beta, alpha_beta(d, alph, beta, is_max ^ 1));
      if (alph >= beta) break;
    }
    return beta;
  }
}

新手上路,请多多指教文章来源地址https://www.toymoban.com/news/detail-764158.html

到了这里,关于Alpha-Beta 剪枝的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DFS(基础,回溯,剪枝,记忆化)搜索

    DFS(深度优先搜索) 基于递归求解问题,而针对搜索的过程 对于问题的介入状态叫初始状态,要求的状态叫目标状态 这里的搜索就是对实时产生的状态进行分析检测,直到得到一个目标状态或符合要求的最佳状态为止。对于实时产生新的状态的过程叫扩展 搜索的要点: 1.选定初

    2024年04月12日
    浏览(29)
  • 单元测试、冒烟测试、集成测试、系统测试、回归测试、验收测试、Alpha、Beta

    1.冒烟测试 代码跑通即可。 这一术语源自硬件测试:测试一个硬件或硬件组件时,先直接加电,如果冒烟了,则无需进行后续测试。目的:判断是否可以进行后续的正式测试工作。 新编译的软件版本,确认其基本功能正常。 2、回归测试 修改后重新测试。 错误被修正后或软

    2023年04月13日
    浏览(60)
  • 简谈软件版本周期 | Alpha、Beta、RC、Stable版本之间的区别

    目录 💌 引言 ⭕ 软件版本周期 🛠️ 软件开发期 ⚖️ 软件完成期 💰 商业软件版本 定义好版本号,对于产品的版本发布与持续更新很重要;但是对于版本怎么定义,规则如何确定,却是千差万别。具体应用,可以结合自己目前的实际情况命名。另外,对于商业软件,有的

    2024年02月08日
    浏览(34)
  • 如何在Arch Linux上安装最新的GNOME Alpha/Beta版本

    导读 这是为那些想在 Arch Linux 上安装下一个主要版本的 GNOME 桌面环境的 alpha 或 beta 开发版的用户提供的快速而又肮脏的教程,仅供测试之用。 每次有新的 GNOME alpha 版本发布,人们都会问我如何在各种 GNU/Linux 发行版上安装。我总是告诉他们,如果没有为特定发行版创建的

    2024年02月16日
    浏览(25)
  • 【人工智能】—局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法

    在某些规模太大的问题状态空间内,A*往往不够用 问题空间太大了 无法访问 f 小于最优的所有状态 通常,甚至无法储存整个边缘队列 解决方案 设计选择更好的启发式函数 Greedy hill-climbing (fringe size = 1) Beam search (limited fringe size) 瓶颈:内存不足,无法存储整个边缘队列 爬山搜

    2023年04月22日
    浏览(38)
  • sklearn中决策树模块的剪枝参数ccp_alpha如何可视化调整

    决策树作为树模型中最经典的算法,根据训练数据生长并分裂叶子结点,容易过拟合。所以一般来说会考虑生长停止后进行剪枝,把一些不必要的叶子结点去掉(让其父结点作为叶子结点),这样或许对其泛化能力有积极作用。 在scikit-learn的决策树模块里,默认是不剪枝的,

    2024年02月21日
    浏览(31)
  • 【搜索】DFS剪枝与优化

    算法提高课笔记 剪枝 是什么意思呢? 我们知道,不管是内部搜索还是外部搜索,都可以形成一棵搜索树,如果将搜索树全部遍历一遍,效率会很低,但如果我们能在搜索的过程中,提前预知,判断某一些不可能是正确答案的情况,就可以不用遍历其下的子树,从而提高我们

    2024年02月14日
    浏览(43)
  • DFS:深搜+回溯+剪枝解决矩阵搜索问题

                                                   创作不易,感谢三连!!  . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) 1、矩阵搜索问题经常要用到向量,也就是我们可以通过dx和dy来帮助我们定义方向

    2024年04月17日
    浏览(29)
  • 【力扣 51】N 皇后(回溯+剪枝+深度优先搜索)

    按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后

    2024年02月22日
    浏览(28)
  • 从0实现基于Alpha zero的中国象棋AI(会分为多个博客,此处讲解蒙特卡洛树搜索)

    ​ 题主对于阿尔法狗的实现原理好奇,加上毕业在即,因此选择中国象棋版的阿尔法zero,阿尔法zero是阿尔法狗的升级版。在完成代码编写的历程中,深刻感受到深度学习环境的恶劣,网络上固然资料繁多,但要么水平不行,不知所云,要么国外课程,门槛过高。因而碰壁良

    2024年02月06日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包