人工智慧 alpha beta剪枝演算法及實踐

2021-08-17 12:35:51 字數 3609 閱讀 2016

alpha-beta剪枝演算法是基於極大極小搜尋演算法的。極大極小搜尋策略是考慮雙方對弈若干步之後,從可能的步中選一步相對好的走法來走,在有限的搜尋範圍內進行求解,可以理解為規定乙個有限的搜尋深度。

為此要定義乙個靜態估計函式f,以便對棋局的勢態做出優劣的估計,這個函式可根據棋局的優劣勢態的特徵來定義。這裡規定,max代表程式方,min代表對手方,p代表乙個棋局(即乙個狀態)。有利於max的勢態,f(p)取正值,有利於min的勢態,f(p)去負值,勢態均衡,f(p)取零。極大極小搜尋的基本思想是:

(1)當輪到min走步的節點時,max應考慮最壞的情況(因此,f(p)取極小值)。

(2)當輪到max走步的節點時,max應考慮最好的情況(因此,f(p)取極大值)。

(3)當評價往回倒退的時候,相應於兩位棋手的對抗策略,不同層上交替地使用(1)、(2)兩種方法向上傳遞倒推值。所以這種搜尋方法稱為極大極小過程。實際上,這種演算法是假定在模擬過程中雙方都走出最好的一步,對max方來說,min方的最好一步是最壞的情況,max在不斷地最大化自己的利益。

極大極小搜尋策略在一些棋盤ai中非常常見,但是它有個致命的弱點,就是非常暴力地搜尋導致效率不高,特別是當講搜尋的深度加大時會有明顯的延遲,alpha-beta在此基礎上進行了優化。事實上,min、max不斷的倒推過程中是存在著聯絡的,當它們滿足某種關係時後續的搜尋是多餘的!alpha-beta剪枝演算法把生成後繼和倒推值估計結合起來,及時減掉一些無用分支,以此來提高演算法的效率。

定義極大層的下界為alpha,極小層的上界為beta,alpha-beta剪枝規則描述如下:

(1)alpha剪枝。若任一極小值層結點的beta值不大於它任一前驅極大值層結點的alpha值,即alpha(前驅層) >= beta(後繼層),則可終止該極小值層中這個min結點以下的搜尋過程。這個min結點最終的倒推值就確定為這個beta值。

(2)beta剪枝。若任一極大值層結點的alpha值不小於它任一前驅極小值層結點的beta值,即alpha(後繼層) >= beta(前驅層),則可以終止該極大值層中這個max結點以下的搜尋過程,這個max結點最終倒推值就確定為這個alpha值。

先看極大極小搜尋演算法:

//node記錄當前player,depth記錄搜尋深度

function minimax(node, depth)

// 如果能得到確定的結果或者深度為零,使用評估函式返回局面得分

if node is a terminal node or depth = 0

return the heuristic value of node

// 如果輪到對手走棋,是極小節點,選擇乙個得分最小的走法

if the adversary is to play at node

let α := +∞

for each child of node

α := min(α, minimax(child, depth-1))

// 如果輪到我們走棋,是極大節點,選擇乙個得分最大的走法

else

let α := -∞

foreach child of node

α := max(α, minimax(child, depth-1))

return α;

alpha-beta剪枝就在極大極小搜尋演算法上優化:

function

alphabeta(node, depth, α, β, player)

//達到最深搜尋深度或勝負已分

if depth = 0

or node is a terminal node

return

the heuristic value

of node

if player = maxplayer// 極大節點

foreach child of node// 子節點是極小節點

α := max(α, alphabeta(child, depth-1, α, β, not(player) ))

if β ≤ α

// 該極大節點的值》=α>=β,該極大節點後面的搜尋到的值肯定會大於β,因此不會被其上層的極小節點所選用了。對於根節點,β為正無窮

break//beta剪枝

return α

else

// 極小節點

foreach child of node//子節點是極大節點

β := min(β, alphabeta(child, depth-1, α, β, not(player) ))// 極小節點

if β ≤ α// 該極大節點的值<=β<=α,該極小節點後面的搜尋到的值肯定會小於α,因此不會被其上層的極大節點所選用了。對於根節點,α為負無窮

break//alpha剪枝

return β

alpha-beta剪枝演算法僅僅是ai的核心,做乙個中國象棋ai還涉及到其他很多的方面的準備。其中最為重要的就是靜態局面評估函式,它決定了象棋ai的聰明程度,通常來說是根據人的經驗來進行的評估的,不同的人有不同的版本。此外還有涉及到中國象棋的諸多規則,因此細節方面的事情不少。

狀態表示

struct states

states(int fx,int fy,int tx,int ty,int tar)

};struct chessinfo;

象棋類
class chessboard;
核心函式
int chessboard::alphabeta(int record[10][9],map

target,

int depth, int alpha, int beta)

else

return valueestimation(target,!search_depth%2);//返回局面評估

}int value = 0;

int x = (depth%2)?1:17;//根據深度判斷當前玩家

int up = x + 16;

for(;x < up;x ++)

alpha = (value > alpha)?value:alpha;//極大搜尋

if(alpha >= beta)return alpha;//剪枝}}

return alpha;

}

局面評估

評估用簡單的棋力相加(攤手0.0)

int chessboard::valueestimation(map

& target,bool red)

}return ret;

}

最終做出來,還是感覺ai水平太弱了(逃),評估函式不行,中國象棋千變萬化,高水平ai哪有那麼容易。

人工智慧 剪枝

極大極小過程是先生成與 或樹,然後再計算各節點的估值,這種生成節點和計算估值相分離的方式,需生成規定深度內的所有節點,搜尋效率較低。如果能邊生成節點邊對節點估值,並剪去一些沒用的分枝,這種技術被稱為 剪枝。1 max節點 或節點 的 值為當前子節點的最大到推值 2 min節點 與節點 的 值為當前子...

AlphaBeta剪枝演算法

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

alpha beta剪枝搜尋

一種基於剪枝 cut off 的深度優先搜尋 depth first search 將走棋方定為max方,因為它選擇著法時總是對其子節點的評估值取極大值,即選擇對自己最為有利的著法 將應對方定為min方,因為它走棋時需要對其子節點的評估值取極小值,即選擇對走棋方最為不利的 最有鉗制作用的著法。在對博...