`
jiang5495
  • 浏览: 93061 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

 Alpha-Beta 搜索简介(转载)

阅读更多
《对弈程序基本技术》专题
 
Bruce Moreland / 文
 
最小-最大的问题
 
  Alpha-Beta 同“最小-最大”非常相似,事实上只多了一条额外的语句。最小最大运行时要检查整个博弈树,然后尽可能选择最好的线路。这是非常好理解的,但效率非常低。每次搜索更深一层时,树的大小就呈指数式增长。
  通常一个国际象棋局面都有35个左右的合理着法,所以用最小-最大搜索来搜索一层深度,就有35个局面要检查,如果用这个函数来搜索两层,就有352个局面要搜索。这就已经上千了,看上去还不怎样,但是数字增长得非常迅速,例如六层的搜索就接近是二十亿,而十层的搜索就超过两千万亿了。
  要想通过检查搜索树的前面几层,并且在叶子结点上用启发式的评价,那么做尽可能深的搜索是很重要的。最小-最大搜索无法做到很深的搜索,因为有效的分枝因子实在太大了。
 
口袋的例子
 
  幸运的是我们有办法来减小分枝因子,这个办法非常可靠,实际上这样做绝对没有坏处,纯粹是个有益的办法。这个方法是建立在一个思想上的,如果你已经有一个不太坏的选择了,那么当你要作别的选择并知道它不会更好时,你没有必要确切地知道它有多坏。有了最好的选择,任何不比它更好的选择就是足够坏的,因此你可以撇开它而不需要完全了解它。只要你能证明它不比最好的选择更好,你就可以完全抛弃它。
  你可能仍旧不明白,那么我就举个例子。比如你的死敌面前有很多口袋,他和你打赌赌输了,因此他必须从中给你一样东西,而挑选规则却非常奇怪:
  每个口袋里有几件物品,你能取其中的一件,你来挑这件物品所在的口袋,而他来挑这个口袋里的物品。你要赶紧挑出口袋并离开,因为你不愿意一直做在那里翻口袋而让你的死敌盯着你。
  假设你一次只能找一只口袋,在找口袋时一次只能从里面摸出一样东西。
  很显然,当你挑出口袋时,你的死敌会把口袋里最糟糕的物品给你,因此你的目标是挑出“诸多最糟的物品当中是最好的”那个口袋。
  你很容易把最小-最大原理运用到这个问题上。你是最大一方棋手,你将挑出最好的口袋。而你的死敌是最小一方棋手,他将挑出最好的口袋里尽可能差的物品。运用最小-最大原理,你需要做的就是挑一个有“最好的最差的”物品的口袋。
  假设你可以估计口袋里每个物品的准确价值的话,最小-最大原理可以让你作出正确的选择。我们讨论的话题中,准确评价并不重要,因为它同最小-最大或Alpha-Beta的工作原理没有关系。现在我们假设你可以正确地评价物品。
  最小-最大原理刚才讨论过,它的问题是效率太低。你必须看每个口袋里的每件物品,这就需要花很多时间。
  那么怎样才能做得比最小-最大更高效呢?
  我们从第一个口袋开始,看每一件物品,并对口袋作出评价。比方说口袋里有一只花生黄油三明治和一辆新汽车的钥匙。你知道三明治更糟,因此如果你挑了这只口袋就会得到三明治。事实上只要我们假设对手也会跟我们一样正确评价物品,那么口袋里的汽车钥匙就是无关紧要的了。
  现在你开始翻第二个口袋,这次你采取的方案就和最小-最大方案不同了。你每次看一件物品,并跟你能得到的最好的那件物品(三明治)去比较。只要物品比三明治更好,那么你就按照最小-最大方案来办——去找最糟的,或许最糟的要比三明治更好,那么你就可以挑这个口袋,它比装有三明治的那个口袋好。
  比方这个口袋里的第一件物品是一张20美元的钞票,它比三明治好。如果包里其他东西都没比这个更糟了,那么如果你选了这个口袋,它就是对手必须给你的物品,这个口袋就成了你的选择。
  这个口袋里的下一件物品是六合装的流行唱片。你认为它比三明治好,但比20美元差,那么这个口袋仍旧可以选择。再下一件物品是一条烂鱼,这回比三明治差了。于是你就说“不谢了”,把口袋放回去,不再考虑它了。
  无论口袋里还有什么东西,或许还有另一辆汽车的钥匙,也没有用了,因为你会得到那条烂鱼。或许还有比烂鱼更糟的东西(那么你看着办吧)。无论如何烂鱼已经够糟的了,而你知道挑那个有三明治的口袋肯定会更好。
 
算法
 
  Alpha-Beta就是这么工作的,并且只能用递归来实现。稍后我们再来谈最小一方的策略,我希望这样可以更明白些。
  这个思想是在搜索中传递两个值,第一个值是Alpha,即搜索到的最好值,任何比它更小的值就没用了,因为策略就是知道Alpha的值,任何小于或等于Alpha的值都不会有所提高。
  第二个值是Beta,即对于对手来说最坏的值。这是对手所能承受的最坏的结果,因为我们知道在对手看来,他总是会找到一个对策不比Beta更坏的。如果搜索过程中返回Beta或比Beta更好的值,那就够好的了,走棋的一方就没有机会使用这种策略了。
  在搜索着法时,每个搜索过的着法都返回跟Alpha和Beta有关的值,它们之间的关系非常重要,或许意味着搜索可以停止并返回。
  如果某个着法的结果小于或等于Alpha,那么它就是很差的着法,因此可以抛弃。因为我前面说过,在这个策略中,局面对走棋的一方来说是以Alpha为评价的。
  如果某个着法的结果大于或等于Beta,那么整个结点就作废了,因为对手不希望走到这个局面,而它有别的着法可以避免到达这个局面。因此如果我们找到的评价大于或等于Beta,就证明了这个结点是不会发生的,因此剩下的合理着法没有必要再搜索。
  如果某个着法的结果大于Alpha但小于Beta,那么这个着法就是走棋一方可以考虑走的,除非以后有所变化。因此Alpha会不断增加以反映新的情况。有时候可能一个合理着法也不超过Alpha,这在实战中是经常发生的,此时这种局面是不予考虑的,因此为了避免这样的局面,我们必须在博弈树的上一个层局面选择另外一个着法。
  在第二个口袋里找到烂鱼就相当于超过了Beta,如果口袋里没有烂鱼,那么考虑六盒装流行唱片的口袋会比三明治的口袋好,这就相当于超过了Alpha(在上一层)。算法如下,醒目的部分是在最小-最大算法上改过的:
 
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:
 
val = AlphaBeta(5, -INFINITY, INFINITY);
 
  这样就完成了5层的搜索。我在写最小-最大函数时,用了一个诀窍来避免用了“Min”还用“Max”函数。在那个算法中,我从递归中返回时简单地对返回值取了负数。这样就使函数值在每一次递归中改变评价的角度,以反映双方棋手的交替着子,并且它们的目标是对立的。
  在Alpha-Beta函数中我们做了同样的处理。唯一使算法感到复杂的是,Alpha和Beta是不断互换的。当函数递归时,Alpha和Beta不但取负数而且位置交换了,这就使得情况比口袋的例子复杂,但是可以证明它只是比最小-最大算法更好而已。
  最终出现的情况是,在搜索树的很多地方,Beta是很容易超过的,因此很多工作都免去了。
 
可能的弱点
 
  这个算法严重依赖于着法的寻找顺序。如果你总是先去搜索最坏的着法,那么Beta截断就不会发生,因此该算法就如同最小-最大一样,效率非常低。该算法最终会找遍整个博弈树,就像最小-最大算法一样。
  如果程序总是能挑最好的着法来首先搜索,那么数学上有效分枝因子就接近于实际分枝因子的平方根。这是Alpha-Beta算法可能达到的最好的情况。
  由于国际象棋的分枝因子在35左右,这就意味着Alpha-Beta算法能使国际象棋搜索树的分枝因子变成6。
  这是很大的改进,在搜索结点数一样的情况下,可以使你的搜索深度达到原来的两倍。这就是为什么使用Alpha-Beta搜索时,着法顺序至关重要的原因。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/DL88250/archive/2008/05/24/2477478.aspx
分享到:
评论

相关推荐

    alpha-beta滤波器的仿真

    .Alpha-Beta滤波器是一种简单有效的滤波器,通过Alpha-Beta滤波器可以对接收机给出的测量值进行平滑,在本程序中对alpha-beta滤波器进行了MATLAB仿真

    人工智能小项目,2048棋盘游戏,Alpha-beta剪枝算法, Expectimax搜索

    在这个名为"AI-2048"的人工智能小项目中,我们主要关注的是2048棋盘游戏的实现,以及两种优化搜索策略:Alpha-beta剪枝算法和Expectimax搜索。2048是一款非常受欢迎的数字拼图游戏,玩家通过合并相同数字的方块来...

    alpha-beta剪枝算法实现中国象棋人机对战

    使用alpha-beta剪枝算法实现中国象棋人机对战,AI具有中级的智能,可以应对一般的象棋爱好者。

    Python使用Min-max算法和Alpha-Beta剪枝的黑白棋游戏AI代码 Pygame可视化

    # Python使用Min-max算法和Alpha-Beta剪枝的黑白棋游戏AI代码 Pygame可视化 本项目是基于pygame实现的黑白棋(翻转棋)游戏,通过Min-max算法和Alpha-Beta剪枝实现人工智能对手。 使用方法: 1. 安装 pygame: $ pip...

    alpha-beta剪枝五子棋

    “alpha-beta剪枝”是一种优化的博弈树搜索算法,它基于最小-最大搜索策略。在五子棋AI中,最小-最大搜索算法会尝试预测对手的最佳走法(最大化对手的损失,即最小化自己的得分),同时计算出自己的最佳走法(最大化...

    人工智能alpha-beta剪枝

    在人工智能领域,搜索算法是解决问题的关键技术之一,而Alpha-Beta剪枝是其中最著名、最高效的优化策略,尤其在棋类游戏的决策过程中。它结合了Alpha(α)和Beta(β)两个值,用于在多层深度优先搜索中避免无效的...

    JS五子棋AI,源码+教程,基于Alpha-Beta剪枝算法(不是神经网络).zip

    JS五子棋AI,源码+教程,基于Alpha-Beta剪枝算法(不是神经网络) JS五子棋AI,源码+教程,基于Alpha-Beta剪枝算法(不是神经网络) JS五子棋AI,源码+教程,基于Alpha-Beta剪枝算法(不是神经网络) JS五子棋AI,...

    精选_基于alpha-beta剪枝博弈树算法实现的一字棋游戏_源码打包

    在这个基于alpha-beta剪枝的博弈树算法实现中,我们深入探讨如何利用计算机科学中的智能算法来创建一个能与玩家对战的智能系统。本文将详细介绍alpha-beta剪枝算法及其在一字棋游戏中的应用。 首先,我们要理解博弈...

    几个变形的Alpha-Beta搜索算法(很经典)

    Alpha-Beta 搜索算法是一种经典的优化版的最小-最大搜索策略,主要用于解决决策树型问题,特别是棋类游戏中的最佳走法选择。该算法源于最小-最大搜索,但通过剪枝技术显著提高了效率。 最小-最大搜索算法的核心是...

    alpha-beta算法 一字棋

    Alpha-Beta算法是搜索树策略中的一种优化技术,尤其在棋类游戏的决策过程中发挥着关键作用。它基于著名的Minimax算法,通过剪枝策略来减少不必要的计算,提高搜索效率。在这里,我们将深入探讨如何运用Alpha-Beta...

    alpha-beta_as_line2ine_alphabeta_Frame_

    《alpha-beta as line to line expressions》是关于计算机科学领域中搜索算法的一个重要主题,主要涉及的是Alpha-Beta剪枝技术的线性表示方法。Alpha-Beta剪枝是用于优化棋类游戏(如国际象棋、围棋等)的决策树搜索...

    alpha-beta剪枝讲解

    这个是我们老师在上课时对alpha-beta剪枝的解释,个人觉得比较容易理解,因为在博客中无法上传视频,所以只能上传为资源了.对于这个视频我有相应的博客解释.

    卡尔曼滤波器和alpha-beta-gama滤波器.rar_MATLAB雷达探测_alpha-beta_alpha-beta 滤

    用于雷达探测点迹滤波的卡尔曼滤波器器和alpha beta gama 滤波器 matlab程序

    简单的alpha-beta剪枝算法

    Alpha-beta剪枝是一种在棋盘游戏中优化搜索策略的算法,它是Minimax算法的改进版本,用于减少不必要的计算,提高搜索效率。在这个简单的alpha-beta剪枝算法中,我们将深入理解其原理、实现步骤以及如何构建搜索树。 ...

    极大极小值搜索-基于alpha-beta剪枝算法的AI五子棋人机博弈游戏python源码.zip

    极大极小值搜索-基于alpha-beta剪枝算法的AI五子棋人机博弈游戏python源码.zip极大极小值搜索-基于alpha-beta剪枝算法的AI五子棋人机博弈游戏python源码.zip极大极小值搜索-基于alpha-beta剪枝算法的AI五子棋人机...

    人工智能小游戏-基于alpha-beta剪枝算法实现的五子棋源码

    ======================================================================== MICROSOFT FOUNDATION CLASS LIBRARY : fir ======================================================================== ...

    java实现采用Alpha-Beta剪枝搜索实现黑白棋AI源码(人工智能期末作业).zip

    java实现采用Alpha-Beta剪枝搜索实现黑白棋AI源码(人工智能期末作业).zip该项目是个人高分期末大作业设计项目源码,已获导师指导认可通过,都经过严格调试,确保可以运行!放心下载使用。 java实现采用Alpha-...

    中国象棋python实现 Alpha-beta剪枝+GUI+历史启发式+有普通人棋力

    不用神经网络强化学习,只用alpha-beta剪枝和搜索实现的下象棋!我们的中国象棋使用python实现,总共2000+行代码,分为走法计算、评估函数与搜索和UI三部分,并采用历史启发算法进行优化,有着不错的效果。可以实现...

Global site tag (gtag.js) - Google Analytics