您的位置:首页 > 其它

AlphaBeta剪枝算法

2015-07-30 15:09 441 查看
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值等于其后继节点当前最小的最终倒推值




(假设方框表示取极大值的节点,圆圈表示取极小值的节点)

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 剪枝。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: