我对Alpha-Beta搜索的理解

Alpha-Beta搜索算法代码很简短,但介绍其原理的文章却很长。本着抓住本质、紧握核心的精神,记录下自己对Alpha-Beta搜索的理解。

在进行Alpha-Beta搜索前,需要有一个棋局优劣判断函数,一般以棋子权重为基础。为了尽可能反映出对弈双方局势优劣,在兼顾效率的前提下,还可以加入其它一些考虑因素。假设用a来表示红棋分值,用b来表示黑棋分值,那么a-b就是红棋的优势,而b-a则是黑棋的优势。这两个值互为相反数,这一点可以巧妙应用在Alpha-Beta搜索中。

棋类游戏的搏弈树具备下面两个特点:

1. 父结点分值等于最大子节点分值的相反数

比如红棋走了一步后其优势为2,接下来黑棋有4种应对走法,黑棋取得的优势分别是-1、0、1,3。那么不难理解,与前面的2分相比,后面的-max(-1,0,1,3) = -3 更能准确反映出红棋这一步的优劣。同样道理,黑棋的4个分值也可再递归下去,层数越多,越能精确反映着法的优劣。

2. 由于采用了max方法,所以一组着法中只有得分最大那个有用。如果能确定某个着法得分不如它的兄弟高,那么它就是无用的,可以被剪裁掉。

 如上图所示,B1点得分为-5,根据递归搜索原理,在搜索B2点时,会先搜索C4点,C4点得分为6,这就意味着B2点的得分小于-6,也就是说可以确定B2点分值不如B1点高,那么B2点就没用了,没必要再搜索C5和C6点。

综上所述,行棋双方已搜索到的最高分值可作为剪枝的参照。Alpha是走棋方已搜索到的最高分值,Beta值取决于对手已搜索到的最高分值。Alpha和Beta在本质上是一样的,随着层次的递深,它们的角色也在不断互换。

下面是取自中国象棋百科全书中的伪码:

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则是对方已搜索到最高分值的相反数。

假设我们现在要用这个方法搜索B2点,那么传递给它的Beta值就是5,可作为剪枝的依据。

搜索C8点时,传递的Alpha值是5,这样到了搜索D1点时,传递的Beta值就是-5,如果D1得分超过-5,就意味着D2和D3无需再搜索了。查看上图,确实如此。

参考:

中国象棋百科全书-Alpha-Beta搜索

js中国象棋程序-alpha-beta搜索 

CSDN博文-Alpha-Beta算法 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章