最近做了一個中國象棋項目,其中用到了Alpha-Beta剪枝算法,在此做個記錄。
Alpha-Beta剪枝算法是一種傳統的搜索算法, 它在博弈算法中有着非常廣泛的運用,它大大減少了相同搜索深度下的計算量。
Alpha-Beta剪枝算法是由最大值和最小值算法得來的,該算法是一個0總和算法,即一方要在可選的情況下使其優勢最大化,使對手優勢最小化,而開始的時候為0.
example:
假設方框是極大值的節點,圓是極小值的節點,B的值為18,D的值為16,而C是極小值,因此C<=16,A取max(B,C),因而沒有必要考慮C的其他子節點。
Alpha-Beta剪枝算法(遞歸偽代碼):
1 int AlphaBeta(int depth, int alpha, int beta){ 2 if (depth == 0) { 3 return Evaluate(); 4 } 5 GenerateLegalMoves(); 6 while (MovesLeft()) { 7 MakeNextMove(); 8 val = -AlphaBeta(depth - 1, -beta, -alpha); 9 UnmakeMove(); 10 if (val >= beta) { 11 return beta; 12 } 13 if (val > alpha) { 14 alpha = val; 15 } 16 } 17 return alpha; 18 }
參考:http://www.xqbase.com/computer/search_alphabeta.htm