极小极大搜索的算法过程:

参考文档: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剪枝)的更多相关文章

  1. Triangle War POJ - 1085 极小极大搜索

    参考链接:https://www.cnblogs.com/nwpuacmteams/articles/5697873.html 极小极大搜索 的个人理解(alpha-beta剪枝):https://w ...

  2. 极小极大搜索方法、负值最大算法和Alpha-Beta搜索方法

    1. 极小极大搜索方法    一般应用在博弈搜索中,比如:围棋,五子棋,象棋等.结果有三种可能:胜利.失败和平局.暴力搜索,如果想通过暴力搜索,把最终的结果得到的话,搜索树的深度太大了,机器不能满足, ...

  3. 转:极小极大搜索方法、负值最大算法和Alpha-Beta搜索方法

    转自:极小极大搜索方法.负值最大算法和Alpha-Beta搜索方法 1. 极小极大搜索方法    一般应用在博弈搜索中,比如:围棋,五子棋,象棋等.结果有三种可能:胜利.失败和平局.暴力搜索,如果想通 ...

  4. 软件发布版本区别介绍-Alpha,Beta,RC,Release

    Alpha: Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用. 是希腊字母的第一位,表示最初级的版本 alpha就是α,beta就是β alpha版就是比 ...

  5. 软工+C(4): Alpha/Beta换人

    // 上一篇:超链接 // 下一篇:工具和结构化 注:在一次软件工程讨论课程进度设计的过程中,出现了这个关于 Alpha/Beta换人机制的讨论,这个机制在不同学校有不同的实施,本篇积累各方观点,持续 ...

  6. 软工+C(2017第4期) Alpha/Beta换人

    // 上一篇:超链接 // 下一篇:工具和结构化 注:在一次软件工程讨论课程进度设计的过程中,出现了这个关于 Alpha/Beta换人机制的讨论,这个机制在不同学校有不同的实施,本篇积累各方观点,持续 ...

  7. 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 ...

  8. 软件版本GA,RC,alpha,beta含义

    软件版本GA,RC,alpha,beta含义 (1)RC:(Release Candidate) Candidate是候选人的意思,用在软件上就是候选版本.Release.Candidate.就是发行 ...

  9. 扩增子分析解读6进化树 Alpha Beta多样性

    分析前准备 # 进入工作目录 cd example_PE250 上一节回顾:我们的OTU获得了物种注释,并学习OTU表的各种操作————添加信息,格式转换,筛选信息.   接下来我们学习对OTU序列的 ...

随机推荐

  1. django连接mongodb mongoengine

    优点 MongoEngine (http://mongoengine.org)1. 提供了和 Django 原生 ORM 几乎一样的一切,功能已经相当强大;2. 用起来比 Django 原生 ORM ...

  2. VUE 2.0在IE中打开页面空白的原因及解决方法

    前言 因为工作的需要,学习Vue2.0也有一段时间,最近在用Vue2.0的官方脚手架工具构建的项目,chrome中跑一直没有问题,但ie打开出现了bug: 问题 ie打开vue2.0项目空白,控制台报 ...

  3. mysql锁机制之乐观锁(二)

    select for update: 在执行这个 select 查询语句的时候,会将对应的索引访问条目进行上排他锁(X 锁),也就是说这个语句对应的锁就相当于update带来的效果. select * ...

  4. Mac OS OpenVpN 连接设置(转)

    下文介绍Mac OS连接使用OpenVPN方法教程,使用的软件是免费开源的Tunnelblick,当然也有其它连接软件,比如Viscosity,不过这个是付费的,还是前面的用的多. 1.下载安装Tun ...

  5. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) B. The Meeting Place Cannot Be Changed

    地址:http://codeforces.com/contest/782/problem/B 题目: B. The Meeting Place Cannot Be Changed time limit ...

  6. POJ - 2175 Evacuation Plan (最小费用流消圈)

    题意:有N栋楼,每栋楼有\(val_i\)个人要避难,现在有M个避难所,每个避难所的容量为\(cap_i\),每个人从楼i到避难所j的话费是两者的曼哈顿距离.现在给出解决方案,问这个解决方案是否是花费 ...

  7. 卷积网络训练太慢?Yann LeCun:已解决CIFAR-10,目标 ImageNet

    原文连接:http://blog.kaggle.com/2014/12/22/convolutional-nets-and-cifar-10-an-interview-with-yan-lecun/ ...

  8. 性能调优之MySQL篇一:MySQL性能计数器

    计数器 计数器分析 Threads_connected 表示当前有多少个客户连接该mysql服务器,连接数是否过多,网络是否存在问题,它是动态变化的,当达到最大连接数时,数据库系统就不能提供更多的连接 ...

  9. JavaScript校验网址

    JavaScript校验网址 var linkUrl = 'https://www.baidu.com' if( typeof (linkUrl) != undefined && li ...

  10. REST API Design