博弈論入門
博弈論主要研究的是:在一個遊戲中,進行遊戲的多位玩家的策略。
公平組合遊戲
定義:
- 遊戲有兩個人參加,輪流參加決策,雙方均知道遊戲的完整資訊;
- 任意一名玩家在某一狀態可以做出的決策集合只與當前狀態有關,與遊戲者無關;
- 遊戲中某一狀態不可能多次抵達,遊戲以玩家無法行動為結束,且遊戲一定會在有限步後以非平局結束。
\(Nim\) 遊戲
\(Nim\) 遊戲便是一個典型的公平組合遊戲。
\(n\) 堆石子,分別有 \(a_1,a_2,a_3,a_4...a_n\) 個石子,兩個玩家分別取走任意一堆的任意個石子,但不能不取。取走最後一個石子的人獲勝。
博弈圖與狀態
如果將每個狀態視作一個點,再將其與其後續狀態連邊則得到一個博弈狀態圖。
若將節點 \((i,j,k)\) 表示局面 \(i,j,k\) 時的狀態,則可以這樣表示博弈狀態圖:
定義 必勝狀態(後簡稱 \(N\) ) 為先手必勝的狀態,必敗狀態(後簡稱 \(P\) )為先手必敗的狀態。
易得以下三個結論:
- 沒有後繼狀態的狀態是 \(P\) 。
- 一個狀態是 \(N\) ,當且僅當存在至少一個 \(P\) 為它的後繼結點。
- 一個節點是 \(P\) ,當且僅當它的後繼結點都為 \(N\) 。
對於定理一,若遊戲進行不下去了,則此玩家輸掉遊戲。
對於定理二,如果該狀態至少有一個後繼狀態為 \(P\) ,則玩家可以透過操作到該 \(P\) 狀態,則對手一定是 \(P\) 狀態——對手一定失敗,自己就贏得了勝利。
對於定理三,如果不存在一個後繼結點為 \(P\) ,則無論如何操作,只能達到 \(N\) ,則對手一定是 \(N\) 狀態——對手一定勝利,則自己一定失敗。
\(Nim\) 和
讓我們再次回到 \(Nim\) 遊戲。
透過繪畫博弈圖,我們可以在 \(O(\prod_{i=1}^n a_i)\) 的時間裡求出該局面是否先手必贏。
但是,這樣時間複雜度實在太高。有沒有更好的方法呢?
定義 \(Nim\) 和 \(=a_1 \oplus a_2 \oplus a_3 \oplus ... \oplus a_n\) 。0
當且僅當 \(Nim\) 和為零時,該狀態為必敗狀態,否則為必勝狀態。
證明
為什麼異或的結果會與勝負有關?
要解決這個問題,只需證下面三個定理:
- 沒有後繼狀態的狀態是 \(P\) 。
- 對於 \(a_1 \oplus a_2 \oplus ... \oplus a_n \ne 0\) 的局面,一定存在某種移動使 \(a_1 \oplus a_2 \oplus ... \oplus a_n = 0\) 。
- 對於 \(a_1 \oplus a_2 \oplus ... \oplus a_n = 0\) 的局面,一定不存在某種移動使 \(a_1 \oplus a_2 \oplus ... \oplus a_n = 0\) 。
對於一,唯一無後繼結點的狀態為全0局面,此時 \(a_1 \oplus a_2 \oplus ... \oplus a_n = 0\) 。
對於二,假設 \(a_1 \oplus a_2 \oplus ... \oplus a_n = k \ne 0\) 。設我們將 \(a_i\) 改為 \(a_j\) 則 \(a_j=a_i \oplus k\) 假設 \(k\) 的最高位為 \(d\) 即 \(k \in [2^d,d^{d+1})\) 。根據定義,一定有奇數個 \(a_i\) 的二進位制第 \(d\) 位為1。滿足這個條件的 \(a_i\) 一定也滿足 \(a_j > a_i \oplus k\) ,所以這是一個合法的移動。
對於三,若要將 \(a_i\) 變為 \(a_j\) ,根據異或的運算規則可以得出 \(a_i=a_j\) ,顯然不是合法移動。
有向圖遊戲和 \(SG\) 函式
有向圖遊戲是一個經典的博弈遊戲——實際上,大部分公平組合遊戲都可以轉化為有向圖遊戲。
在一個有向無環圖上,只有一個起點,上面有個棋子,兩個玩家輪流沿著有向邊推動棋子,不能走的玩家判負。
定義 \(max\) 函式的值為不屬於集合 \(S\) 的最小非負整數,即:
\(mex(S)=min\{x\}(x \notin S ,x \in N)\)
例如 \(mex(\{0,2,4\})=1,mex(\{1,2\}=0)\) 。
對於狀態 \(x\) 和他的所有 \(k\) 個後續 \(y_1,y_2,...,y_k\) ,定義 \(SG\) 函式:
\(SG(x)=mex\{SG(y_1),SG(y_2),...,SG(y_k) \}\)
而對於由 \(n\) 個有向圖組成的有向圖遊戲組成的組合遊戲,設他們的起點分別為 \(s_1,s_2...s_n\) ,則有定理:當且僅當 \(SG(s_1) \oplus SG(s_2) \oplus...SG(s_n) \not = 0\) 時,這個遊戲是先手必勝的。同時,這也是一個組合遊戲的遊戲狀態 \(x\) 的 \(SG\) 值。
這一定理被稱為 \(Sprague–Grundy\) 定理( \(Sprague–Grundy Theorem\) ),簡稱 \(SG\) 定理。
\(SG\) 函式的證明
使用數學歸納法。
假設對於遊戲狀態 \(x\) ,其當前節點 \(s_1^`,s_2^`,...s_n^`(對於任意i有s_i^`<s_ i)\) ,皆滿足 \(SG\) 定理,顯然當 \(SG(s_1)^`=SG(s_2)^`=...=SG(s_n)^`=0\) 時,該狀態能滿足 \(SG\) 定理。
只需證明對於遊戲狀態 \(x\) ,當其節點 \(s_1^`,s_2^`,...s_n^`\) 符合 \(SG\) 定理, \(SG\) 定理便成立。
其實可以看做一個 \(Nim\) 遊戲,後略。
\(SG\) 函式的應用
\(SG\) 定理適用於 任何公平的兩人遊戲 ,它常被用於決定遊戲的輸贏結果。
計算給定的狀態的 \(SG\) 值的步驟一般包括:
-
獲取從此狀態所有可能的轉換;
-
每個轉換都可以導致 一系列獨立的博弈(退化情況下只有一個)。計算每個獨立博弈的 \(SG\) 值並對它們進行 異或求和。
-
在為每個轉換計算了 \(SG\) 值之後,狀態的值是這些數字的 \(mex\) 。
-
如果該值為零,則當前狀態為輸,否則為贏。