象棋中常用的最小值最大值算法及剪枝算法


1.象棋中通常需要推算當前局面下,每走一步之后的局面分,通常我們可以設定考慮幾步棋,通常我們所說的算棋,而計算機的AI算法中最常用的就是最大值最小值算法,而剪枝算法是對最大值最小值算法的一種優化。

 

如上圖所示:

1.如果在當前局面下,假設有三步可走的棋,走完之后得到的局面分分別為100,80,90,如果僅考慮一步的情況下,當然是選100所對應的棋走,這是最簡單也是最短視的走法,這樣的AI會讓人認為太笨了。此時level=1

2.如果考慮兩步棋的情況,走完第一步之后,輪到對方走了,對方走完之后,此時的局面分是第三層的分,可能的走法有:走100分支的話,有三種可能:60,10,40,走80分支的話,有:50,30,20,走90分支的話,有:40,50,30,假設我們都不傻,都會挑使對方最不利的棋走,因此走100分支的話,對方可定會走10分支,如果走80分支的話,對方肯定走20分支,如果走90分支的話,對方肯定走30分支,因此我們為了使走兩步之后(僅考慮2步,level=2),自己獲得的局面分最大,使自己最有利,則必須走90分支,這樣的話,對方無論怎么走,得到的最小值局面分都是30,都比走其他分支(100和80)的最小值要大。這就是最小值最大值算法。

3.如果考慮三步棋的情況,此時level=3,到第四層局面的時候,此時level=0,即只需要直接計算當前每個分支的局面分即可,得到:15,35,8,9,25,15,34,25,8,20,18,10,7,14,32,21,16,15,

此時我們如何走才最有利呢?

a.假設第一步走100分支,則對方肯定走10分支,此時我們只能走9分支(getMaxScore),

b.如果第一步走80分支,則對方肯定走20分支,此時我們只能走18分支(getMaxScore,獲取最佳局面分)

c.如果第一步走90分支,則對方肯定走30分支,此時我們只能走16分支(getMaxScore,獲取最佳局面分)

因此,我們只需要考慮在第四層中選取一個最大值即可。毫無疑問第一步肯定走80分支,然后對方走20分支,然后我們走18分支,此時的局面對我們最有利。

因此總結如下:

我們最終的目的是使最后得到的局面分最大為依據的。

最小值,最大值算法交替使用,根據不同的考慮步數(level)有不同的走法。

getMinScore()會調用getMaxScore(),getMaxScore()內部也會調用getMinScore()兩個函數構成間接遞歸。

4.剪枝算法:

假設考慮這么一種情況:

假設第二分支80下面的50換成5,且只考慮level=2的情況,此時我們第一步是求最小值(第三層的),第二步求最大值(第二層的),注意這是回朔算法,根據可能得到的結果(最終局面分)往回推,可能要走的棋步。

當我們推演完第一分支(100)之后發現最小值為10,而當我們推演第二分支的時候,在求最小值時(第三層),遇到了5,顯然5<10,並且此時的上一層(第二層,即100,80,90)要求的是最大值,因此該分支的其他分支(30,20)就不需要推演了,因為該分支的最小值(5)已經比上一分支(100-->60,10,40)中的最小值10要小,再推演下去已經沒有意義了,因此可以把剩下的該分支的其他分支,舍棄掉,不需要計算了,大大降低了計算量,直接推演第三分之(90),俗稱剪枝算法。

因此我們需要傳入一個參數,標記上一分支中的最值。如果該分支中的某一個值比上一分支中的最值還要小,該分支的其他分支,就可以忽略了,因為該分支肯定不在考慮范圍之內了。因此可以提前結束本分支的計算,而直接計算下一分支。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM