1. 程式人生 > 其它 >2021 暑假訓練學習 SG博弈

2021 暑假訓練學習 SG博弈

博弈論(SG函式)

SG函式

我們研究這樣一種遊戲,它滿足以下三個性質:

  1. 由 2 名玩家交替行動
  2. 在遊戲程序的任意時刻,可以執行的合法行動與這位玩家無關
  3. 不能行動的玩家判負

那麼這個遊戲被稱為公平組合遊戲。當兩名玩家均採取最優策略時,遊戲的勝負只和遊戲的初始情況有關,和玩家的選擇無關(在採取最優策略的情況下)。

我們發現,這類遊戲由於性質2,所以遊戲似乎可以不記錄玩家的狀態,只記錄遊戲目前的情況,那麼我們似乎可以將其視為一種類 DP 問題,將遊戲的狀態使用多維陣列甚至狀壓來儲存下來,隨後通過不斷轉移來求解。實際上,它們有一個更為抽象的表達形式:有向圖遊戲。

給定一個有向無環圖,圖中有一個唯一的起點,在起點上有一個棋子。兩名玩家交替的把這枚棋子沿有向邊移動,無法移動者判負。顯然的,所有公平組合遊戲都可以轉化為有向圖遊戲。

根據前面知識,我們推測圖上的每個點都具有必勝或者必敗兩種狀態,可以進行黑白染色。顯然,如果一個點可前往的任何點都是必勝點(或者沒有點可走),那麼它就是一個必敗點;相反,如果它可以前往任意一個必敗點,那麼他就是一個必勝點。

我們有一個更好的方法來表示一個點的必勝或者必敗:我們假設 \(S\) 是一個集合,那麼定義 \(\operatorname{mex}(S)\) 為求出不屬於集合 \(S\) 的最小非負整數的運算,也就是

\[\operatorname{mex}(S)=\min_{x\in \N,x\notin S}\{x\} \]

這時候,對於每個節點 \(x\),我們記它的所有後繼節點為 \(y_1,y_2,\cdots,y_n\)

,那麼有

\[\operatorname{SG}(x)=\operatorname{mex}\{\operatorname{SG}(y_1),\operatorname{SG}(y_2),\cdots,\operatorname{SG}(y_n)\} \]

特別的,整個有向圖遊戲的 SG 函式值為起點的 SG 函式值。

那麼,我們不難得出定理:

  1. 有向圖的某個局面必勝,但且僅當對應節點的 SG 函式值大於 0
  2. 有向圖的某個局面必敗,但且僅當對應節點的 SG 函式值為 0

Nim遊戲

給定 \(n\) 堆石子,第 \(i\) 堆石子有 \(a_i\) 個石子。兩名玩家輪流行動,每次可以任選一堆,從中拿走任意個石子(可以全部拿完,但不可以不拿)。取走最後的石子者獲勝(也就是說無法再拿石子的人會輸)。在兩者均採取最優策略的情況下,問先手是否必勝。

如果使用樸素的轉移方法,那麼時空複雜度至少為 \(O(\prod\limits_{i=1}^na_i)\),是比較難以承受的(還不太好寫)。但慶幸的是,這題有一個很樸素的解法:

定理

Nim 博弈先手必勝,當且僅當

\[\operatorname{f}= a_1 \operatorname{xor} a_2 \operatorname{xor} \cdots \operatorname{xor} a_n\not= 0 \]

證明

\(a_i\) 均為 0 時,此時所有物品被取光,此時 \(\operatorname{f}=0\)

對於某個局面, 倘若 \(\operatorname{f}=x\not= 0\),我們記 \(x\) 的二進位制表示下 1 的最高位在第 k 位,那麼至少存在一堆石子 \(a_i\),使得其二進位制下第 k 位為 1。顯然 \(a_i \operatorname{xor} x < a_i\) ,所以我們只需要將這對石子拿到 \(a_i \operatorname{xor} x\) 個,那麼就可以使得 \(\operatorname{f} = x \operatorname{xor} a_i\operatorname{xor}a_i \operatorname{xor} x=0\)

相反,對於某個局面,如果\(\operatorname{f}=0\),那麼無論怎麼取,新的 \(\operatorname{f}\) 都一定不為 0(涉及亦或的相關知識,可以使用反證法證明)。

根據數學歸納法,我們發現當 \(\operatorname{f}=0\) 時先手必敗,因為無論怎麼走都會使得下一個狀態的 \(\operatorname{f}\) 不為 0;反之,\(\operatorname{f}\not= 0\) 時先手必勝,因為必然存在一種使下一個狀態的 \(\operatorname{f}\) 為 0 的狀態。

與 SG 函式的關係

不難發現,\(\operatorname{f}\) 就是這個遊戲的 SG 函式。

多個有向圖遊戲

假設 \(G_1,G_2,\cdots,G_n\)\(n\) 個有向圖遊戲,他們共同組成了一個大有向圖遊戲 \(G\)。兩名玩家輪流進行,每次選一個子遊戲來玩一把,當某個人無法進行任何子游戲時,他將輸掉總遊戲 \(G\)

有向圖遊戲的和的 SG 函式值等於各個子游戲的 SG 函式值的異或和,也就是

\[\operatorname{SG}(G)=\operatorname{SG}(G_1)\operatorname{xor}\operatorname{SG}(G_2)\operatorname{xor}\cdots\operatorname{xor}\operatorname{SG}(G_n) \]

證明方法和 Nim 遊戲的證明方式類似,不再贅述(其實我也一時不知道咋證明)。

用子游戲的性質來證明 Nim 遊戲定理

我們發現,Nim 遊戲就可以視作 \(n\) 個子遊戲:假設在每某子游戲中,有 \(m\) 個石子,每次可以選取拿走任意數量的石子,那麼我們不難發現,有

\[\operatorname{SG}(m)=\operatorname{SG}(m-1)\operatorname{xor}\operatorname{SG}(m-2)\operatorname{xor}\cdots\operatorname{xor}\operatorname{SG}(0) \]

通過逆推發現, \(\operatorname{SG}(x)=x\),所以第 i 個遊戲中,石子堆有 \(a_i\) 個石子,這個子游戲的 SG 值為 \(a_i\),所以總遊戲的 SG 值就是 \(a_1 \operatorname{xor} a_2 \operatorname{xor} \cdots \operatorname{xor} a_n\)。通過這種方法,我們從另一角度得到了 Nim 定理。