1. 程式人生 > 實用技巧 >戰棋遊戲中的簡單策略方法:基於群表示論的思想

戰棋遊戲中的簡單策略方法:基於群表示論的思想

戰棋遊戲中的簡單策略方法:基於群表示論的思想

最近在開發一款自娛自樂的基於上世紀30年代歷史背景的戰棋遊戲,需要為其設計一個策略演算法,我一開始就想可能用比較傳統的動態規劃,恰逢本週週一週二中科院數學所的田野老師來我們組講授Galois Representation,對我有一定啟發,忽然發現這個演算法亦可用群表示論的形式來表述,其直觀性會更良好,計算起來可能更加方便;


背景

考慮一個靜態棋盤,我們把戰爭過程簡化為以軍事單位為棋子的對弈,稱之為戰棋遊戲(圖片是EasyTech的歐陸戰爭2);

在這裡插入圖片描述

那麼假設AI是一位指揮官,它需要充分考慮己方軍事單位的狀態、戰鬥力、行動能力和敵手的可能行為來決策行動;


群表示及其在戰棋策略中的應用

下面先回顧一些基本概念:

定義1.1 一個群是一個集合 G G G帶有一個"二元運算",即一個對映 G × G → G G \times G \rightarrow G G×GG,稱為乘法 ( a , b ) ∈ G × G (a,b) \in G \times G (a,b)G×G在此對映下的像記作 a ⋅ b a \cdot b ab a b ab ab,稱為 a a a b b b的積,滿足條件:
i) ( a b ) c = a ( b c ) (ab)c=a(bc) (a

b)c=a(bc)對任意 a , b , c ∈ G a,b,c\in G a,b,cG成立(稱為"乘法結合律");
ii) 存在(唯一的) e = e G ∈ G e=e_{G}\in G e=eGG使得 a e = e a = a ae=ea=a ae=ea=a對任意 a ∈ G a\in G aG成立( e e e稱作單位元);
iii) 對任意 a ∈ G a\in G aG,存在(唯一的) b ∈ G b\in G bG使得 a b = b a = e ab=ba=e ab=ba=e( b b b稱作 a a a的逆元,記 b = a − 1 b=a^{-1}
b=a1
);

在這裡插入圖片描述
(各種各樣的群,群就是一組操作的集合以及它們的操作物件構成的一個代數結構!!!)

兩個群之間的對映如果和群運算相容,則稱為同態;詳細說:

定義1.2 設 G , G ′ G,G' G,G為群.一個對映 f : G → G ′ f:G\rightarrow G' f:GG稱作同態,如果 f ( a b ) = f ( a ) f ( b ) f(ab)=f(a)f(b) f(ab)=f(a)f(b) ∀ a , b ∈ G \forall a,b \in G a,bG成立;

群是個抽象的結構,我們當然自然地希望能夠在一個方便熟悉的計算工具上等價地計算、研究它,這就是群表示的motivation;

定義1.3 設 G G G是任一群, V V V是域 F F F上的向量空間.如果存在群同態 ρ : G → GL ( V ) , \rho:G \rightarrow \text{GL}(V), ρ:GGL(V),其中 GL ( V ) \text{GL}(V) GL(V)是一般線性群,即 V V V上全體可逆線性變換的乘法群,則稱 ( V , ρ ) (V,\rho) (V,ρ) G G G的一個 F F F-線性表示,稱為 F F F-表示 V V V F F F-表示 ρ \rho ρ.

V V V是有限維的,將 dim ⁡ F V \operatorname{dim}_{F}V dimFV稱為該表示的維數或次數,記為 deg ⁡ ρ \operatorname{deg}\rho degρ;將 V V V稱為表示空間.

Ker ⁡ ρ : = { g ∈ G ∣ ρ ( g ) = 1 V } \operatorname{Ker} \rho:=\left\{g \in G \mid \rho(g)=1_{V}\right\} Kerρ:={gGρ(g)=1V},稱為表示 ρ \rho ρ的核.若Ker ρ = { 1 } \rho=\{1\} ρ={1},則稱 ρ \rho ρ是忠實表示.

那麼回到戰棋策略的問題,我們現在考慮一種"弱"一些的表示,也就是不太滿足群表示中一定用矩陣表示的要求,當然,我們先從最基本的下棋操作開始,引入群工具:

假設當前己方所處的棋盤位置座標為 p s = ( x , y ) p_s=(x,y) ps=(x,y),那麼有兩個基本操作:

m ( Δ p ) , a ( Δ p ) m(\Delta p),a(\Delta p) m(Δp),a(Δp)

分別代表向 Δ p \Delta p Δp方向移動或者向 Δ p \Delta p Δp方向攻擊敵手,可見這兩種(但是 Δ p \Delta p Δp有多種選擇)基本操作是生成元:那麼己方的行動空間就是有限生成群:

G s = < m ( Δ p ) , a ( Δ p ) > G_s = <m(\Delta p),a(\Delta p)> Gs=<m(Δp),a(Δp)>

注意己方的狀態和戰鬥力引數組合 θ s = ( H s , m s , A s , D s ) \theta_s=(H_s,m_s,A_s,D_s) θs=(Hs,ms,As,Ds)也就是(己方生命值,己方行動力,己方攻擊力,己方防禦力),我們有模擬戰鬥過程的計算函式 f ( ⋅ ) f(\cdot) f()計算己方和敵手的傷亡:

Δ H s = f ( A e , D s , H s , H e ) Δ H e = f ( A s , D e , H s , H e ) \begin{array}{ll} \Delta H_s=f(A_e,D_s,H_s,H_e) \\ \Delta H_e=f(A_s,D_e,H_s,H_e) \end{array} ΔHs=f(Ae,Ds,Hs,He)ΔHe=f(As,De,Hs,He)

也就是戰鬥結果和己方的引數和敵手引數均有關,我們不妨寫作:

Δ H s , Δ H e = F ( θ s , θ e ) \Delta H_s,\Delta H_e = F(\theta_s,\theta_e) ΔHs,ΔHe=F(θs,θe)

下面考慮群同態: ρ s : G s → π \rho_s:G_s \rightarrow \pi ρs:Gsπ(稍後證明其它是個同態)
ρ ( g s ) = Δ H s − Δ H e \rho(g_s) = \Delta H_s-\Delta H_e ρ(gs)=ΔHsΔHe,也就是計算己方決策 g s g_s gs帶來的雙方戰鬥傷亡之差,很顯然己方的目標是使得 ρ ( g s ) \rho(g_s) ρ(gs)儘可能大(注意 ∀ Δ H ≤ 0 \forall \Delta H \le0 ΔH0);

ρ s : G s → π \rho_s:G_s \rightarrow \pi ρs:Gsπ顯然滿足對 ∀ g 1 , g 2 ∈ G s \forall g_1,g_2 \in G_s g1,g2Gs滿足:

ρ s ( g 1 g 2 ) = ρ s ( g 1 ) + ρ s ( g 2 ) \rho_s(g_1g_2)=\rho_s(g_1)+\rho_s(g_2) ρs(g1g2)=ρs(g1)+ρs(g2)
(比如, ρ s ( m ( Δ p 1 ) a ( Δ p 2 ) ) = ρ s ( m ( Δ p 1 ) ) + ρ s ( a ( Δ p 2 ) ) \rho_s(m(\Delta p_1)a(\Delta p_2))=\rho_s(m(\Delta p_1))+\rho_s(a(\Delta p_2)) ρs(m(Δp1)a(Δp2))=ρs(m(Δp1))+ρs(a(Δp2)),這是因為兩步之間是獨立的;)

最優策略

好的,現在就是最重要的事情,如何高效地找到最優策略???
我們把AI的決策分為3步:

i) 計算己方行動的決策空間;
ii) 計算己方的每一個決策下敵手的決策子空間;
iii) 選取使得 Δ H s − Δ H e \Delta H_s-\Delta H_e ΔHsΔHe最大化的策略;

在這裡插入圖片描述

現在假設己方已經選取了決策 g s g_s gs,那麼敵手同樣有一個群表示 ρ e : G e → π \rho_e:G_e \rightarrow \pi ρe:Geπ,那麼可以計算其決策子空間: ρ e ( g e ∣ g s ) \rho_e(g_e|g_s) ρe(gegs)(也就是給定己方決策 g s g_s gs後敵手的可能決策及其傷亡情形);

但是敵手也有多種決策,我們只能假設其選取每一種決策是等概率事件,最終的傷亡情形只能取一個期望:

E [ ρ e ( g e ∣ g s ) ] = ∑ g e ∈ G e P ( g e ∣ g s ) ρ e ( g e ∣ g s ) \mathbb{E} [\rho_e(g_e|g_s)]= \sum_{g_e \in G_e} \mathbb{P}(g_e|g_s)\rho_e(g_e|g_s) E[ρe(gegs)]=geGeP(gegs)ρe(gegs)

最終的目標函式就是(我們只需要選取使得下式取最大值的策略即可):

max ⁡ g s T ( g s ) = max ⁡ g s ρ s ( g s ) + E [ ρ e ( g e ∣ g s ) ] \max_{g_s}T(g_s) = \max_{g_s} \rho_s(g_s) + \mathbb{E} [\rho_e(g_e|g_s)] gsmaxT(gs)=gsmaxρs(gs)+E[ρe(gegs)]

剪枝策略

剪枝策略,屬於演算法優化範疇;通常應用在DFS和BFS搜尋演算法中;剪枝策略就是尋找過濾條件,提前減少不必要的搜尋路徑;

在這裡插入圖片描述
如圖所示,假設我們在計算 T ( g s ) T(g_s) T(gs)的過程中,一開始就記錄一個最小的目標函式值 T bad ( g s ) T_{\text{bad}}(g_s) Tbad(gs)(遇到更小則更新,易見在如下策略中,更新只會發生在完全計算到葉子節點);那麼如果中間過程有 T ′ < T bad ( g s ) T'<T_{\text{bad}}(g_s) T<Tbad(gs),那麼該分支對應的策略可以立即拋棄不必再計算;

後記

事實上我們可以發現每一步計算都不會出現重複計算某個 ρ s ( g s ) \rho_s(g_s) ρs(gs)的情形,再加上剪枝策略的應用,實在很像深度優先搜尋,其實你可以理解為群表示語言下的BFS演算法;但是我會繼續改進這個演算法,我相信代數語言下的演算法還有更多威力尚未發掘;

在這裡插入圖片描述