前言

在一些复杂的博弈论题目中,每一轮操作都可能有许多决策,于是就会形成一棵庞大的博弈树

而有一些博弈论题没有什么规律,针对这样的问题,我们就需要用一些十分玄学的算法。

例如对抗搜索

对抗搜索简介

一、 对抗搜索的适用范围

在博弈论题目中,如果决策双方的获胜条件是截然相反的,即一方要求得分越高越好,另一方要求得分越低越好,这时我们就可以用上对抗搜索算法。

二、对抗搜索的主要思想

对抗搜索的核心思想就是\(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剪枝相关推荐

  1. 基于python的AI五子棋实现(极大极小值搜索和alpha beta剪枝)

    1.极大极小值搜索介绍 人机博弈是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化极大算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出. M ...

  2. 五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 五子棋AI教程第二版发布啦,地址:https://github.com/lihongxun945/myblog/labels/%E4%BA%94%E5%AD%90%E6%A3%8BAI% ...

  3. alpha-beta剪枝五子棋c语言,五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250 ...

  4. 五子棋AI算法-Alpha Beta剪枝

    上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250000,在我的 ...

  5. alpha,beta剪枝详解

    α,β剪枝详解\alpha,\beta剪枝详解α,β剪枝详解 示例图 步骤详解 基础原理 这里我们先要理解什么是α,β\alpha,\betaα,β剪枝:α\alphaα是下界,β\betaβ是上界. ...

  6. alpha beta 剪枝算法

    摘自wikipedia alpha-β修剪的好处在于可以消除搜索树的分支.这样,搜索时间可以限制在"更有希望"的子​​树中,并且可以在同一时间执行更深入的搜索.该算法和极小化极大算 ...

  7. python alpha beta 剪枝_一看就懂的 Alpha-Beta 剪枝算法详解

    Alpha-Beta剪枝用于裁剪搜索树中没有意义的不需要搜索的树枝,以提高运算速度. 假设α为下界,β为上界,对于α ≤ N ≤ β: 若 α ≤ β  则N有解. 若 α > β 则N无解. ...

  8. (六)从零开始学人工智能-搜索:对抗搜索

    对抗搜索 文章目录 对抗搜索 1 为什么要学习对抗搜索? 2 什么是对抗搜索? 3 对抗搜索算法 3.1 极小极大值算法 3.1.1 分硬币游戏 3.1.2 最优路径示例 3.2 α-β剪枝 3.3 ...

  9. 图像处理​​​​​​​--十大经典算法

    导读:随着现代社会的发展,信息的形式和数量正在迅猛增长.其中很大一部分是图像,图像可以把事物生动地呈现在我们面前,让我们更直观地接受信息. 这是小编的其他文章,希望对大家有所帮助,点击即可阅读 人工智 ...

最新文章

  1. WORD2007中无法插入CMG文件
  2. 7.11.4 第一个程序 设置环境变量
  3. django 开发中数据库可以怎样优化
  4. linux软raid 系统坏了,LINUX下软RAID的制造及如何查看坏盘?
  5. 利用Windows server 2003 实现DHCP中继
  6. LINUX上,2080/1080卡不要混插
  7. 让vim显示空格,及tab字符 vim 多行注释
  8. 疫情下企业面临的关键网络安全建设,去繁从简,保住核心安全
  9. 【2012求职经历】应届生求职经历
  10. 天猫小黑盒从发布新品到影响供应链
  11. 习题 7.4 在上题的基础上,编写一个函数input,用来输入5个学生的数据。
  12. 危化品爆炸场景下的应急通信系统解决方案
  13. Deep Mutual Learning
  14. 热度比肩以太坊的Cosmos生态现在发展得怎么样了?
  15. C#  图片背景变为透明
  16. 【微服务】—— 统一网关Gateway
  17. 计算机网络wifi是什么意思,Mifi是什么,和wifi有什么区别?
  18. t3网络计算机是空白,用友T3登录界面服务器那一行是空白的?
  19. python字符串替换源码_Python实现字符串中某个字母的替代功能
  20. 迄今微软不同时期发布的SQL Server各版本之间的大致区别,供参考查阅

热门文章

  1. 数论总结 (常用定理+ 模板)
  2. 著名加密库收集 Encrypt
  3. 一个关于Oracle更新语句引发的时间字段类型的问题
  4. 快速获取OpenCV库(Lib)文件下的所有文件的目录名~
  5. linux如何编辑启动项,Ubuntu 11.04 启动项的修改
  6. Ubuntu下RMI Server 抛出java.rmi.ConnectException: Connection refused to host: 127.0.0.1解决办法
  7. mail、mailx、sendmail的区别
  8. DPDK加速I/O虚拟化
  9. php微信jssdk下载图片,微信JSSDK上传多张图片回调方法以及服务器端处理下载媒体...
  10. 文本显示变量_Axure9实操教程10-变量