极大极小搜索思想+(α/β)减枝 【转自-----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,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...
随机推荐
- Scanner类完成用户键盘录入
l Scanner类 Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据. Scanner使用步骤: 导包:import java.util.Scanner; ...
- Jquery的jqzoom插件的使用(图片放大镜)
今天学习一下,图片放大镜功能,需要使用插件JQzoom 引入文件 <script type="text/javascript" src="js/jquery.min ...
- sql 中,如何获取两个日期之前月数、周数、天数
1.获取两个日期之间的月数.周数.天数语法 --1.获取两个日期之间的月数.周数.天数 --1.1)声明参数 ) ) --1.2)获取两个日期直接的月数 select DATEDIFF(MM,@sta ...
- Win10系列:JavaScript写入和读取文件
正如上面的内容中所提到的,文件保存选取器用于保存文件,通过Windows.Storage.Pickers命名空间中的FileSavePicker类的pickSaveFileAsync函数可以向指定的文 ...
- learning ddr RTT
Rtt: Dynamic ODT.DDR3引入的新特性.在特定的应用环境下为了更好的在数据总线上改善信号完整性, 不需要特定的MRS命令即可以改变终结强度(或者称为终端匹配).在MR2中的A9和A10 ...
- java this的用法
this 含义:代表当前对象 用法: 用于返回对象的引用 示例代码 public class Test { public Test f() { return this;//获取当前对象的引用 } pu ...
- OO Summary Ⅳ
测试与正确性论证的效果差异 测试,或者说用断言进行黑箱测试,用大量的数据进行“覆盖性测试”,目的是当分支覆盖率达到100%也就是理论上来说所有可能的输入都已经测试过了,而输出结果均是正确的,那么我们理 ...
- python全栈开发笔记---基本数据类型--字符串魔法
字符串: def capitalize(self, *args, **kwargs) test = "aLxs" v = test.capitalize() #capitalize ...
- python 爬虫之 selenium API
一.浏览器操作 1.浏览器最大化 driver.maximize_window() #将浏览器最大化显示 2.设置浏览器宽.高 driver.set_window_size(480, 800)#设置浏 ...
- 内存管理和GC算法以及回收策略
JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: JVM内存回收 Sun的JVMGenerationalCollecting(垃圾回收)原理是这样的:把对象分为年青 ...