AlphaBeta剪枝算法

  AlphaBeta算法是根据Minimax算法得来的,首先我们必须明白MiniMax算法的思想。Minimax算法常用于棋类等由两方较量的游戏和程序。该算法是一个零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,另一方则选择令对手优势最小化的方法。而开始的时候总和为0。

   但是如果实际中使用Minimax算法,由于搜索深度和可能的情况很多,算法的效率很不理想,其实并没有必要每个节点都必须搜索完毕,有些事没有必要的。AlphaBeta算法正是为了解决这个问题。

1. 对于一个MIN节点,若能估计出其倒推值的上确界Beta,并且这个Beta值不大于MIN的父节点(MAX节点)的估计倒推值的下确界Alpha,即Alpha≥Beta,则就不必再扩展该MIN节点的其余子节点了,因为这些节点的估值对MIN父节点的倒推值已无任何影响了,这一过程称为Alpha剪枝。
2. 对于一个MAX节点,若能估计出其倒推值的下确界Alpha,并且这个Alpha值不小于MAX的父节点(MIN节点)的估计倒推值的上确界Beta,即Alpha≥Beta,则就不必再扩展该MAX节点的其余子节点了,因为这些节点的估值对MAX父节点的倒推值已无任何影响了。这一过程称为Beta剪枝。
3. 一个MAX节点的Alpha值等于其后继节点当前最大的最终倒推值,一个MIN节点的Beta值等于其后继节点当前最小的最终倒推值

AlphaBeta剪枝算法      
AlphaBeta剪枝算法(假设方框表示取极大值的节点,圆圈表示取极小值的节点)
B的值是18,D的值为16,而C是取极小值,由此可以判断C《=16,而A取Max(B,C),故没必要考虑C的其他子节点了。
Alphabeta的MiniMax形式,伪代码:
alpha-beta(player,board,alpha,beta)
 if(game over in current board position) return winner 
 children = all legal moves for player from this board 
 if(max's turn) 
 for each child 
 score = alpha-beta(other player,child,alpha,beta)
 (we have found a better best move....) 
 if score > alpha then alpha = score 
 (cut off...) 
 if alpha >= beta then return alpha 
 return alpha (this is our best move) 
 else (min's turn)
 for each child
 score = alpha-beta(other player,child,alpha,beta)
 (opponent has found a better worse move.....)
 if score < beta then beta = score
 (cut off....)
 if alpha >= beta then return beta
 return beta (this is the opponent's best move)
AlphaBeta的递归形式
01  int  AlphaBeta( int  depth,  int  alpha,  int  beta) 
02 
      //如果层数为0或者已达最终状态则返回 本步棋的估值  
03      if (depth ==  0  || IsGameOver())  return  Evaluate(); 
04      for (each possible move){ 
06       MakeMove();  
08        int  val -AlphaBeta(depth  1 -beta, -alpha); 
09       UnMakeMove();       
11        if (val >= beta)
13          return  val; 
14     //注意,这里需要返回val,因为上一层应该知道具体搜索到的值,以配合各种Alpha-Beta算法的变种 
15       
16        if (val alpha)
18         alpha val; 
19         ... 
20        //当然 这里还需要记录这步最佳的走法 
21         
24     
25      return  alpha; //返回最好的值 
26 
27 
28  Alpha 表示 MAX 节点的下界值,
29 
   AlphaBeta 算法的递归形式关键就是理解负号,在每一层节点中都是求最大值(例如 CP-OP 的最大值 , A 方的最大值返回给 B ,即最小化 B 的利益),然后返回给父节点的时候加个负号得到的就是( OP-CP ),也就是双方都为对方找最差的走法。递归算法中只会进行 Beta 剪枝,上层节点的 Alpha 值在递归的时候会被当做 Beta 值传入下层节点。当前层节点的父节点要找的是当前层中最小的节点值(最小化对手的利益),例如当前层节点 B= 18 , 那么 - 18 就被当做 Beta 值传入当前层节点 C 的子节点中( E,F,G... )若 E=- 15
   那么 C<= 15 (-C>E), B>C, B,C 的父节点 A=-MAX(B,C) ,所以就不需要再搜索 C 的其他子节点了。  
   第一层  A=-MAX B C  
   第二层  B,C   (OP-CP) B= 18 , AlphaBeta(depth- 1 ,-Beta,- 18 也就是 CP-OP=- 18 =Beta=-B
   第三层 C E,F,G   (CP-OP)  E=- 15    所以 C> 15   -C>E>-B=Beta  所以才有: Val>=Beta  剪枝。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值