算法设计——极大极小搜索

原创 2010年08月13日 22:42:00

极大极小搜索策略一般都是使用在一些博弈类的游戏之中:

 

这样策略本质上使用的是深度搜索策略,所以一般可以使用递归的方法来实现。在搜索过程中,对本方有利的搜索点上应该取极大值,而对本方不利的搜索点上应该取极小值。

极小值和极大值都是相对而言的。

 

在搜索过程中需要合理的控制搜索深度,搜索的深度越深,效率越低,但是一般来说,走法越好。

 

极大极小搜索可以分开写,也可以放在一起写。

 

主要的算法步骤如下:

 

输入:搜索的深度

输出:节点的最佳走法,及其对应的最佳估值

函数形式:int minMaxSearch(int depth )   这里也可以添加int side参数表示当前谁是走棋方

 

如果轮到红方走棋,则

      初始化最优值best = 负无穷大                     //极大点        ,这里认为红方先走棋

否则

      初始化最优值best = 正无穷大                     //极小点

 

如果depth<= 0

      调用评估函数值

 

否则

      生成当前所有合理的走法

      对每一步走法

             执行走法

             调用minMaxSearch(depth -1 ) , 并把值赋给value

             撤销走法

 

             如果轮到红方走棋,则

                     如果value > best

                              best = value

                              如果depth == MAX_DEPTH

                                     bestMove = mv

             否则

                     如果value < best

                              best = value

                              如果depth == MAX_DEPTH

                                     bestMove = mv

 

返回best

 

在局面评估函数中一般返回双方优势的差值,以此作为评估值。

 

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

这里总结一下负极大值搜索策略:

一个局面对红方的优势为X,那么对于黑方的优势就是-X;一个局面对红方的优势为-X,对黑方的优势就是X。在负极大值搜索算法中,没有了极小点,只有极大点。需要注意的是,局面对一方的优势转化为另一方的优势时需要加负号。局面估计区间是一个关于0点对称的区间:

[-MaxValue,MaxValue].需要注意的是,为了能使负极大值搜索算法得到正确的评价,必须修改局面评估函数的返回值,原来在极大极小搜索算法中始终返回的是红方的优势,现在要改为当前走棋方的优势

 

负极大值搜索算法:

 

输入:搜索深度

输出:节点的最佳走法,及对应的最佳估值

函数形式:int negaMaxSearch(int depth)

 

初始化最优值best=负无穷大                //都是极大点

如果depth小于等于0

       调用评估函数,并将结果赋给value

       返回value值

 

否则

      生成当前所有合法的走法

      对于每一步走法

            执行走法

            value= -negaMaxSearch(depth-1)             //注意函数之前有负号

            撤销走法

            如果 value> best

                    best=value

                    如果  depth == Max_Depth

                            bestMove=mv

返回best                                                                 //返回某个搜索分支的最优评估值

 

 

评估函数的算法:

 

输入:棋局

输出:局面对当前走方的优势

 

rValue:红方的优势总和

bValue:黑方的优势总和

 

分别进行评估,具体问题具体设计,获得rValue和bValue的值

 

如果当前局面是红方走棋

     return rValue-bValue;

否则

     return bValue-rValue;

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

极大极小搜索策略与负极大值搜索策略的改进——alpha-beta剪枝搜索策略

 

一般来说,为了在搜索过程中引起剪枝,在递归过程中要向下传递两个参数。第1个参数是alpha,它表示当前搜索节点走棋的一方搜索到的最好值,任何比它小的值都没有意义。第2个值是beta,表示对手目前的劣势,这是对手所能承受的最还的结果,比它大的值都会被舍弃。

因为是负极大值搜索,beta值越大,表示对方的劣势越明显,beta值越小,表示劣势也越小。

 

对于alpha-beta搜索剪枝算法,由于初始状态时还没有alpha-beta值,可以使用-MaxValue~MaxValue对应。

 

Alpha-Beta搜索剪枝算法如下:

 

输入:搜索深度、alpha、beta

输出:节点的最佳走法、及对应的最佳估值

函数形式:int alphaBetaSearch(int depth ,int alpha,int beta)

 

如果depth小于等于0

      调用评估函数,并将结果赋给value

      返回value值

否则

      生成当前所有合理的走法

      对每一个走法

           执行走法

           value= - alphaBetaSearch( depth-1 , -beta , -alpha); 

           //注意函数前面有负值,且参数alpha,beta分别取负值并进行交换

           撤销走法

           如果 value>=beta             //使得可能引起的走法先被搜索,因为搜索的效率很大程度上取决于剪枝的效果

                  返回beta

          如果   value>alpha

                  alpha=value

                  如果 depth == Max_Depth

                  bestmove=mv

      返回alpha

 

调用形式:alphaBetaSearch(MaxDepth,-MaxValue,MaxValue)

习惯上把传递给一个待搜索节点的alpha和beta值组成的这个区间称为搜索窗口

搜索窗口越窄,引发剪枝的可能性就越大,,搜索效率就越高。

传递给一个待搜索节点的alpha值会大于beta值吗?(绝对不会,连等于都不可能)。

 

 

下面是POJ3317 Stake your Claim的题目,分别使用负极大值搜索和alpha-beta剪枝优化的代码,从这个实验发现alpha-beta剪枝对效率的提高很有帮助。

 

下面是定义的一个局面评估的类:

 

 

下面是负极大值搜索的实现:一开始使用极大极小总是得不到正确的结果,后来直接使用负极大值搜索策略,这里需要注意的是,负极大值搜索对应的评估函数需要针对不同的当前下棋方来来返回评估值,另外在搜索函数中,所有的点都是极大值的点,所以best的值就可以直接赋值为INT_MIN.在递归函数返回时,也不必进行side的判断了。

 

 

下面是增加alpha-beta剪枝后的代码,注意的是剪枝的方法:

 

 

 

相关文章推荐

五子棋(二)极大极小搜索 + 剪枝

五子棋(二)极大极小搜索 + 剪枝

五子棋(人机)-极大极小值搜索算法

从人落子开始到出现胜负或者和局,之间所落的子,构成了一个解。而解空间就是一个树,解就是这解空间中的一条路径。只不过这个解空间是电脑的选择和人的选择共同构成的(奇数层是电脑(因为轮到电脑落子么),偶数层...

一字棋游戏设计-极大极小搜索

1.     问题定义 一字棋游戏,包括两个选手。用户可以在一个3*3的棋盘上任意的选择空闲的位置拜访棋子,最早在水平方向上,或者垂直方向上或者对角线方向上形成三子一线者获胜。棋盘如图1所示。这里我...

极小极大算法与井字棋

在简单的游戏中,能够从当前游戏状态出发,搜索游戏的博弈树并确定最优行动方案的算法是存在的。其中最有名的算法就是极小极大算法。对于简单的双人游戏,极小极大算法很有用。它是在轮流行动的游戏中选择最好的行动...

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

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

理解极小极大搜索算法

Understanding The Minimax Algorithm-理解极小极大搜索算法          One of the most interesting avenues of c...

极小化极大算法

极小化极大(minimax)算法顾名思义,就是让最大得情况最小,这里的最大一般是指最差的情况,比如游戏中最不利的情况。 该算法需要满足零和博弈,初略的解释就是若有两个玩家进行游戏,如果其中一方得到利益...

五子棋AI博弈树之带Alpha-Beta剪枝的极大极小过程函数

 在博弈树的极大极小过程中是对每一个树节点(称它为全局搜索吧)都要计算其估值,然后在这些估值中做出选择。如果搜索比较大的话,全局搜索的方式效率会非常低,因为有一些节点根本不需要搜索。那么怎么...

五子棋AI算法第二篇-极大极小值搜索算法

AI实现的基本思路-极大极小值搜索算法五子棋看起来有各种各样的走法,而实际上把每一步的走法展开,就是一颗巨大的博弈树。在这个树中,从根节点为0开始,奇数层表示电脑可能的走法,偶数层表示玩家可能的走法。...

POJ 3317 Stake Your Claim(极大极小搜索+alpha-beta剪枝)

转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove   题目:给出一个n*n的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法设计——极大极小搜索
举报原因:
原因补充:

(最多只允许输入30个字)