博弈论经典算法(一)——对抗搜索与Alpha-Beta剪枝
前言
在一些复杂的博弈论题目中,每一轮操作都可能有许多决策,于是就会形成一棵庞大的博弈树。
而有一些博弈论题没有什么规律,针对这样的问题,我们就需要用一些十分玄学的算法。
例如对抗搜索。
对抗搜索简介
一、 对抗搜索的适用范围
在博弈论题目中,如果决策双方的获胜条件是截然相反的,即一方要求得分越高越好,另一方要求得分越低越好,这时我们就可以用上对抗搜索算法。
二、对抗搜索的主要思想
对抗搜索的核心思想就是\(dfs\)遍历一遍博弈树。
不难想到,如果博弈树非常庞大,在不加优化的情况下,对抗搜索的时间效率是十分低下的。
因此,我们就需要对对抗搜索进行一定的优化。
三、对抗搜索的优化
对抗搜索的优化一般来讲有两种:记忆化和 \(Alpha-Beta\)剪枝 。
不过需要注意,如果两个优化一起使用,很可能会产生化学反应出现一些奇妙的\(Bug\)(我已经亲身体验过了)。
对抗搜索优化一:记忆化
记忆化应该是搜索中一个比较常用的技巧。
一、大致思路
它的大致思路就是,对于当前的某一种状态,在求解后将结果记录下来,下一次再访问到时直接将存下来的结果返回即可。
二、模板
记忆化优化对抗搜索的伪代码如下:
inline int dfs(Status s,int Which)//Status记录当前状态,Which记录当前操作的选手,其中0号选手取Max,1号选手取Min
{if(res[s]) return res[s];//如果之前已经求出过这个状态的结果,直接返回if(IsEnd(s)) return GetVal(s);//如果当前状态已经为最终状态,就返回当前状态的分值register int i,ans=Which?1e9:0;expend(s);//扩展当前状态,并将新状态存储于NewStatus数组中,用NewStatusTotal记录新状态的数量for(i=1;i<=NewStatusTotal;++i)//枚举从当前状态能够扩展到的新状态ans=Which?min(ans,dfs(NewStatus[i],Which^1):max(ans,dfs(NewStatus[i],Which^1);//不断dfs,更新ansreturn res[s]=ans;//将最终求解出的结果存储下来
}
对抗搜索优化二:\(Alpha-Beta\)剪枝
\(Alpha-Beta\)剪枝应该是对抗搜索一个比较巧妙的优化。
一、大致思路
如图是一棵博弈树:
假设第一个决策者的目的是取最大值,第二个决策者的目的是取最小值。
在搜索完根节点的两个子节点后,博弈树就会变成这样:
这时,我们再来看根节点的第三个子节点。
不难发现,在处理完第三个节点的第一个子节点之后,第三个节点的权值就会变成\(2\)。
因为第三个节点的目标是取最小值,因此最终第三个节点的权值必定小于等于\(2\)。
而根节点的目标是取最大值,且此时根节点的权值已经为\(3\)了。
也就是说,第三个节点对最终答案肯定是没有任何贡献的。
因此对于第三个节点的剩余两个状态,我们就无需继续搜索了,可以直接退出。
这就是传说中的\(Alpha-Beta\)剪枝了。
二、模板
\(Alpha-Beta\)剪枝优化对抗搜索的伪代码如下:
inline int dfs(Status s,int Alpha,int Beta,int Which)//Status记录当前状态,Which记录当前操作的选手,其中0号选手取Max,1号选手取Min
//Alpha存储较大值,Beta存储较小值
//如果当前节点是取Max的节点,则Alpha表示当前节点父亲的父亲的权值,Beta表示当前节点父亲的权值
//如果当前节点是取Min的节点,则Alpha表示当前节点父亲的权值,Beta表示当前节点父亲的父亲的权值
{if(IsEnd(s)) return GetVal(s);//如果当前状态已经为最终状态,就返回当前状态的分值register int i;expend(s);//扩展当前状态,并将新状态存储于NewStatus数组中,用NewStatusTotal记录新状态的数量for(i=1;i<=NewStatusTotal;++i)//枚举从当前状态能够扩展到的新状态{t=dfs(NewStatus,Alpha,Beta,Which^1);//求出当前枚举到的新状态的分值(s.Which?Beta=min(Beta,t):Alpha=max(Alpha,t)); //如果当前节点取min,就更新Beta,否则更新Alphaif(Alpha>=Beta) break;//如果Alpha≥Beta,就说明这个节点对最终答案没有贡献了,就结束搜索}return s.Which?Beta:Alpha;//返回相应值
}
后记
对抗搜索的核心内容差不多也就是这些。
但是,如果真正用起来,对抗搜索其实还是挺复杂的。
下面推荐一道例题:【BZOJ3106】[CQOI2013] 棋盘游戏
转载于:https://www.cnblogs.com/chenxiaoran666/p/AlphaBetaDFS.html
博弈论经典算法(一)——对抗搜索与Alpha-Beta剪枝相关推荐
- 基于python的AI五子棋实现(极大极小值搜索和alpha beta剪枝)
1.极大极小值搜索介绍 人机博弈是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化极大算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出. M ...
- 五子棋AI算法第三篇-Alpha Beta剪枝
剪枝是必须的 五子棋AI教程第二版发布啦,地址:https://github.com/lihongxun945/myblog/labels/%E4%BA%94%E5%AD%90%E6%A3%8BAI% ...
- alpha-beta剪枝五子棋c语言,五子棋AI算法第三篇-Alpha Beta剪枝
剪枝是必须的 上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250 ...
- 五子棋AI算法-Alpha Beta剪枝
上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250000,在我的 ...
- alpha,beta剪枝详解
α,β剪枝详解\alpha,\beta剪枝详解α,β剪枝详解 示例图 步骤详解 基础原理 这里我们先要理解什么是α,β\alpha,\betaα,β剪枝:α\alphaα是下界,β\betaβ是上界. ...
- alpha beta 剪枝算法
摘自wikipedia alpha-β修剪的好处在于可以消除搜索树的分支.这样,搜索时间可以限制在"更有希望"的子树中,并且可以在同一时间执行更深入的搜索.该算法和极小化极大算 ...
- python alpha beta 剪枝_一看就懂的 Alpha-Beta 剪枝算法详解
Alpha-Beta剪枝用于裁剪搜索树中没有意义的不需要搜索的树枝,以提高运算速度. 假设α为下界,β为上界,对于α ≤ N ≤ β: 若 α ≤ β 则N有解. 若 α > β 则N无解. ...
- (六)从零开始学人工智能-搜索:对抗搜索
对抗搜索 文章目录 对抗搜索 1 为什么要学习对抗搜索? 2 什么是对抗搜索? 3 对抗搜索算法 3.1 极小极大值算法 3.1.1 分硬币游戏 3.1.2 最优路径示例 3.2 α-β剪枝 3.3 ...
- 图像处理--十大经典算法
导读:随着现代社会的发展,信息的形式和数量正在迅猛增长.其中很大一部分是图像,图像可以把事物生动地呈现在我们面前,让我们更直观地接受信息. 这是小编的其他文章,希望对大家有所帮助,点击即可阅读 人工智 ...
最新文章
- WORD2007中无法插入CMG文件
- 7.11.4 第一个程序 设置环境变量
- django 开发中数据库可以怎样优化
- linux软raid 系统坏了,LINUX下软RAID的制造及如何查看坏盘?
- 利用Windows server 2003 实现DHCP中继
- LINUX上,2080/1080卡不要混插
- 让vim显示空格,及tab字符 vim 多行注释
- 疫情下企业面临的关键网络安全建设,去繁从简,保住核心安全
- 【2012求职经历】应届生求职经历
- 天猫小黑盒从发布新品到影响供应链
- 习题 7.4 在上题的基础上,编写一个函数input,用来输入5个学生的数据。
- 危化品爆炸场景下的应急通信系统解决方案
- Deep Mutual Learning
- 热度比肩以太坊的Cosmos生态现在发展得怎么样了?
- C# 图片背景变为透明
- 【微服务】—— 统一网关Gateway
- 计算机网络wifi是什么意思,Mifi是什么,和wifi有什么区别?
- t3网络计算机是空白,用友T3登录界面服务器那一行是空白的?
- python字符串替换源码_Python实现字符串中某个字母的替代功能
- 迄今微软不同时期发布的SQL Server各版本之间的大致区别,供参考查阅
热门文章
- 数论总结 (常用定理+ 模板)
- 著名加密库收集 Encrypt
- 一个关于Oracle更新语句引发的时间字段类型的问题
- 快速获取OpenCV库(Lib)文件下的所有文件的目录名~
- linux如何编辑启动项,Ubuntu 11.04 启动项的修改
- Ubuntu下RMI Server 抛出java.rmi.ConnectException: Connection refused to host: 127.0.0.1解决办法
- mail、mailx、sendmail的区别
- DPDK加速I/O虚拟化
- php微信jssdk下载图片,微信JSSDK上传多张图片回调方法以及服务器端处理下载媒体...
- 文本显示变量_Axure9实操教程10-变量