戰棋遊戲中的簡單策略方法:基於群表示論的思想
戰棋遊戲中的簡單策略方法:基於群表示論的思想
最近在開發一款自娛自樂的基於上世紀30年代歷史背景的戰棋遊戲,需要為其設計一個策略演算法,我一開始就想可能用比較傳統的動態規劃,恰逢本週週一週二中科院數學所的田野老師來我們組講授Galois Representation,對我有一定啟發,忽然發現這個演算法亦可用群表示論的形式來表述,其直觀性會更良好,計算起來可能更加方便;
背景
考慮一個靜態棋盤,我們把戰爭過程簡化為以軍事單位為棋子的對弈,稱之為戰棋遊戲(圖片是EasyTech的歐陸戰爭2);
那麼假設AI是一位指揮官,它需要充分考慮己方軍事單位的狀態、戰鬥力、行動能力和敵手的可能行為來決策行動;
群表示及其在戰棋策略中的應用
下面先回顧一些基本概念:
定義1.1 一個群是一個集合
G
G
G帶有一個"二元運算",即一個對映
G
×
G
→
G
G \times G \rightarrow G
G×G→G,稱為乘法
(
a
,
b
)
∈
G
×
G
(a,b) \in G \times G
(a,b)∈G×G在此對映下的像記作
a
⋅
b
a \cdot b
a⋅b或
a
b
ab
ab,稱為
a
a
a與
b
b
b的積,滿足條件:
i)
(
a
b
)
c
=
a
(
b
c
)
(ab)c=a(bc)
(a
ii) 存在(唯一的)
e
=
e
G
∈
G
e=e_{G}\in G
e=eG∈G使得
a
e
=
e
a
=
a
ae=ea=a
ae=ea=a對任意
a
∈
G
a\in G
a∈G成立(
e
e
e稱作單位元);
iii) 對任意
a
∈
G
a\in G
a∈G,存在(唯一的)
b
∈
G
b\in G
b∈G使得
a
b
=
b
a
=
e
ab=ba=e
ab=ba=e(
b
b
b稱作
a
a
a的逆元,記
b
=
a
−
1
b=a^{-1}
(各種各樣的群,群就是一組操作的集合以及它們的操作物件構成的一個代數結構!!!)
兩個群之間的對映如果和群運算相容,則稱為同態;詳細說:
定義1.2 設 G , G ′ G,G' G,G′為群.一個對映 f : G → G ′ f:G\rightarrow G' f:G→G′稱作同態,如果 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,b∈G成立;
群是個抽象的結構,我們當然自然地希望能夠在一個方便熟悉的計算工具上等價地計算、研究它,這就是群表示的motivation;
定義1.3 設 G G G是任一群, V V V是域 F F F上的向量空間.如果存在群同態 ρ : G → GL ( V ) , \rho:G \rightarrow \text{GL}(V), ρ:G→GL(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ρ:={g∈G∣ρ(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
∀ΔH≤0);
ρ 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,g2∈Gs滿足:
ρ
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(ge∣gs)(也就是給定己方決策 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(ge∣gs)]=ge∈Ge∑P(ge∣gs)ρe(ge∣gs)
最終的目標函式就是(我們只需要選取使得下式取最大值的策略即可):
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(ge∣gs)]
剪枝策略
剪枝策略,屬於演算法優化範疇;通常應用在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演算法;但是我會繼續改進這個演算法,我相信代數語言下的演算法還有更多威力尚未發掘;