极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】
极大极小搜索,即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】的更多相关文章
- https://blog.csdn.net/doegoo/article/details/50749817
因为使用DiscuzX3.2进行系统的整合后,因为只是想在原J2EE的系统上增加论坛功能,而且J2EE中已经有一套用户的注册认证的体系,所以不需要在Discuz的系统中去注册以及登录功能,而是通过在J ...
- 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 ...
- 为什么领域模型对于架构师如此重要? https://blog.csdn.net/qq_40741855/article/details/84835212
为什么领域模型对于架构师如此重要? https://blog.csdn.net/qq_40741855/article/details/84835212 2018年12月05日 14:30:19 绝圣 ...
- 手把手教你如何玩转消息中间件(ActiveMQ) https://blog.csdn.net/cs_hnu_scw/article/details/81040834
#情景引入小白:起床起床起床起床....快起床~我:怎么了又,大惊小怪,吓到我了.小白:我有事有事想找你,十万火急呢~~我:你能有什么事?反正我不信..那你说说看~~小白:就是我有两个小表弟,叫大白和 ...
- https://blog.csdn.net/u011489043/article/details/68488459
转自https://blog.csdn.net/u011489043/article/details/68488459 String 字符串常量 StringBuffer 字符串变量(线程安全) ...
- 程序员的沟通之痛https://blog.csdn.net/qq_35230695/article/details/80283720
个人理解: 一般刚工作的程序员总觉得技术最重要.但是当工作年限超过3年.或者岗位需要涉及汇报.需求对接等就会发现沟通非常重要.也许在大公司还不那么明显,但是在小公司.小团队或者创业,沟通甚至可以说是第 ...
- https://blog.csdn.net/uftjtt/article/details/79044186
https://blog.csdn.net/uftjtt/article/details/79044186
- 自动车牌识别(ALPR)---https://blog.csdn.net/ELEVEN_ZOU/article/details/80893579
1.基本功能:从一张或者一系列的图片中提取车牌信息,比如车牌号码.车牌颜色等信息. 2.功能扩展:车型.车品牌.车牌类型等. 3.应用方向:电子交易系统(停车自动收费.收费站自动支付等).交通执法.交 ...
- Nginx 配置location root 转自https://blog.csdn.net/rofth/article/details/78581617
nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...
随机推荐
- CentOS配置教程
1.配置网卡开机自动启动 查看/etc/sysconfig/network-scripts/ifcfg-eth0的初始内容: cat /etc/sysconfig/network-scripts/if ...
- summer_19th,Nov 2018
一.内存管理: Cpython解释器的垃圾回收机制 一个没有绑定任何变量名的值被称为垃圾,即该值的引用计数为零. 二.变量值的三个特点: id: 内存地址 type: 数据类型 值 总结:id相同,值 ...
- python javar send
# -*- coding: utf-8 -*-import jpypeimport os.pathjarpath = os.path.join(os.path.abspath('.'), 'axja' ...
- ubuntu启用root登陆
ubuntu系统不能够默认以root用户登陆系统如果你为了方便开发想每次登陆的时候以root用户登陆那么需要手动的做写更改打开终端 首先输入命令 sudo passwd root更新你的密码然后输入 ...
- WPF 创建自定义控件及自定义事件
1 创建自定义控件及自定义事件 /// <summary> /// 演示用的自定义控件 /// </summary> public class ExtButton : Butt ...
- OOP⑷
1.对象数组: /** *学生类 */ public class Student { // 创建一个对象数组保存3名学生的信息 Student[] stus = new Student[3]; int ...
- HTML(二)选择器
1.id选择器 一对一关系 <div id="only">123</div> #only{ background-color:black; } 2.clas ...
- day24 模块03_re
休养生息 --模块03 1.正则表达式 2.在python中使用正则.re 一,正则表达式 (匹配字符串,主要是给字符串使用的) 1)元字符 . 除换行符之外 \w 数字,字母,下划线组成 \W ...
- flask项目结构(四)使用sqlalchemy和alembic
简介 其实我不是啥正经人,错了,不是啥正经程序员,所能想到的估计也就码农一级吧,高级程序员,搞什么算法,什么人工智能,大数据计算…………离我还太遥远. 但是这并不妨碍我继续学习,继续写垃圾小程序. 反 ...
- 深入理解java虚拟机---虚拟机工具jmap(十六)
原文: https://www.cnblogs.com/myna/p/7573843.html jmap JVM Memory Map命令用于生成heap dump文件,如果不使用这个命令,还可以使用 ...