alpha-beta剪枝

首先看着代码是挺简单的,实现比较简单。但是其中思路确实还是比较饶人的。说白了就是,你在max层你要考虑min层他可能做出的选择,一般都是一层一层搜索的。有没有大牛给个搜索两层的代码? 首先假设你是max层,你要使得a(同阿尔法)最大,但是初始a是为最小,也就是啥都没有。你的对手如果站在你的角度他是b,他是使得b越小。为了保证你们两个是公平竞争,所以初始a是最小,你慢慢使他变大。初始b最大,对手慢慢使他变小,这样就解释了初始值的问题。

好了解决了开始问题,问题基本就差不多解决了。这回我从min层开始讲,防止和其他人冲突。min根节点做出的选择,你要修改b使他慢慢变小,朝着你的目标前进。而你的答案是从下一层,也就是max层中 拿到最小的,而max层从下面min层搜索出一个最大的。由于算法是递归的,所以最后一层一定会返回会返回一个一般的答案。照图来看是只分析了三层,其实隔好几代剪枝也是成立的。

我们假设这个答案是对你不有利的,那么max层一定会选择这一条。或者换种说法,max层做出的结果,肯定不会比当前更差,因为他总是选取最大的值。那么对于你min根节点来说,这条路就可以剪掉了,也就是b剪枝。为啥是b剪枝,而不是a剪枝呢? 因为对你根节点是min,搜的也是最小值,减少几个不必要的搜索分支。

同理,根节点为max的a剪枝也就可以理解了。

明白了什么是剪枝,我们在考虑一般情况。如图

下图从第二个max层开始分析,这个是函数的主体。虽然主节点是min,但是主节点并没有搜索的业务,只是被动选择最小的节点,可以说max层搜的结果固定,那么min也就是根节点的值一定是固定的。所以对于主体业务max层,他是寻找最大的,命名为int pro_max(int height, int a, int b)好像不太过分,但是其实是b剪枝(也就是会return 一个固定的b值)。

好的 我们从max层分析,假设max层左边第一个节点搜索到了a值为8,(a表示max结果,有利于我方的,但是初始是最小,为了保证公平) 那么回溯过来根节点min的b值(b表示对方的最有利值,初始最大,保证公平),由于b是找最小,而8<∞,所以b,第一次更新为8。然后最左边的分支搜索结束,所有值都是确定的。然后开始max层中间搜索。这里的算法就是如果遇到,一个数比根节点的b值更大,或者相等。那么由于他的上一层是max层,那max肯定选择的不会比你搜索的值小。然而根节点是min层,你比根节点现在的值都要大,那么根节点肯定会舍弃。所以,我们在搜索max层的下一层,也即是第二层min,如果遇到一个比上两层的min层更大,那么直接舍弃。也就是b剪枝。

好了讲到这里基本讲完了,差不多是我的理解。不会的话,我也没办法。我花了差不多一天时间才会,我想读者朋友们肯定比我聪明多了。我这基本都是白话文,大神轻喷。毕竟我只是个蒟蒻的菜鸡。

下面我给出b剪枝的算法 JAVA版本

public int pro_max_bCut(int height, int a, int b){

if(height == k)

return sum;//返回结果集合

for(int i =1; i<=3;i++){ //假设三个分支搜索,mm表示搜索集合

sum+=mm[i];//这边sum只是模拟一下,并没有实际意思,只是要在这里算你想要的结果

int val = pro_min_aCut(height+1, a, b);//这边是你想要搜索的, 然后需要每次传递a和b,这个要从下一层搜索出来。当前找最大,下一层就是找最小,没毛病。

sum-=mm[i];//这边记得要回溯一下,不然结果只是一颗树的一个分支。为啥有的需要回溯,大概是因为sum是全局变量吧!

//下面就是根据搜索得出的val进行剪枝,先剪枝可以优化代码

if(val >= b)

return b;//b剪枝,可以直接返回这个搜索树得出结果

if(val >a)

a=val; //这里是找出最大的,a保存最大的值

}

return a;//循环结束,给出自己的最大值,就是这个找最大的函数

}

那个 a剪枝,道理差不多 可以把a b 换一下,然后写出来,这里就不重复了。 就是>= 变为 <= return b 变为return a。如果明白了我上面说的,就可以写的出来。不会的话,嘿嘿,同志仍需努力啊。

基本就是这个意思,没有测试能不能跑,因为没有具体题目。思路对了就好。这边如果是搜索可以给出启发式搜索,可以快一点得出结果。启发式函数可以在 {sum+=mm[i];//这边sum只是模拟一下,并没有实际意思,只是要在这里算你想要的结果} 这个代码前面进行编写,目的是尽可能快速得出结果,就是优先生成可以产生结果的树,个人观点有点像贪心,都是不一定保证结果是对的,只是理论可能是对的。

alpha-beta剪枝 个人理解相关推荐

  1. alpha,beta剪枝详解

    α,β剪枝详解\alpha,\beta剪枝详解α,β剪枝详解 示例图 步骤详解 基础原理 这里我们先要理解什么是α,β\alpha,\betaα,β剪枝:α\alphaα是下界,β\betaβ是上界. ...

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

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

  3. alpha-beta剪枝五子棋c语言,五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250 ...

  4. 基于python的AI五子棋实现(极大极小值搜索和alpha beta剪枝)

    1.极大极小值搜索介绍 人机博弈是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化极大算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出. M ...

  5. 五子棋AI算法-Alpha Beta剪枝

    上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250000,在我的 ...

  6. alpha beta 剪枝算法

    摘自wikipedia alpha-β修剪的好处在于可以消除搜索树的分支.这样,搜索时间可以限制在"更有希望"的子​​树中,并且可以在同一时间执行更深入的搜索.该算法和极小化极大算 ...

  7. python alpha beta 剪枝_一看就懂的 Alpha-Beta 剪枝算法详解

    Alpha-Beta剪枝用于裁剪搜索树中没有意义的不需要搜索的树枝,以提高运算速度. 假设α为下界,β为上界,对于α ≤ N ≤ β: 若 α ≤ β  则N有解. 若 α > β 则N无解. ...

  8. Alpha-Beta剪枝(Alpha Beta Pruning)

    Alpha-Beta剪枝算法(Alpha Beta Pruning) [说明] 本文基于<<CS 161 Recitation Notes - Minimax with Alpha Bet ...

  9. Privacy Definitions - (alpha, beta)-privacy

    如果对一个事件AAA越确定,该事件的概率P(A)P(A)P(A)就越大:对一个事件BBB越不确定,则该事件的概率P(B)P(B)P(B)就越小.通过事件AAA,可以增大事件BBB的确定性,也可能造成干 ...

  10. 软件发布版本区别介绍-Alpha,Beta,RC,Release

    标签: Alpha: Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用. 是希腊字母的第一位,表示最初级的版本 alpha就是α,beta就是β alpha ...

最新文章

  1. LNMP架构——OpenResty实现缓存前移(到达Nginx前端层面)
  2. python画有权重网络图_python networkx 根据图的权重画图实现
  3. (转)jQuery第五课:Ajax
  4. php dede 发布时间_dede 采集到数据后,发布日期变为本地日期解决方法
  5. uva 1615——Highway
  6. ubuntu下面的git服务器搭建
  7. keras 微调整模型_如何围绕微服务调整团队
  8. java spring web配置文件路径_java – spring配置文件和web.xml的确切位置在哪里?
  9. 信捷plc用c语言编程软件,XDPPro(信捷PLC编程软件) V3.1.0c 官方版
  10. Java性能优化的35种方法
  11. 三菱Q系列总线型项目程序全套,三菱PLC程序+proface触摸屏双屏+电气图纸+程序注释规划表
  12. Android之Http通信——1.初识Http协议
  13. 定向士官计算机网络技术在部队干什么,定向培养士官是干什么的
  14. case when 嵌套
  15. 美通社企业新闻汇总 | 2019.3.7 | 百胜中国在上海设创新中心;折叠手机2019年预计仅占智能手机市场渗透率0.1%...
  16. 使用AIDL实现Android的跨进程通信
  17. 有限元形函数及JuliaFEM中的实现方式
  18. javascript(JS)---立即执行函数(immediately-invoked function expressions,IIFE)
  19. 6-vulnhub靶场-LordOfTheRoot_1.0.1靶机内核提权udf提权缓冲区溢出提权
  20. 加速器,陀螺仪测量移动距离的方法

热门文章

  1. java马里奥_java马里奥毕业设计
  2. 电子商务专业英语参考试卷
  3. TC397 EVADC
  4. 第4.1章 飞鸟集爬虫采用结巴分词随机排序存储
  5. TCP之 select模型
  6. 分段函数的期望和方差_概率论与数理统计的公式及定义总结
  7. U盘无法打开的解决方法大全
  8. U盘插入,无法读取?6种解决方法
  9. 命令提示符之常用命令
  10. Connect Four四子棋c++程序 - 显示窗口(0)