首先,咱們介紹一下組合遊戲。組合遊戲是一種兩我的參與的遊戲,參與者擁有完整的(有關遊戲的)信息,沒有任何意外產生的操做(即保證無心外性),而且遊戲擁有一個輸贏的結果。這樣的遊戲是由一系列的位置,包括一個起始位置,和哪一個參與者進行下一步所組成、決定的。遊戲在參與者的選擇中從一步移向下一步,最終達到某個終點位置。這樣的一個終點位置意味着沒有任何下一步移動存在的可能。以後,其中一名遊戲者被斷定爲勝利,另外一名則爲失敗。
這個理論能夠被分爲兩個部分:公平遊戲,遊戲中對於兩名參與者所被給定的任意一個位置,都可以到達其餘全部的位置(強調兩名參與者相同機會)。非公平遊戲,則是被給定的不一樣位置對於兩名參與者有着不一樣的機會,例如國際象棋。
在第一部分咱們將只討論有關於公平遊戲的部分,下面講一個簡單的例子。html
咱們來分析這樣一個遊戲,下面介紹下游戲規則:數組
如今知道遊戲規則了,咱們就嘗試着來分析這個遊戲。想想,其中一名參與者必定可以在遊戲中勝利嗎?咱們要先手仍是要後手?有什麼很好的策略嗎?less
下面,咱們將從後往前分析這個遊戲,即從遊戲即將結束的部分開始。這種方法被稱爲倒退概括。ide
如今咱們將組合遊戲的概念定義得更準確一些。函數
組合遊戲是一個知足下列狀況的遊戲:ui
回到剛剛說的取走遊戲中,咱們發現 $0,4,8,12,16... $ 是一個對於前一個操做的參與者勝利的位置(Previous Player),而 \(1,2,3,5,6,7,9,10,11\) 是對如今或者說是下一個操做的參與者勝利的位置(Next Player or Now Player). 前者則稱爲P位置,後者稱爲N位置。(做者注:在下文中,P位置也會被稱爲先手必敗狀態,N位置也會被稱爲先手必勝狀態)。在一個公平遊戲中,咱們能夠找到規律,哪個是先手必勝狀態,哪個是先手必敗狀態,只要從結束狀態開始經過下列的操做進行倒推便可。this
而這樣分析以後,很明顯,任意一個處於P位置的人確定會輸,由於他只能轉移到N位置。而處於N位置的人,只要轉移到P位置就能夠贏了。
從上面的推導,顯然地,咱們會發現對於N位置和P位置有一些性質,這些性質的前提是,這是公平遊戲,且有終點。spa
如今咱們把上面所提到的簡單取走遊戲通常化。設 \(S\) 表示一個正整數的集合,那麼以S爲減法集的減法遊戲就是像這麼玩的:有一堆 \(n\) 根火柴,每次像簡單取走遊戲同樣拿去火柴,可是拿去的火柴數必須在減法集中。其餘規則同減法遊戲。
那麼,簡單的取走遊戲就是一個 \(S=\{1,2,3\}\) 的減法遊戲。如今爲了更好地說明,咱們來討論一個 \(S=\{1,3,4\}\) 的減法遊戲。首先,(個數)0是終點,爲 \(P\) 位置。而 \(1,3,4\) 則爲 \(N\) 位置,由於能夠轉移到0這個 \(P\) 位置。2是 \(P\) 位置,由於2只能轉移到1,而1爲 \(N\) 位置。5,6是 \(N\) 位置,由於能夠轉移到2。7是P位置,由於7能轉移到的是3,4,6,都是N位置。
按着這樣子遞推下去,咱們會發現.net
咱們會發現,\(PNPNNNN\) 是一個長度爲7的循環節。如今,若是是 \(100\) 根火柴,先手贏仍是後手贏?咱們發現,\(100\ mod\ 7 = 2\),對應循環節,\(2\) 是 \(P\) 位置,因此 \(100\) 根火柴是先手必敗狀態,後手確定贏。翻譯
如今,請你嘗試着分析一個\(S=\{1,2,3,4,5,6\}\) 的減法遊戲,並搞清楚 \(10000\) 根火柴的話,先手贏仍是後手贏?
《Game Theory》中有對應練習,請讀者自行查找
Nim遊戲是最有名的取走遊戲。有三堆火柴,分別有 \(x_1,x_2,x_3\) 根火柴(好比 \(5,7,9\) )。兩我的輪流進行操做,每次只能取走一堆火柴中任意數量的火柴,不能同時對多堆進行操做。和取走遊戲同樣,拿走剩下全部火柴的人獲勝。
咱們用(\(x_1,x_2,x_3\))表示對應三堆分別有 \(x_1,x_2,x_3\) 根火柴的狀態。
首先,只有一個終點,(\(0,0,0\)),爲 \(P\) 位置。由於能夠拿走一堆中任意根數的火柴,因此 \((x,0,0),(0,x,0),(0,0,x) (x>0)\) 爲 \(N\) 位置。可是推廣到 \((x,y,0)\) ,也就是有 \(2\) 堆火柴不爲空的時候,還勉強能夠計算,但到了\((x,y,z)\) ,咱們會發現推導起來無比糾結。因此,咱們這裏要引入另一個東西。
首先,咱們定義 Nim和
爲兩個數或多個數在二進制下的異或和(異或和部分不做展開介紹,請不懂的讀者自行找資料)。咱們定義 「\(⊕\)」 爲Nim和的運算符號。例如,若是 \(x\) 與 \(y\) 的 Nim和 是z,那麼咱們表示爲 \(x⊕y=z\) 。
而後,引入波頓定理。
波頓定理:對 \(n\) 堆火柴 (\(x_1,x_2,x_3,...,x_n\) ),若 \(x_1⊕x_2⊕...⊕x_n = 0\) ,則這個狀態爲 \(P\) 位置,不然爲 \(N\) 位置。
舉個例子,對於 \((x_1,x_2,x_3)=(13,12,8)\),計算它的 Nim和:
Nim和不是0,根據波頓定理,這是一個N位置。那存在能找到移動到P位置的方法嗎?
根據Nim和的定義,咱們發現,只要把每一列的 \(1\) 改成偶數個數就能夠了。那麼咱們把第一堆火柴拿掉 \(9\) 根,這樣子狀態變爲 \((4,12,8)\) ,而它的 Nim和:
根據波頓定理,這是一個P位置。咱們還能夠找到另外一種方法,也就是從第二對堆的 \(12\) 根火柴中拿掉 \(7\) 根,剩下 \(5\) 根,一樣能夠獲得Nim和爲0。
波頓定理的證實參考於:Here
簡單證實:
- 當 \(a\) 不全爲 \(0\) 時, 任意一個 \(res!=0\) 的局面, 先手能夠經過必定的操做讓後手面對 \(res=0\) 的局面。
- 對於任意一個 \(res=0\) 的局面, 先手沒法經過任何操做讓後手面對 \(res=0\) 的局面。
- 得出結論, 當 \(res=0\) 時先手必敗, 反之必勝。
詳細證實:
假設如今分析 \(S(x_1,x_2,x_3,...,x_n)\) 這個狀態
對於終點 \((0,0,0,...,0)\),顯然 \(0⊕0⊕0⊕...⊕0=0\) ,而終點爲 \(P\) 位置,成立。
$x_1⊕x_2⊕...⊕x_n ≠0 $
由 \(N、P\) 位置的定義,咱們知道每一個 \(N\) 位置都能移動到至少一個 \(P\) 位置。下面咱們來研究如何構造這樣一個移動。相似上面兩圖的計算,咱們將 Nim和當作一個豎的加法。咱們找到第一列有奇數個「1」的那一列,並把任意在這一列上的「1」換成0,而後在這個數後面繼續找,發現某一列的「1」的個數爲奇數時,咱們只要把這一列的數取反就好,即「1」變「0」,「0」變「1」。這樣得出來的這個數,就是你要拿掉火柴後剩下的數。顯然的,這樣的一個數是確定找獲得的。也就是說,能夠從該位置找到至少一個達到Nim和爲0的方法,符合N位置的性質。
$x_1⊕x_2⊕...⊕x_n =0 \( 由\)N、P$位置的定義,咱們知道每一個 \(P\) 位置所能移動到的都是 \(N\) 位置。假設咱們這時候把 \(x_1\) 上拿掉火柴,使它變成\(x_1’\) 根(\(x_1’<x_1\))。由於 \(x_1⊕x_2⊕...⊕x_n =0\) ,因此 \(x_1’⊕x_2⊕...⊕x_n ≠0\) ,也就是所能獲得的都是 \(N\) 位置,符合 \(P\) 位置的性質。
反Nim遊戲是在逆規則下進行的Nim遊戲,也就是最後操做的人失敗。
在逆規則下,還能找到對於任意狀態的必勝解法嗎?一開始想以爲好像有點麻煩,但仔細想一想,實際上是能夠比較簡單地解決的。
先手勝當且僅當
證實:
若全部堆石子數都爲1且SG值爲0,則共有偶數堆石子,故先手勝。
1)只有一堆石子數大於1時,咱們總能夠對該堆石子操做,使操做後石子堆數爲奇數且全部堆得石子數均爲1。 II
2)有超過一堆石子數大於1時,先手將SG值變爲0便可,且總還存在某堆石子數大於1。
(摘自: http://hzwer.com/1950.html)
對於反Nim遊戲,其實還算比較簡單的。但,是否是對於其它的遊戲,它們在逆規則下也是能夠這樣去簡單分析呢?嗯,實際上對於一些遊戲是能夠的,可是對大部分遊戲來講,就算它們在正常規則下很容易分析,但在逆規則下會變得十分複雜,好比在後文中介紹的 Kayles and Dawson’s chess(第3章,第4部分)。
在這裏,咱們將用有向圖來表示以前所講的幾種遊戲,咱們用點來表示遊戲中的狀態,而用邊來表示一個狀態能到達另外一個狀態。接着咱們會定義一個叫作 \(SG\) 函數的東西,而在第四部分中咱們將介紹 \(SG\) 定理,它能夠更方便咱們去肯定\(N、P\) 位置。
一個有向圖 \(G\),是一對 \((X,F)\) ,其中X爲一個非空點集(位置),而 \(F\) 是表示對於任意 \(x∈X,F(x)∈X\),表示能夠將 \(x\) 移動到的位置的集合,咱們稱 \(F(x)\) 爲 \(x\) 的後繼。顯然,若是 \(F(x)\) 爲空集,那麼 \(x\) 爲終點。
兩我的在 \(G=(X,F)\) 的圖上進行圖論遊戲,以 \(x_0\) 爲起點,雙方輪流操做。在位置 \(x\) ,操做者能夠將 \(x\) 移動到任意\(x_t∈F(x)\) 。移動到終點的人爲勝利者。若是按着這個規則,可能會出現這個圖論遊戲能夠無限制地進行的可能,因此《Game Theory》中給出以下定義:
To avoid this possibility and a few other problems, we first restrict attention to graphs that have the property that no matter what starting point x0 is used, there is a number n, possibly depending on x0, such that every path from x0 has length less than or equal to n. (A path is a sequence \(x_0, x_1, x_2,...,x_m\) such that \(x_i ∈ F(x_{i−1})\) for all \(i = 1,...,m\), where m is the length of the path.) Such graphs are called progressively bounded. If X itself is finite, this merely means that there are no cycles. (A cycle is a path, \(x_0, x_1,...,x_m\), with \(x_0 = x_m\) and distinct vertices \(x_0, x_1,...,x_{m−1}, m ≥ 3\))
這裏就是給出了一個圖的限制:圖的大小無限,可是從圖上任意一個點,必定存在一個正整數 \(n\),使從該點開始到終點的全部路徑長度都不大於 \(n\)。
爲了方便講解,咱們拿第一部分中的 \(S=\{1,2,3\}\) 的減法遊戲進行分析。剩餘的火柴數爲點,那麼 \(n\) 就是起點。由於 \(0\) 終點,沒有後繼,因此 \(F(0)=\) ∅ 。一樣的,咱們會獲得 \(F(1) = \{0\},F(2) = \{0,1\}\),而且對於 \(2 ≤ k ≤ n, F(k) = \{k−3, k−2, k−1\}\) 。對於10根火柴的狀況,咱們能夠獲得下圖。
定義:\(g(x) = min\{n \ge 0: n \not = g(y) | y \in F(x)\}\)
用文字來表示,就是不存在於x的全部後繼的SG函數值(後簡稱SG值)中的最小值。好比:\(F(4)=\{1,2,3\},g(1)=0,g(2)=1,g(3)=4\),那麼 \(g(4)=3\)。再好比一樣的\(F(4),g(1)=1,g(2)=2,g(3)=3\), 那麼 \(g(4)=0\)。
咱們將定義中的式子簡寫爲:
咱們會發現,求某個 \(x\),必須遞歸地去求出來,因此通常是用遞推實現的。顯然, F(0)=∅,因此 \(g(0)=0\),而對於全部後繼只有終點的,\(g(x)=1\)。咱們後面將用這樣的方式進行推導得出 \(SG\) 值。
若是咱們知道了\(SG\)值,對一個圖論遊戲的分析便變得很簡單了。若是 \(g(x)=0\) ,顯然這是個P位置,若是 \(g(x)≠0\),顯然這是個 \(N\) 位置。說明以下:
固然,SG函數值確定包含不僅這些信息,更多的應用咱們將在第四部分的SG定理中看到,它能夠解決多個圖同時存在的圖論遊戲的問題。
咱們將用下圖來介紹 \(SG\) 函數的推導過程。其實很簡單,如定義中同樣,只要找到一個點的全部後繼,而後找到不在它們後繼的 \(SG\) 值之中的值便可。在圖中,咱們能夠發現有4個終點,位於圖的左側和底部,這四個點的SG值就爲0。接着咱們會發現只有1個點的後繼已經所有肯定了,就是a點,它的SG值爲1。如今b和c的後繼的SG值也已所有肯定,因此b,c的SG值分別肯定出來。這樣不斷重複這個過程,知道將整張圖的SG值都肯定下來。
對於以前提到的 \(S=\{1,2,3\}\) 的減法遊戲,它對應的SG函數是怎樣的呢?終點 \(0\),\(g(0)=0\)。狀態1只能移動到終點 \(0\),因此 \(g(1)=1\) 。狀態2能夠移動到 \(0,1\) ,因此 \(g(2)=2\) 。同理獲得 \(g(3)=3\) 。對於狀態4,它能移動到 \(1,2,3\) ,分別對應\(g(x)=\{1,2,3\}\),因此 \(g(4)=0\)。繼續重複下去,咱們會獲得:
觀察後發現,\(g(x)=0\) 當且僅當 \(x\ mod\ 4=0\)
下面提到一種叫作至少拿一半的遊戲。一樣是火柴堆,可是每次你至少要拿走一半。和上面同樣,咱們會得出它的SG函數:
觀察後,會發現 \(g(x)=min\{k|2k > x\}\)
而後仔細一想,是否是腦子進水了纔去算SG值,至少拿一半,我所有拿掉不就得了...可是,在下一部分中咱們會發現計算SG值是頗有必要的,配合這 Nim和 來使用,能夠很方便地處理多堆火柴的狀況。
給定多個組合遊戲,那麼你能夠將這幾個組合遊戲合成一個新的遊戲。遊戲規則以下:
假定咱們有多個知足第三部分中限制的圖 \(G_1=(X_1,F_1),G_2=(X_2,F_2),...,G_n=(X_n,F_n)\) 。咱們能夠把這多個圖組成一個新的遊戲 \(G=(X,F)\),稱之爲圖 \(G_1,G_2,...,G_n\) 的和,表示爲 \(G=G_1+G_2+...+G_n\)。點集X是多個點集的笛卡爾乘積,\(X=X_1*X_2*...*X_n\),即集合中的點爲 \(\{x_1,x_2,...,x_n\}\) ,其中對於任意 \(i∈[1,n], x_i∈X_i\) 。同時對於一個點,其後繼 \(F(x)\) 定義爲
所以,從 \(x=\{x_1,x_2,...,x_n\}\) 開始的一步移動,就是將其中任意一個 \(x_i\) 移向 \(F(x_i)\)。這樣的遊戲成爲圖論遊戲的和。
若是每一個子遊戲都知足第三部分中對圖的限制,那麼所獲得的母遊戲也符合那個限制。其移動步數的最大值顯然就是全部子游戲移動步數最大值的和。
接下來介紹的 \(SG\) 能夠很方便地求出對於圖論遊戲的和中的 \(SG\)值。這須要用到以前所提到的Nim和。
\(SG\) 定理:母遊戲的SG值等於其各個子游戲的SG值的Nim和。
SG定理在大多數組合遊戲的和中能夠用於求出其SG函數值,而更多的時候,咱們是經過SG定理暴力求出SG函數值以後去尋找規律,減小麻煩。在《Game Theory》中有講到不少實用的例子,做者因爲時間以及能力問題暫未可以徹底理解,在此不進行展開闡述。 請感興趣的讀者自行閱讀《Game Theory》\(4.3\)~\(4.4\),\(5.1\)~\(5.4\) 。
第五部分來自 OI wiki 和 Coco_T
從某一棵樹上刪除一條邊,同時刪去全部在刪除邊後再也不與根相連的部分。雙方輪流進行,沒法再進行刪除者斷定爲失敗,也就是比你拿掉最後一部分你就贏了。一個遊戲中有多棵樹,咱們把它們的根都掛在天花板上…或者說,放在地板上也行..這麼作是爲了方便後面的一些解釋和處理。
在這篇文章中,咱們討論的將是公平遊戲,也就是雙方能夠刪除任意的邊,咱們稱這個遊戲爲:Green Hackenbush,暫且稱之爲樹上公平刪邊遊戲。這個命名是由於還有另一種刪邊遊戲,爲不公平的,參與者雙方一方只能刪除藍色邊,一方只能刪除紅色邊,而綠色邊是兩邊均可以刪除的。
爲了更好地解決樹上刪邊遊戲的相關問題,咱們引入「竹子」。竹子長的像下面這樣
根據上面的遊戲規則,拿掉竹子上的某一節,那麼竹子上面的那些也會跟着被刪掉。仔細想一想會發現,這不就是最簡單的Nim遊戲嗎?有不少堆火柴,每次只能拿走某一堆火柴中的任意數量的火柴。而這裏則是有不少個種在地板上的竹子,咱們每次只能選一根出來,任意砍掉一部分或者所有。既然發現這是Nim遊戲了,那麼相應的SG值就知道了: g(x)=x..
搞定竹子以後,咱們就能夠來研究樹上刪邊遊戲究竟要怎麼解決。其實,樹上刪邊遊戲就是個披了層樹皮的Nim遊戲。爲何這麼說呢,咱們介紹克朗原理
克朗原理:對於樹上某一個點,它的分支能夠轉換爲以這個點爲根的一根竹子,這個竹子的長度等於它各個分支的邊的數量的異或和。
(怕翻譯很差因此把原文放上來:When branches come together at a vertex, one may replace the branches by a non-branching stalk of length equal to their nim sum.)
如今咱們來分析下圖所示的樹上刪邊遊戲。
對於第一個圖,1號點有2個分支,分支上的邊樹分別爲一、1,異或和爲0,因此1號點的分支被替換爲長度爲0的竹子,也就是說上面兩個分支被刪掉了。因此對於2號點,就剩下2個分支,同理被消掉。最後這個圖被轉化爲一根長度爲1的竹子,其SG值爲1。
對於第二個圖,分析過程以下,SG值=8
對於最後一個圖,同理能夠得出 \(SG\) 值=4。
如今,咱們就能夠算出這個遊戲在當前狀態的SG值:\(1\) xor \(8\) xor \(4=13 ≠0\),因此這個是先手必勝狀態,也就是N位置。而後剩下的就是找要到刪去哪條邊了。
假設咱們要刪掉的是圖3.1中第二棵樹上的某一條邊,也就是說,咱們要讓這棵樹的SG值變爲 1 xor 4=5,才能使獲得的遊戲狀態的SG值爲0.
咱們看圖3.2中的倒數第二個圖,這裏面所獲得的竹子長度: 3 xor 2 xor 6=7,咱們要讓它變成4,這樣子加上最下面那條邊的話得出來就是5. 由於 2 xor 6=4,因此能夠直接刪掉最左邊的3條邊。固然,若是要刪除中間的話,那麼刪除的條數就是 2-4 xor 3 xor 6=1,同理,刪除最右邊的話,就要刪去 6-4 xor 3 xor 2=1條。
好了,這樣子咱們就利用克朗原理解決了樹上刪邊遊戲的問題。關於克朗原理的證實,由於筆者比較懶因此就不翻譯過來了。請看下面這段:
Proof of the Colon Principle. Consider a fixed but arbitrary graph, G, and select an arbitrary vertex, x, in G. Let H1 and H2 be arbitrary trees (or graphs) that have the same Sprague-Grundy value. Consider the two graphs G1 = Gx : H1 and G2 = Gx : H2, where Gx : Hi represents the graph constructed by attaching the tree Hi to the vertex x of the graph G. The colon principle states that the two graphs G1 and G2 have the same Sprague-Grundy value. Consider the sum of the two games as in Figure 6.4(下圖).
The claim that G1 and G2 have the same Sprague-Grundy value is equivalent to the claim that the sum of the two games has Sprague-Grundy value 0. In other words, we are to show that the sum G1 +G2 is a P-position. (證實兩個遊戲的SG值相同,只要證實它們的SG值異或後爲0便可,也就是當作一個Nim遊戲的和來理解)
Here is a strategy that guarantees you a win if you are the second player to move in G1 + G2. If the first player moves by chopping one of the edges in G in one of the games, then you chop the same edge in G in the other game. (Such a pair of moves may delete H1 and H2 from the games, but otherwise H1 and H2 are not disturbed.) If the first player moves by chopping an edge in H1 or H2, then the Sprague-Grundy values of H1 and H2 are no longer equal, so that there exists a move in H1 or H2 that keeps the Sprague-Grundy values the same. In this way you will always have a reply to every move the opponent may make. This means you will make the last move and so win.(其實就是輪流取,慢拿的確定贏,由於每次均可以拿走和被取走那部分SG值相同的。)
其實克朗原理的意思應該這麼理解,對樹上一個點,在它的分支都被轉換成竹子以後,咱們能夠求出它的SG值,而克朗原理是說,能夠將它替換稱一個SG值相同的竹子。其實,不僅僅對於樹上刪邊遊戲,應該是對於博弈論大部分問題,只要SG值相同,均可以相互轉換。上面的證實是證實能夠轉換的緣由。
研究過樹上的,如今來討論下圖上刪邊遊戲的。就像下面這樣的圖:
在《Game Theory》的第四章中,咱們知道任意一個圖均可以等價爲一個Nim遊戲中的火柴堆(Nim堆)。爲了找到這個火柴堆,咱們須要試着把這個圖轉換成一棵樹,而後就能夠用上面的辦法轉換成一個Nim堆。這裏咱們介紹另外一個原理,費森原理。
費森原理:環上的點能夠在被融合,且不改變圖的 SG 值。
(原文:The vertices on any circuit may be fused without changing the Sprague-Grundy value of the graph.)
其實這個原理看起來好像沒什麼用,可是,這個原理使咱們能將一個圖去化簡成爲咱們可以計算的樣子。如今咱們看看在圖4.1是怎麼化簡的。
首先,咱們先研究下最左邊那個房子的門。如圖4.2所示,地板上的那兩個點能夠當作一個,由於地板其實就是一個點,那麼門就變成了地板上的一個三角形。接着,就用到費森原理了。三角形是一個環,而咱們能夠把環上的點換成連在一個點上的三個環。其實這裏能夠看出,費森原理是容許咱們將環上的點換成一個環去表示。最後,每一個環分別等價於一個大小爲1的Nim堆,因此這三個環的異或和(Nim sum,後稱爲Nim和)是1,等價於一個大小爲1的 Nim堆。
通常來講,咱們能夠把一個帶有奇數邊的環等價於只有一個端點的一條邊,而偶數邊的環等價於一個點。舉個例子,圖4.1中第二個圖,樹上的環帶有4條邊,等價於一個點,因此這棵樹就被等價爲一條邊,即等價於一個大小爲1的Nim堆。一樣的,圖4.1中的房子上的煙囪能夠等價爲一個點,右邊的窗也能夠等價爲一個點。接着,如圖4.3進行轉換,咱們會獲得房子的SG值爲3。
下面,請本身嘗試計算圖4.1最右邊的人的SG值,答案爲4。而後,試試看你能不能找到圖4.1爲狀態的遊戲的解法。
《Game Theory》給的練習真的是太逗了。
答案(從右到左): 2 4 2 5