极小极大搜索 的个人理解(alpha-beta剪枝)
极小极大搜索的算法过程:
参考文档:http://www.xqbase.com/computer/search_minimax.htm (经典)
主要思想比较简单,但说清楚也不大容易。其核心思想是通过对于以后的状态进行预见式的暴搜,对可能的状态进行分析。理论上,如果能够搜索到最终状态,那么之后的走法都已经是确定的了。(这个地方觉得有些糊涂)
对于局面形式的估计首先需要一个合理的估价函数。实际上是因为真正的搜索几乎都是无法搜索到所有的可能性,否则完全用0和1就能表示当前局面的胜负态了。所以需要对局面进行较为合理的分析估价。对于某一方来说都是要使得最终局面状态值(理论上,最终局面状态有且仅有一个)获得最大,所以对于两方来说,可以通过一方估价正越大表示胜率越大,另一方估价正越小(负越大)表示胜率越大。
因此出现了极小极大搜索算法。
从最简单的情况开始分析,首先确定我方要使得最终局面估价最大,而非当前局面估价最大,所以需要预测下一个我方局面的估价如何。而在此之前的一步掌握权在对方的手上,自然会选择对他有利的状态(一定是最终局面形式最大的状态走法),也就是走对于对方最终局面估价最大的状态。因此我方的落子是根据所有下一个状态对方会如何走来决定的。最终局面估价是双方共同决定的。
(常常会被Min和Max状态搞乱,其实不要管这个,花时间弄明白其中的含义,写出来自然能够明白(其实Min()表示走到当前可预见的最后的状态的最小值,Max()反之))
伪代码如下:
int MinMax(int depth) {
if (SideToMove() == WHITE) { // 白方是“最大”者
return Max(depth);
} else { // 黑方是“最小”者
return Min(depth);
}
}
int Max(int depth) {
int best = -INFINITY;
if (depth <= 0) {
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft()) {
MakeNextMove();
val = Min(depth - 1);
UnmakeMove();
if (val > best) {
best = val;
}
}
return best;
}
int Min(int depth) {
int best = INFINITY; // 注意这里不同于“最大”算法
if (depth <= 0) {
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft()) {
MakeNextMove();
val = Max(depth - 1);
UnmakeMove();
if (val < best) { // 注意这里不同于“最大”算法
best = val;
}
}
return best;
}
一个简便的实现方法,通过来回正负的变化来减少代码量,便于维护。
int NegaMax(int depth) {
int best = -INFINITY;
if (depth <= 0) {
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft()) {
MakeNextMove();
val = -NegaMax(depth - 1); // 注意这里有个负号。
UnmakeMove();
if (val > best) {
best = val;
}
}
return best;
}
剪枝方法也有很多,最经典的莫过于alpha-beta剪枝了。
参考文档:http://www.xqbase.com/computer/search_alphabeta.htm
1)β剪枝:
说的通俗一些,比如当前是我方下子,并且下一个我方局面的估价已经完成(递归),即博弈树的第三层已经预知。中间第二层即对方局面,可知对方走的必然是使得最终局面估价最小的一步,故我方当前要下子显然要使得在对方走估价最小的一步能达到的最大的估价。也就是第一层选取的走法是走向 第二层每一个局面对应的最小最终估价走法到达的 最大的局面。
实现中,你实际上不是站在第一层的视角来看,而是在第二层搜索时进行的,故需要保留第一层已经搜索的最大值,而对于第二层的对手来说,我们是敌人。从上帝视角来看,alpha值为当前棋手预估的最终估价的最大值,beta值为上一个局面(实际上先前那个局面还没下,保留对于先前那个局面)对手棋手预估的最终估价的最小值。也就是如果当前走法能够走到比先前那个局面的棋手预估的最终估价的最小值要大(对手显然不会走这步,因为至少估价比当前小),就直接返回(因为对手不会让你走到这个状态,所以之后怎么走都不用管了)。
2) α剪枝:即相反的情况。
伪代码如下:
int AlphaBeta(int depth, int alpha, int beta) {
if (depth == 0) {
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft()) {
MakeNextMove();
val = -AlphaBeta(depth - 1, -beta, -alpha);
UnmakeMove();
if (val >= beta) {
return beta;
}
if (val > alpha) {
alpha = val;
}
}
return alpha;
}
极小极大搜索 的个人理解(alpha-beta剪枝)的更多相关文章
- Triangle War POJ - 1085 极小极大搜索
参考链接:https://www.cnblogs.com/nwpuacmteams/articles/5697873.html 极小极大搜索 的个人理解(alpha-beta剪枝):https://w ...
- 极小极大搜索方法、负值最大算法和Alpha-Beta搜索方法
1. 极小极大搜索方法 一般应用在博弈搜索中,比如:围棋,五子棋,象棋等.结果有三种可能:胜利.失败和平局.暴力搜索,如果想通过暴力搜索,把最终的结果得到的话,搜索树的深度太大了,机器不能满足, ...
- 转:极小极大搜索方法、负值最大算法和Alpha-Beta搜索方法
转自:极小极大搜索方法.负值最大算法和Alpha-Beta搜索方法 1. 极小极大搜索方法 一般应用在博弈搜索中,比如:围棋,五子棋,象棋等.结果有三种可能:胜利.失败和平局.暴力搜索,如果想通 ...
- 软件发布版本区别介绍-Alpha,Beta,RC,Release
Alpha: Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用. 是希腊字母的第一位,表示最初级的版本 alpha就是α,beta就是β alpha版就是比 ...
- 软工+C(4): Alpha/Beta换人
// 上一篇:超链接 // 下一篇:工具和结构化 注:在一次软件工程讨论课程进度设计的过程中,出现了这个关于 Alpha/Beta换人机制的讨论,这个机制在不同学校有不同的实施,本篇积累各方观点,持续 ...
- 软工+C(2017第4期) Alpha/Beta换人
// 上一篇:超链接 // 下一篇:工具和结构化 注:在一次软件工程讨论课程进度设计的过程中,出现了这个关于 Alpha/Beta换人机制的讨论,这个机制在不同学校有不同的实施,本篇积累各方观点,持续 ...
- K 班1-7,alpha,beta 作业成绩汇总
K 班1-7,alpha,beta 作业成绩汇总 千帆竞发 详细得分 短学号 名 1 2 3 4 5 6 7 alpha beta TOTAL 505 基智 4.55 1 -2 0 0 -10 4.3 ...
- 软件版本GA,RC,alpha,beta含义
软件版本GA,RC,alpha,beta含义 (1)RC:(Release Candidate) Candidate是候选人的意思,用在软件上就是候选版本.Release.Candidate.就是发行 ...
- 扩增子分析解读6进化树 Alpha Beta多样性
分析前准备 # 进入工作目录 cd example_PE250 上一节回顾:我们的OTU获得了物种注释,并学习OTU表的各种操作————添加信息,格式转换,筛选信息. 接下来我们学习对OTU序列的 ...
随机推荐
- python之 datatime 模块
datetime 和date 使用上类似 import datetime print(datetime.datetime.today())#当前时间,到毫秒,datetime 类型 2018-01-2 ...
- mac shell
查看所有shell:cat /etc/shells 查看当前正在使用的shell:echo $SHELL 切换shell:chsh -s /bin/zsh
- ZJOI 2009 假期的宿舍 最大匹配
主要是main()中的处理,接下来就是二分匹配的模板题了 #include<cstdio> #include<cstring> #define maxn 110 using n ...
- Nginx基本介绍
1.Nginx介绍 nginx是由俄罗斯人开发的一款高性能的http和反向代理服务器,也可以用来作为邮件代理.相比较于其他的服务器,具有占用内存少,稳定性高等优势 2.反向代理 正向代理类似一个跳板机 ...
- ELK日志系统
ELK stack是又Elasticsearch,lostash,kibana 三个开源软件的组合而成,形成一款强大的实时日志收集分析展示系统. Logstash:日志收集工具,可以从本地磁盘,网络服 ...
- 怎么解决teamviewer检测商业用途无法使用的问题
https://jingyan.baidu.com/article/d5c4b52be51162da560dc517.html
- 如何配置IIS服务器?
1, 先安装IIS 然后安装vs; 注: 顺序颠倒则执行cmd命令: 1,cd \ 2,cd Windows 3, cd Microsoft.NET 4, dir 5,cd Framework 6, ...
- SQL学习笔记之SQL中INNER、LEFT、RIGHT JOIN的区别和用法详解
0x00 建表准备 相信很多人在刚开始使用数据库的INNER JOIN.LEFT JOIN和RIGHT JOIN时,都不太能明确区分和正确使用这三种JOIN操作,本文通过一个简单的例子通俗易懂的讲解这 ...
- Send2MyKindle使用说明文档
软件下载地址为:Send2MyKindle 功能简介 该软件主要功能为在Windows下将Kindle电子书发送到亚马逊中国网站注册的Kindle账户.整个软件界面如下图所示: 使用步骤 使用前的准备 ...
- c# c++通信--命名管道通信
进程间通信有很多种,windows上面比较简单的有管道通信(匿名管道及命名管道) 最近做个本机c#界面与c++服务进行通信的一个需求.简单用命名管道通信.msdn都直接有demo,详见下方参考. c+ ...