1. 程式人生 > >人工智慧技術導論——博弈樹搜尋

人工智慧技術導論——博弈樹搜尋

我在之前整理過一篇部落格關於博弈論和納什均衡的幾個例子https://www.cnblogs.com/wkfvawl/p/11725263.html

這裡來介紹博弈樹搜尋。

一、博弈樹的概念

       在博弈過程中, 任何一方都希望自己取得勝利。因此,當某一方當前有多個行動方案可供選擇時, 他總是挑選對自己最為有利而對對方最為不利的那個行動方案。 此時,如果我們站在A方的立場上,則可供A方選擇的若干行動方案之間是“或”關係, 因為主動權操在A方手裡,他或者選擇這個行動方案, 或者選擇另一個行動方案, 完全由A方自己決定。當A方選取任一方案走了一步後,B方也有若干個可供選擇的行動方案, 此時這些行動方案對A方來說它們之間則是“與”關係,因為這時主動權操在B方手裡,這些可供選擇的行動方案中的任何一個都可能被B方選中, A方必須應付每一種情況的發生。

       這樣,如果站在某一方(如A方,即在A要取勝的意義下), 把上述博弈過程用圖表示出來, 則得到的是一棵“與或樹”。 描述博弈過程的與或樹稱為博弈樹,它有如下特點:  
     (1) 博弈的初始格局是初始節點。  
     (2) 在博弈樹中, “或”節點和“與”節點是逐層交替出現的。自己一方擴充套件的節點之間是“或”關係, 對方擴充套件的節點之間是“與”關係。雙方輪流地擴充套件節點。  
     (3) 所有自己一方獲勝的終局都是本原問題, 相應的節點是可解節點;所有使對方獲勝的終局都是不可解節點。

二、極小極大值分析法

       在二人博弈問題中,為了從眾多可供選擇的行動方案中選出一個對自己最為有利的行動方案, 就需要對當前的情況以及將要發生的情況進行分析,從中選出最優的走步。最常使用的分析方法是極小極大分析法。 其基本思想是:  
       (1) 設博弈的雙方中一方為A,另一方為B。然後為其中的一方(例如A)尋找一個最優行動方案。

  (2) 為了找到當前的最優行動方案, 需要對各個可能的方案所產生的後果進行比較。具體地說, 就是要考慮每一方案實施後對方可能採取的所有行動, 並計算可能的得分。
       (3) 為計算得分,需要根據問題的特性資訊定義一個估價函式, 用來估算當前博弈樹端節點的得分。此時估算出來的得分稱為靜態估值。  
       (4) 當端節點的估值計算出來後, 再推算出父節點的得分, 推算的方法是:對“或”節點, 選其子節點中一個最大的得分作為父節點的得分,這是為了使自己在可供選擇的方案中選一個對自己最有利的方案;對“與”節點, 選其子節點中一個最小的得分作為父節點的得分,這是為了立足於最壞的情況。這樣計算出的父節點的得分稱為倒推值。  
      (5) 如果一個行動方案能獲得較大的倒推值, 則它就是當前最好的行動方案。

倒推值的計算


     在博弈問題中,每一個格局可供選擇的行動方案都有很多, 因此會生成十分龐大的博弈樹。據統計,西洋跳棋完整的博弈樹約有1040個節點。試圖利用完整的博弈樹來進行極小極大分析是困難的。可行的辦法是隻生成一定深度的博弈樹, 然後進行極小極大分析,找出當前最好的行動方案。在此之後, 再在已選定的分支上擴充套件一定深度, 再選最好的行動方案。如此進行下去, 直到取得勝敗的結果為止。至於每次生成博弈樹的深度, 當然是越大越好, 但由於受到計算機儲存空間的限制, 只好根據實際情況而定。

例 一字棋遊戲。設有如圖(a)所示的九個空格, 由A, B二人對弈, 輪到誰走棋誰就往空格上放一隻自己的棋子, 誰先使自己的棋子構成“三子成一線”誰就取得了勝利。
 

一字棋

 設A的棋子用“a”表示, B的棋子用“b”表示。為了不致於生成太大的博弈樹,假設每次僅擴充套件兩層。估價函式定義如下:       
     設棋局為P,估價函式為e(P)。    
     (1) 若P是A必勝的棋局, 則e(P)=+∞。  
     (2) 若P是B必勝的棋局, 則e(P)=-∞。  
     (3) 若P是勝負未定的棋局, 則 e(P)=e(+P)-e(-P)
其中e(+P)表示棋局P上有可能使a成為三子成一線的數目;  

e(-P)表示棋局P上有可能使b成為三子成一線的數目。

例如, 對於圖(b)所示的棋局, 則  

 

按照棋盤上紅色連線安放棋子a使得三子成一線,共6條連線。

按照棋盤上藍色連線安放棋子b使得三子成一線,共4條連線。
e(P)=6-4=2

 

另外,我們假定具有對稱性的兩個棋局算作一個棋局。還假定A先走棋, 我們站在A的立場上。  
下圖給出了A的第一著走棋生成的博弈樹。圖中節點旁的數字分別表示相應節點的靜態估值或倒推值。由圖可以看出, 對於A來說最好的一著棋是S3,因為S3比S1和S2有較大的倒推值。

 一字棋極小極大搜尋

在A走S3這一著棋後,B的最優選擇是S4, 因為這一著棋的靜態估值較小,對A不利。不管B選擇S4或S5,A都要再次運用極小極大分析法產生深度為2的博弈樹,以決定下一步應該如何走棋, 其過程與上面類似, 不再重複。

三、α-β剪枝技術

 

 上述的極小極大分析法, 實際是先生成一棵博弈樹,然後再計算其倒推值。這樣做的缺點是效率較低。於是,人們又在極小極大分析法的基礎上,提出了α-β剪枝技術。
     這一技術的基本思想是,邊生成博弈樹邊計算評估各節點的倒推值, 並且根據評估出的倒推值範圍,及時停止擴充套件那些已無必要再擴充套件的子節點, 即相當於剪去了博弈樹上的一些分枝, 從而節約了機器開銷, 提高了搜尋效率。具體的剪枝方法如下:  
      

       (1) 對於一個與節點MIN, 若能估計出其倒推值的上確界β,並且這個β值不大於MIN的父節點(一定是或節點)的估計倒推值的下確界α,即α≥β, 則就不必再擴充套件該MIN節點的其餘子節點了(因為這些節點的估值對MIN父節點的倒推值已無任何影響了)。這一過程稱為α剪枝。
  (2) 對於一個或節點MAX, 若能估計出其倒推值的下確界α, 並且這個α值不小於MAX的父節點(一定是與節點)的估計倒推值的上確界β,  即α≥β,則就不必再擴充套件該MAX節點的其餘子節點了(因為這些節點的估值對MAX父節點的倒推值已無任何影響了)。 這一過程稱為β剪枝。

認真品味上面的兩句規則,下面給出一個具體的 α-β剪枝的例項。

使用ScreenToGif 截的PPT圖,關於ScreenToGif的使用說明參見https://www.cnblogs.com/wkfvawl/p/11625823.html

這裡來說一下剪枝過程,F下的第一個節點是K,其值為4,這時作為MIN節點的F上確界β為4,F下的第二個節點L和第三個節點M的值都拿來比較,但都大於4,所以F節點MIN值還是4。這時MAX節點C的下確界α為4,並將α傳遞給MIN節點G。

G下的第一個節點為1,此時作為MIN節點G的上確界β為1,留意到此時 G的 α=4 > β,所以無需再探索 G的剩餘子節點,把未探索的子節點通過α剪枝剪掉。

這裡C的父節點A是一個MIN節點,A的估計上確界β便是4。接著我們對A的右子樹進行查詢,並將β傳遞下去。

對於MIN節點H,其下的第一個子節點P值為5,大於4,因而接著比較第二個子節點Q值為8,也大於4,因而H節點MIN值的上確界β便是5,P的父節點D是一個MAX節點,因而此時D的下確界α值為5。

由於D的父節點A是一個MIN節點,A的估計倒推值的上確界β為4,小於D的下確界5,因而就不必去擴充套件MAX節點D的其他子節點了,進行了β剪枝。

這是就可以確定節點A的父親節點S0,其為MAX節點的下確界α為4,這就對S0右子樹進行查詢。並直接將下確解α沿著S0->B->E->I傳遞,深入到I。

對於MIN節點I,其下的第一個子節點R值為0,這時作為MIN節點I的上確界β為0,留意到此時 I 的 α=4 > β,所以無需再探索 I 的剩餘子節點,把未探索的子節點通過α剪枝剪掉。

I的父節點是一個MAX節點,更新其父節點E的下確界α為0。將E的α傳遞給J。

這時對於MIN節點J,其下的第一個子節點S值為-6,這時作為MIN節點I的上確界β為-6,留意到此時 J 的 α=0 > β,所以無需再探索 J的剩餘子節點,把未探索的子節點通過α剪枝剪掉。

這時確定了E,E的父親節點B是一個MIN節點,通過E其上確界β更新為0,但E的父親節點的α為4,α=4 > β,所以無需再探索 B 的剩餘子節點,把未探索的子節點通過α剪枝剪掉。

最終確定S0,搜尋完成。

 

關於α-β剪枝的過程,還想要了解一個,可以參考這篇部落格

https://www.7forz.com/3211/

http://web.cs.ucla.edu/~rosen/161/notes/alphabeta.html