我對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算法 

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