詳解alpha beta演算法

2021-06-22 11:24:51 字數 1796 閱讀 2794

最近在做中國象棋對弈程式,用到了alpha-beta演算法。在網上搜尋了很多但是智商的因素讓我無法清除的弄明白。今天我的人機對弈終於完成了,我把我對alpha-beta演算法的理解寫出來。希望大神們有什麼不同的意見能夠指出來,幫助我改正加深我對演算法的理解,小弟先行謝過。
首先貼出如下這幅圖,我會細緻的跟大家分析,alpha-beta剪枝過程。

如圖中標註和字的為電腦,標註漢的為玩家。遞迴深度為4.

首先玩家選擇某個著法產生棋局即圖中起點。

該著法對應有電腦的44種應對方式。即圖中第二行和a~和z。(44僅為乙個代表數字,棋局的不同會導致產生的合理走法的數量不同).

若電腦選擇了和a著法,對應於該著法存在有44種玩家可選著法,即圖中第三行。

若電腦替玩家選擇著法漢a,對應又存在44種電腦可選擇的走法。此時可選擇的走法有圖中的第四行左側的和a,和b,和z等未完全列舉出來的走法。

每一種走法經過評估後產生橢圓中的粉紅色結果。其中評估函式如下:

public int evaluate()

該函式中userorder代表是否該使用者著子,並且在評估過程中,如果該使用者落子則評估函式返回值為對手棋子價值總和減去我方棋子價值總和。

public int alphabeta(int depth, int alpha, int beta)

point legalsteps = generatemoves();

for (int i = 0; i < legalsteps.length; i++)

if (value > alpha)}}

}return alpha;

}

由於在遞迴呼叫alphabeta(depth,alpha,beta)時結果取了負值,並且評估函式返回值為對戰方棋子價值減去我方棋子價值,所以當我方處於優勢地位時,評估函式返回值為負值,而value 取alphabeta函式返回值的相反數。 由於第一次呼叫時alpha,beta分別取負無窮大和正無窮大。所以在對上圖中漢a子節點的分析將產生(和)所能走的最好的走法(即和族在漢族已經選擇了漢a落子方式後,所能選擇的最佳走法的得分)。接下來對漢a的呼叫返回將並返回最大值8.此時將函式的主動權轉交到對第二行和a的分析。此時和a得到了返回值-8,接下來分析和a下的合理走法漢b。並將漢a得到的值-8傳遞給對漢b alphabeta函式的呼叫。此時漢b的子節點的beta值變為8.漢b子節點的評估值將與8比較。如果某個子走法如和q得到的返回值為9則停止比較並返回此刻的評估值。因為對於(和)每次都想找到最佳的走法,而(漢)將比較所有的返回值,並選擇最小值。從而使得自己不至於讓對手獲得最大利益。

上面的分析可能比較拗口。簡單來講就是甲乙兩人對弈。輪到甲落子。甲分析棋盤找到所有可以落子的合理方法,分析每乙個落子乙對應走法的最大獲利。然後為了使得乙不獲得最大利益。甲將比較自己的每種落子選擇乙獲得利益的高低。為了使得自己不至於損失太大。當然是選擇使乙獲利最小的走法。

那麼alphabeta函式中的引數的含義就不難理解了,alpha 為搜尋中所能找到的最大利益走法(即在我方搜尋時我方獲得最大利益的走法)。beta為對戰方所能容忍的最大損失(即每步對方走法下我方走法最大獲利值中的最小值),至於depth毫無疑問是搜尋深度了。depth越大則電腦越聰明。

就這些了,以後如果有時間我會把歷史表等提高alphabeta演算法處理速率的方法寫出來。還希望大家多多提點啊

AlphaBeta剪枝演算法

關於alphabeta剪枝的文章太多,這個方法是所有其它搜尋方法的基礎,得多花些時間認真地理解。先把基本概念再回顧一遍 節點 在中國象棋中就是乙個棋盤的當前局面board,當然該輪到誰走棋也是確定的。這裡的圓形節點表示終止節點,在中國象棋裡就是一方被將死的情況 或者到達了搜尋的最大深度 後續不會再有...

Alpha Beta減枝演算法

演算法 採取minmax演算法,利用alpha beta演算法減枝。原理 首先,演算法是用於計算出當前下棋所產生的最好價值。那麼,定義自己的價值越高數值越大 正 對手的價值越高數值越小 負 下棋是你一手我一手的下,根據下棋的步驟,構建決策樹 所謂決策樹就是 每個節點是當前局面的評分,節點的基數層該自...

對於A 演算法 alpha beta演算法的思考

a 演算法以估值函式為核心。alpha beta 以剪枝為核心。簡單的說就是把比已知的一步棋更臭的棋剪掉。現在我希望尋求某個問題接下來幾步的最優解,蠻力計算是不可行的。a 的準確性較差。但這本身不是乙個博弈情況,所以alpha beta不適用,只能期望於一種比較好的搜尋演算法。正在構思一種逆a 演算...