【演算法學習筆記】博弈論淺析之遊戲類

RioTian發表於2021-07-29

一、取走遊戲

​ 首先,我們介紹一下組合遊戲。組合遊戲是一種兩個人蔘與的遊戲,參與者擁有完整的(有關遊戲的)資訊,沒有任何意外產生的操作(即保證無意外性),並且遊戲擁有一個輸贏的結果。這樣的遊戲是由一系列的位置,包括一個起始位置,和哪個參與者進行下一步所組成、決定的。遊戲在參與者的選擇中從一步移向下一步,最終達到某個終點位置。這樣的一個終點位置意味著沒有任何下一步移動存在的可能。之後,其中一名遊戲者被判定為勝利,另一名則為失敗。
​ 這個理論可以被分為兩個部分:公平遊戲,遊戲中對於兩名參與者所被給定的任意一個位置,都能夠到達其他所有的位置(強調兩名參與者相同機會)。非公平遊戲,則是被給定的不同位置對於兩名參與者有著不同的機會,例如國際象棋。
在第一部分我們將只討論有關於公平遊戲的部分,下面講一個簡單的例子。

簡單的取走遊戲

我們來分析這樣一個遊戲,下面介紹下游戲規則:

  1. 兩名參與者,我們成為 A和B (懶得打羅馬數字1和2)
  2. 桌上有 \(21\) 根火柴。
  3. 每次只能從火柴堆中拿下 \(1、2、3\) 根火柴
  4. 參與者輪流拿火柴,A先手
  5. 最後一個拿走剩下所有火柴的人贏

現在知道遊戲規則了,我們就嘗試著來分析這個遊戲。想一想,其中一名參與者一定能夠在遊戲中勝利嗎?我們要先手還是要後手?有什麼很好的策略嗎?

下面,我們將從後往前分析這個遊戲,即從遊戲即將結束的部分開始。這種方法被稱為倒退歸納。

  • 假設只剩下1、2、3根火柴,顯然拿走剩下這幾根火柴就贏了。
  • 假設剩下4根火柴,那麼這時候輪到拿火柴的人肯定輸,因為怎麼拿都會剩下,然後他的對手拿掉剩下的火柴就贏了。所以4根火柴的情況是先手必敗。
  • 那麼,我們遞推到5、6、7根火柴,顯然,只要拿剩下4根,那麼就讓對手陷入先手必敗狀態。5、6、7根火柴便是先手必勝狀態。那麼若剩下8根火柴,這時候輪到的參與者肯定輸,因為你只能拿到剩下5、6、7根火柴,讓對手進入先手必勝的狀態。
  • 所以,我們發現,0,4,8,12,16„根火柴是一個目標狀態。我們要爭取使自己進入這個狀態。現在我們便能分析21根火柴的遊戲了,既然21不被4整除,第一個移動火柴的人(即先手者,參與者A)肯定贏。唯一的策略便是拿走一根火柴,剩下20根讓對手絕望去。

究竟什麼是組合遊戲?

現在我們將組合遊戲的概念定義得更準確一些。

組合遊戲是一個滿足下列情況的遊戲:

  1. 兩名參與者 (經典 Alice 和 Bob)
  2. 遊戲中有一系列通常是有限個數的可能的情況或位置。
  3. 遊戲規則是對兩名參與者同時有效的,並且每個位置向另一個位置移動都是合法的。如果規則對於兩名參與者沒有區別,也就是說兩名參與者遇上同樣的情況時,有著相同的選擇個數和選擇情況,那麼這個遊戲被稱為一個公平遊戲。否則,稱為不公平遊戲。
  4. 參與者交替進行遊戲
  5. 遊戲結束時,意味著到達一個終點。一般規則下,最後一次操作的人獲勝,但在逆規則下,最後一次操作的人失敗。這樣的一個終點位置意味著沒有任何下一步移動存在的可能。使遊戲到達終點的人為勝者,另一個為敗者。如果遊戲不能結束,那麼稱為平局。然而,我們幾乎總是新增一個結束位置。這樣就避免了平局的可能性。
  6. 遊戲在有限步數內會結束,無論怎麼進行。 我想很有必要提醒在這個定義中省略了什麼:沒有隨機移動,比如擲骰子;一個組合遊戲是一個擁有完整資訊的遊戲:同時移動和隱藏移動是不允許的;沒有平局。

P 位置和 N 位置(先手必敗狀態和先手必勝狀態)

回到剛剛說的取走遊戲中,我們發現 $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位置也會被稱為先手必勝狀態)。在一個公平遊戲中,我們可以找到規律,哪一個是先手必勝狀態,哪一個是先手必敗狀態,只要從結束狀態開始通過下列的操作進行倒推即可。

  1. 每個結束狀態都是先手必敗狀態。
  2. 如果當前狀態能夠轉移到先手必敗狀態(P位置)的狀態,則這個狀態為先手必勝狀態(N位置)。
  3. 如果當前狀態所能轉移到的所有狀態都是先手必勝狀態(N位置),那麼這個狀態為先手必敗態(P位置)。

而這樣分析之後,很明顯,任意一個處於P位置的人肯定會輸,因為他只能轉移到N位置。而處於N位置的人,只要轉移到P位置就可以贏了。
從上面的推導,顯然地,我們會發現對於N位置和P位置有一些性質,這些性質的前提是,這是公平遊戲,且有終點。

  1. 終點是P位置。
  2. 所有P位置能轉移到的都是N位置
  3. N位置至少能轉移到一個P位置

減法遊戲

​ 現在我們把上面所提到的簡單取走遊戲一般化。設 \(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位置。
按著這樣子遞推下去,我們會發現

\[P=\{0,2,7,9,14,16,...\} \\ N=\{1,3,4,5,6,8,10,11,12,13,15,...\} \]

圖4.1

我們會發現,\(PNPNNNN\) 是一個長度為7的迴圈節。現在,如果是 \(100\) 根火柴,先手贏還是後手贏?我們發現,\(100\ mod\ 7 = 2\),對應迴圈節,\(2\)\(P\) 位置,所以 \(100\) 根火柴是先手必敗狀態,後手肯定贏。

現在,請你嘗試著分析一個\(S=\{1,2,3,4,5,6\}\) 的減法遊戲,並搞清楚 \(10000\) 根火柴的話,先手贏還是後手贏?

《Game Theory》中有對應練習,請讀者自行查詢

二、Nim 遊戲

遊戲規則

​ 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和 為兩個數或多個數在二進位制下的異或和(異或和部分不作展開介紹,請不懂的讀者自行找資料)。我們定義 “\(⊕\)” 為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和:

\[13 = 1011_2 \\12=1100_2 \\\ 8=1000_2 \\--------\\ Nim - sum =1001_2=9 \]

Nim和不是0,根據波頓定理,這是一個N位置。那存在能找到移動到P位置的方法嗎?

根據Nim和的定義,我們發現,只要把每一列的 \(1\) 改為偶數個數就可以了。那麼我們把第一堆火柴拿掉 \(9\) 根,這樣子狀態變為 \((4,12,8)\) ,而它的 Nim和:

\[4 = 100_2\\ 12=1100_2\\ 8=1000_2\\ ------\\ Nim - sum = 0000_2 = 0 \]

根據波頓定理,這是一個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)\) 這個狀態

  1. 對於終點 \((0,0,0,...,0)\),顯然 \(0⊕0⊕0⊕...⊕0=0\) ,而終點為 \(P\) 位置,成立。

  2. $x_1⊕x_2⊕...⊕x_n ≠0 $

    \(N、P\) 位置的定義,我們知道每個 \(N\) 位置都能移動到至少一個 \(P\) 位置。下面我們來研究如何構造這樣一個移動。類似上面兩圖的計算,我們將 Nim和看成一個豎的加法。我們找到第一列有奇數個“1”的那一列,並把任意在這一列上的“1”換成0,然後在這個數後面繼續找,發現某一列的“1”的個數為奇數時,我們只要把這一列的數取反就好,即“1”變“0”,“0”變“1”。這樣得出來的這個數,就是你要拿掉火柴後剩下的數。顯然的,這樣的一個數是肯定找得到的。也就是說,可以從該位置找到至少一個達到Nim和為0的方法,符合N位置的性質。

  3. $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遊戲是在逆規則下進行的Nim遊戲,也就是最後操作的人失敗。

在逆規則下,還能找到對於任意狀態的必勝解法嗎?一開始想覺得好像有點麻煩,但仔細想想,其實是可以比較簡單地解決的。

先手勝當且僅當

  1. 所有堆石子數都為1且遊戲的SG值為0
  2. 存在某堆石子數大於1且遊戲的SG值不為0

證明:

  1. 若所有堆石子數都為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根火柴的情況,我們可以得到下圖。

SG 函式 (The Sprague-Grundy Function)

定義:\(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\)
我們將定義中的式子簡寫為:

\[g(x) = mex\{g(y) : y ∈ F(x)\}  \]

我們會發現,求某個 \(x\),必須遞迴地去求出來,所以一般是用遞推實現的。顯然, F(0)=∅,所以 \(g(0)=0\),而對於所有後繼只有終點的,\(g(x)=1\)。我們後面將用這樣的方式進行推導得出 \(SG\) 值。
如果我們知道了\(SG\)值,對一個圖論遊戲的分析便變得很簡單了。如果 \(g(x)=0\) ,顯然這是個P位置,如果 \(g(x)≠0\),顯然這是個 \(N\) 位置。說明如下:

  1. 如果x為終點,沒有後繼,\(g(0)=0\)
  2. \(g(x)=0\)時,因為 \(g(x)=0\),所以對於所有 \(y∈F(x) ,g(y)≠0\) ,也就是到達的都是N位置。
  3. \(g(x)≠0\)時,必然存在 \(y∈F(x) ,g(y)=0\),即可以到達一個P位置。

當然,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和 來使用,可以很方便地處理多堆火柴的情況。

四、組合遊戲的和

定義

給定多個組合遊戲,那麼你可以將這幾個組合遊戲合成一個新的遊戲。遊戲規則如下:

  1. 每個遊戲給定一個初始狀態。
  2. 雙方輪流操作
  3. 對於一次操作,參與者可以對其中一個組合遊戲進行符合這個遊戲的規則的合法操作,而其他遊戲保持原狀態。
  4. 遊戲進行直至所有組合遊戲都到達終點狀態,即操作者無法繼續進行為止。
  5. 最後一名操作者獲勝。

圖論遊戲的和

​ 假定我們有多個滿足第三部分中限制的圖 \(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\) 可以很方便地求出對於圖論遊戲的和中的 \(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,暫且稱之為樹上公平刪邊遊戲。這個命名是因為還有另外一種刪邊遊戲,為不公平的,參與者雙方一方只能刪除藍色邊,一方只能刪除紅色邊,而綠色邊是兩邊都可以刪除的。

竹子竹子!

為了更好地解決樹上刪邊遊戲的相關問題,我們引入“竹子”。竹子長的像下面這樣

img

	根據上面的遊戲規則,拿掉竹子上的某一節,那麼竹子上面的那些也會跟著被刪掉。仔細想想會發現,這不就是最簡單的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.)

現在我們來分析下圖所示的樹上刪邊遊戲。

圖3.1

​ 對於第一個圖,1號點有2個分支,分支上的邊樹分別為1、1,異或和為0,所以1號點的分支被替換為長度為0的竹子,也就是說上面兩個分支被刪掉了。所以對於2號點,就剩下2個分支,同理被消掉。最後這個圖被轉化為一根長度為1的竹子,其SG值為1。

	 對於第二個圖,分析過程如下,SG值=8

圖3.2

​ 對於最後一個圖,同理可以得出 \(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遊戲的和來理解)

圖3.3

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值相同,都可以相互轉換。上面的證明是證明可以轉換的原因。

圖上刪邊遊戲

研究過樹上的,現在來討論下圖上刪邊遊戲的。就像下面這樣的圖:

圖4.1

在《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.2

一般來說,我們可以把一個帶有奇數邊的環等價於只有一個端點的一條邊,而偶數邊的環等價於一個點。舉個例子,圖4.1中第二個圖,樹上的環帶有4條邊,等價於一個點,所以這棵樹就被等價為一條邊,即等價於一個大小為1的Nim堆。同樣的,圖4.1中的房子上的煙囪可以等價為一個點,右邊的窗也可以等價為一個點。接著,如圖4.3進行轉換,我們會得到房子的SG值為3。

圖4.3

下面,請自己嘗試計算圖4.1最右邊的人的SG值,答案為4。然後,試試看你能不能找到圖4.1為狀態的遊戲的解法。

練習

《Game Theory》給的練習真的是太逗了。

圖4.4

答案(從右到左): 2 4 2 5

相關文章