极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力.

多被称为对抗搜索算法.

这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b.

这个搜索是认为这a与b的利益关系是对立的,即假设a要是分数更大,b就要是分数更小.

而且这两个人都是用最优策略.

对,就是这样.

假设我们现在有一道题,给出一串数列,有两个选手按顺序选数,也就是一个选手选了ai,接下来另一个选手就必须选ai后面的任意一个数,然后每个选手选的数的累加和即为选手的分数,求先手比后手最多多几分.(两个选手都会选择最优策略)

保证序列里所有的数为正数.

那么我们可以设计一个算法:

先手的框架为:枚举上一次另一个选手选的数字后面开始选,取最大值.

后手的框架为:枚举上一次另一个选手选的数字后面开始选,取最小值.

即:

 int dfsb(int k){
int minn=;
for (int i=k;i<=n;i++) //枚举接下来的要取的数
minn=min(minn,dfsa(i+)-a[i]); //搜索接下来对b最优的结果,也就是分数最小
minn=min(minn,); //考虑不取的情况
return minn; //返回最优策略的得分
}
int dfsa(int k){
int maxx=-;
for (int i=k;i<=n;i++) //枚举接下来的要取的数
maxx=max(maxx,a[i]+dfsb(i+)); //搜索接下来对a最优的结果,也就是分数最大
maxx=max(maxx,); //考虑不取的情况
return maxx; //返回最优策略的得分
}

接下来是一个对于对抗搜索的最佳搭档——alpha-beta优化.

这个优化的思想很简单,即对于a来说,需要的是最大值,而下面的b取得是最小值.

而接下来如果b的已求出的最小值比a的已求出的最大值小,还有必要继续搜吗?

同样的,对于b来说,需要的是最小值,而下面的b取得是最大值.

于是这就是alpha-beta剪枝.

具体实现如下:

 int dfsb(int k,int maxx){      //多传一个maxx值表示上一层已经求出的最大值
int minn=;
for (int i=k;i<=n;i++) { //枚举接下来的要取的数
minn=min(minn,dfsa(i+,minn)-a[i]); //搜索接下来对b最优的结果,也就是分数最小
if (minn<maxx) return; //alpha-beta优化
}
minn=min(minn,); //考虑不取的情况
return minn; //返回最优策略的得分
}
int dfsa(int k,int minn){ //多传一个minn值表示上一层已经求出的最小值
int maxx=-;
for (int i=k;i<=n;i++) { //枚举接下来的要取的数
maxx=max(maxx,a[i]+dfsb(i+,maxx)); //搜索接下来对a最优的结果,也就是分数最大
if (maxx>minn) return; //alpha-beta优化
}
maxx=max(maxx,); //考虑不取的情况
return maxx; //返回最优策略的得分
}

3 维基百科的伪码

如此的简洁~~~~~~

 function alphabeta(node, depth, α, β, Player)
if depth = or node is a terminal node
return the heuristic value of node
if Player = MaxPlayer // 极大节点
for each child of node // 极小节点
α := max(α, alphabeta(child, depth-, α, β, not(Player) ))
if β ≤ α // 该极大节点的值>=α>=β,该极大节点后面的搜索到的值肯定会大于β,因此不会被其上层的极小节点所选用了。对于根节点,β为正无穷
break (* Beta cut-off *)
return α
else // 极小节点
for each child of node // 极大节点
β := min(β, alphabeta(child, depth-, α, β, not(Player) )) // 极小节点
if β ≤ α // 该极大节点的值<=β<=α,该极小节点后面的搜索到的值肯定会小于α,因此不会被其上层的极大节点所选用了。对于根节点,α为负无穷
break (* Alpha cut-off *)
return β
(* Initial call *)
alphabeta(origin, depth, -infinity, +infinity, MaxPlayer)

极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】的更多相关文章

  1. https://blog.csdn.net/doegoo/article/details/50749817

    因为使用DiscuzX3.2进行系统的整合后,因为只是想在原J2EE的系统上增加论坛功能,而且J2EE中已经有一套用户的注册认证的体系,所以不需要在Discuz的系统中去注册以及登录功能,而是通过在J ...

  2. IntelliJ Idea 常用快捷键列表 (需整理下) https://blog.csdn.net/dc_726/article/details/42784275

    [常规] https://blog.csdn.net/dc_726/article/details/42784275https://jingyan.baidu.com/article/59a015e3 ...

  3. 为什么领域模型对于架构师如此重要? https://blog.csdn.net/qq_40741855/article/details/84835212

    为什么领域模型对于架构师如此重要? https://blog.csdn.net/qq_40741855/article/details/84835212 2018年12月05日 14:30:19 绝圣 ...

  4. 手把手教你如何玩转消息中间件(ActiveMQ) https://blog.csdn.net/cs_hnu_scw/article/details/81040834

    #情景引入小白:起床起床起床起床....快起床~我:怎么了又,大惊小怪,吓到我了.小白:我有事有事想找你,十万火急呢~~我:你能有什么事?反正我不信..那你说说看~~小白:就是我有两个小表弟,叫大白和 ...

  5. https://blog.csdn.net/u011489043/article/details/68488459

    转自https://blog.csdn.net/u011489043/article/details/68488459 String 字符串常量   StringBuffer 字符串变量(线程安全) ...

  6. 程序员的沟通之痛https://blog.csdn.net/qq_35230695/article/details/80283720

    个人理解: 一般刚工作的程序员总觉得技术最重要.但是当工作年限超过3年.或者岗位需要涉及汇报.需求对接等就会发现沟通非常重要.也许在大公司还不那么明显,但是在小公司.小团队或者创业,沟通甚至可以说是第 ...

  7. https://blog.csdn.net/uftjtt/article/details/79044186

    https://blog.csdn.net/uftjtt/article/details/79044186

  8. 自动车牌识别(ALPR)---https://blog.csdn.net/ELEVEN_ZOU/article/details/80893579

    1.基本功能:从一张或者一系列的图片中提取车牌信息,比如车牌号码.车牌颜色等信息. 2.功能扩展:车型.车品牌.车牌类型等. 3.应用方向:电子交易系统(停车自动收费.收费站自动支付等).交通执法.交 ...

  9. Nginx 配置location root 转自https://blog.csdn.net/rofth/article/details/78581617

    nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...

随机推荐

  1. Linux下使用date命令查看和修改时间

    1.查看系统时区和时间,执行命令date -R “-0500”代表西五区(America/New_York),北京的时区为“+0800”(东八区). 2.查看硬件时间,执行命令hwclock --sh ...

  2. Oracle中使用PL/SQL如何定义参数、参数赋值、输出参数和 if 判断

    1.pl/sql如何定义参数 declare --1)定义参数 -- ban_Id number; ban_Name ); 2.pl/sql如何参数赋值 --2)参数赋值-- ban_Id :; ba ...

  3. vim : Depends: vim-common (= 2:7.4.052-1ubuntu3.1) but 2:7.4.273-2ubuntu4 is to be installed

    sudo apt-get purge vim-commonsudo apt-get updatesudo apt-get upgradesudo apt-get install vim

  4. js里面判断一个字符串是否包含某个子串的方法

    1. ES6的includes, 返回 Boolean var string = "foo", substring = "oo"; string.include ...

  5. Win10系列:JavaScript图形

    在页面中添加canvas元素会在页面上生成一个矩形的位图画布,可以使用JavaScript在画布上实时绘制图形图像.在绘制图形时,需要先调用画布的getContext函数获取与该画布相关的用于绘制图形 ...

  6. Linux command parted

    Linux command parted [Purpose]        Learning linux command parted to manipulate disk partitions   ...

  7. Java并发编程_synchronized关键字的用法(一)

    synchronized:意思是 同步,也就是 共享资源 Synchronized修饰方法:对象锁 Static Synchronized修饰方法:类锁 下面代码手动敲一遍,就会理解  一.Synch ...

  8. core1.1 升级到 2.0

    1.直接修改项目 1.1 改成 2.0 Startup 的修改 去除构造函数中下面的代码 var builder = new ConfigurationBuilder() .SetBasePath(e ...

  9. SQL-27 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。 提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)

    题目描述 给出每个员工每年薪水涨幅超过5000的员工编号emp_no.薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列. 提示:在s ...

  10. 数控AGC实现(转)

    相关链接:    一种混合式高动态范围AGC算法与FPGA实现     http://www.sohu.com/a/221438387_781333 基于FPGA的快速自动增益控制系统设计      ...