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

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

多被称为对抗搜索算法.

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

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

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

对,就是这样.

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

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

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

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

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

即:

 1 int dfsb(int k){
 2   int minn=1000000000;
 3   for (int i=k;i<=n;i++)      //枚举接下来的要取的数
 4     minn=min(minn,dfsa(i+1)-a[i]);      //搜索接下来对b最优的结果,也就是分数最小
 5   minn=min(minn,0);      //考虑不取的情况
 6   return minn;      //返回最优策略的得分
 7 }
 8 int dfsa(int k){
 9   int maxx=-1000000000;
10   for (int i=k;i<=n;i++)      //枚举接下来的要取的数
11     maxx=max(maxx,a[i]+dfsb(i+1));      //搜索接下来对a最优的结果,也就是分数最大
12   maxx=max(maxx,0);      //考虑不取的情况
13   return maxx;      //返回最优策略的得分
14 }

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

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

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

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

于是这就是alpha-beta剪枝.

具体实现如下:

 1 int dfsb(int k,int maxx){      //多传一个maxx值表示上一层已经求出的最大值
 2   int minn=1000000000;
 3   for (int i=k;i<=n;i++) {      //枚举接下来的要取的数
 4     minn=min(minn,dfsa(i+1,minn)-a[i]);      //搜索接下来对b最优的结果,也就是分数最小
 5     if (minn<maxx) return;      //alpha-beta优化
 6   }
 7   minn=min(minn,0);      //考虑不取的情况
 8   return minn;      //返回最优策略的得分
 9 }
10 int dfsa(int k,int minn){      //多传一个minn值表示上一层已经求出的最小值
11   int maxx=-1000000000;
12   for (int i=k;i<=n;i++) {      //枚举接下来的要取的数
13     maxx=max(maxx,a[i]+dfsb(i+1,maxx));      //搜索接下来对a最优的结果,也就是分数最大
14     if (maxx>minn) return;      //alpha-beta优化
15   }
16   maxx=max(maxx,0);      //考虑不取的情况
17   return maxx;      //返回最优策略的得分
18 }

原文地址:https://www.cnblogs.com/xidian-mao/p/9304119.html

时间: 2024-08-30 04:07:15

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

操作系统---栈区与堆区 转自:https://blog.csdn.net/amcp9/article/details/79597481

当一个程序运行时,其RAM存储方式是按照一定的区域划分的,以C为例 内存中的栈区处于相对较高的地址向较低的地址拓展,由操作系统决定的最高地址,所以它是一块连续的内存空间. 栈中分配局部变量空间,堆区是低地址向高地址拓展,用于分配程序员申请的内存空间.另外还有静态区是分配静态变量,全局变量空间的:只读区是分配常量和程序代码空间的:以及其他一些分区. 栈: 栈是为执行线程留出的内存空间.当函数被调用的时候,栈顶为局部变量和一些 bookkeeping 数据预留块.当函数执行完毕,块就没有用了,可能在

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

因为使用DiscuzX3.2进行系统的整合后,因为只是想在原J2EE的系统上增加论坛功能,而且J2EE中已经有一套用户的注册认证的体系,所以不需要在Discuz的系统中去注册以及登录功能,而是通过在J2EE进行注册和登录使用单点登录的方式来完成论坛的注册与登录,这样使两个系统形成了一个整体.具体关于通过J2EE登录就完成论坛登录的单点登录过程请参见<J2EE与DiscuzX3.2的UCenter实现单点登录>,这里只是描述当完成以上功能过后,如何禁止,用户直接在Discuz论坛注册以及登录.

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

转自https://blog.csdn.net/u011489043/article/details/68488459 String 字符串常量 ??StringBuffer 字符串变量(线程安全) ??StringBuilder 字符串变量(非线程安全) ??简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因为String类的声明是:public final,因此在每次对 String 类型进行改变的时候其实都等同于生成了

如何相互转换逗号分隔的字符串和List --https://blog.csdn.net/yywusuoweile/article/details/50315377

如何相互转换逗号分隔的字符串和List ---https://blog.csdn.net/yywusuoweile/article/details/50315377 方法 2: 利用Guava的Joiner [java] view plain copy List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"

py3 web.py转https://blog.csdn.net/weixin_42024288/article/details/80364441

https://blog.csdn.net/weixin_42024288/article/details/80364441 1.安装webpy模块: pip install web.py==0.40.dev 另外将: C:\Python34\Lib\site-packages\web.py-0.40.dev0-py3.4.egg\web\template.py 中约1022行return Template(open(path).read(), filename=path, **self._ke

Consul+upsync+Nginx实现动态负载均衡 摘自https://blog.csdn.net/qq_29247945/article/details/80787014

传统感念:每次修改完nginx配置文件,要重启nginx 动态感念:每次修改完nginx配置信息,不需要重启,nginx实时读取配置信息. Nginx: 反向代理和负载均衡 Consul:是用go编写(谷歌),实现对动态负载均衡注册与发现功能 SpringCloud支持  Zookeeper.Eureka.Consul服务注册与发现. 服务注册:服务实现者可以通过HTTP API或DNS方式,将服务注册到Consul. 服务发现:服务消费者可以通过HTTP API或DNS方式,从Consul获取

转-java编译时error: illegal character &#39;\ufeff&#39; 的解决办法-https://blog.csdn.net/t518vs20s/article/details/80833061

原文链接:https://blog.csdn.net/shixing_11/article/details/6976900 最近开发人员通过SVN提交了xxx.java文件,因发布时该包有问题需要回退,故SCM将该xxx.java文件用editplus打开删除了新添的一行,删除后重新编译打包,却报了如下异常: java:[1,0] illegal character: \65279 表面看着该文件确实没错,看不出来问题,后来从SVN上更新下代码以后,发现本地也不报错,后来通过Eclipse查看了

https://blog.csdn.net/the_liang/article/details/82708907

转自:https://blog.csdn.net/the_liang/article/details/82708907 Xmanager Power Suit 6.0.0109 最新版注册激活,长期更新以下方法基本上可以对最近版本适用,也就是说不需要我更新文章,你也可以通过以下方法尝试激活最新的版本!操作步骤 Xmanger Power Suit 官方 其实有两种 .exe 文件,一个是用于试用的,在注册的时候不能直接输入密钥.而另一个是为注册用户提供的 .exe 文件,在注册的时候可以输入密钥

https://blog.csdn.net/wang926454/article/details/82971442

https://blog.csdn.net/wang926454/article/details/82971442 https://github.com/dolyw/VueStudy 原文地址:https://www.cnblogs.com/leiqun123/p/12036600.html