^^^轉載請注明出處~~~
The Sprague-Grundy theory of impartial games
公平游戲的Sprague-Grundy定理
公平游戲是一種雙人游戲,在游戲中雙方都有完整的信息,沒有牽涉,任何狀態的合法操作對雙方來說都是相同的。
一個公平游戲可以抽象地用一個有向無環圖來表示,這個圖中每個點都對應這一個狀態,每條有向邊代表從一個狀態到另一個狀態的合法操作。
我們可以想象一個代幣最初放在某個點上,然后兩個玩家輪流將其從當前的點移動到它的后繼點。當代幣移動到匯點時游戲結束,匯點是一個沒有出度的點,最后一個需要操作的玩家就是勝者。
P- 和 N-狀態
如果雙方都按照最佳策略進行游戲,我們可以將游戲中的每個狀態依據其是先手必勝還是后手必勝分類。
一個先手勝狀態被認為是一個N-狀態(因為下一個玩家即將獲勝),一個后手勝狀態被認為是一個P-狀態(因為前一個玩家即將獲勝)
P-和N-狀態歸納性地描述如下:
一個點v是P-狀態當且僅當它的所有后繼都為N-狀態
一個點v是N-狀態當且僅當它的一些后繼是P-狀態
這個歸納從匯點開始,匯點是P-狀態因為它顯然滿足P-狀態的要求。
游戲的P-和N-狀態的信息提供了它的必勝策略。如果輪到我們且游戲處在一個N-狀態,我們應該轉移到一個P-狀態。接着我們的對手就會被迫進入N-狀態,依此類推。我們最終會移入一個匯點並獲得勝利。
游戲的和
如果G1和G2 是公平游戲,那么他們的和G1 + G2是另一個公平游戲,玩法如下:每個回合,一個玩家選擇G1, G2 中的一個(隨便哪個他希望的)然后玩它,不碰另一個游戲。當 G1 和 G2都不能操作時游戲結束。
形式上,如果 G1 = (V1, E1) 和 G2 = (V2, E2)是游戲圖,那么他們的和 Gsum = (Vsum, Esum) 規定為:
Vsum = V1 × V2,
Esum = {(v1v2, w1v2) | (v1, w1) ∈ E1} ∪ {(v1v2, v1w2) | (v2, w2) ∈ E2}.
現在,假定我們給出兩個游戲G1 和 G2。如果我們只知道單個游戲的P-狀態和N-狀態我們能夠正確地玩好游戲和G1 + G2嗎?答案是否定的。不難看出兩個P-狀態的和總是P-狀態,P-狀態和N-狀態的和總是N-狀態。但是兩個N-狀態的和既可能是P-狀態也可能是N-狀態。因此,只知道單個游戲的P-狀態和N-狀態是不夠的。
為了正確地玩好游戲和我們需要推廣P-狀態和N-狀態,它就是Sprague-Grudy函數(或者簡稱為Grundy函數)。
The Sprague-Grundy function
Sprague-Grundy 函數
令N = {0, 1, 2, 3, ...} 為自然數的集合。Sprague-Grundy 函數給游戲中的每個狀態分配了一個自然數。結點v的Grundy值等於沒有在v的后繼的Grundy值中出現的最小自然數。
形式上:給定一個有限子集 S ⊂ N,令mex S(最小排斥值)為沒有出現在S中的最小自然數
mex S = min (N S).
現在,給定一個游戲圖G=(V,E),其Sprague-Grundy函數g:V → N 歸納定義為
g(v) = mex {g(w) | (v, w) ∈ E}.
從G的匯點開始歸納,可知它的Grundy值為0
Sprague-Grundy函數滿足兩個重要性質:
點v是一個P-狀態當且僅當g(v)=0
如果G = G1 + G2 且 v = v1v2 是G的一個狀態,那么g(v) 為g(v1) 和 g(v2) 在二進制下的異或:
g(v) = g(v1) ⊕ g(v2).
運算⊕也稱作nim和。舉個例子,3 ⊕ 5 = 011 ⊕ 101 = 110 = 6。類似地,3 ⊕ 6 = 5 且 5 ⊕ 6 = 3。
不難利用歸納法證明上面兩個性質。
根據這些性質有v = v1v2 是P-狀態當且僅當g(v1) = g(v2), 因為這是唯一能夠使得nim和為0的途徑。
無疑,游戲的求和是滿足交換律和結合律的運算,nim和運算也是。
因此,我們可以通過獲知單個游戲的Grundy函數來正確地玩好任意數目游戲和。
我們的策略如下:如果輪到我們且游戲的Grundy值給出了一個非0的nim和,那么必然在游戲的某個組分中存在一個操作使得nim和變為0。我們應該執行這個操作,那么接着我們的對手就被迫再次使得nim和非0。最終,我們將成為在最后一個游戲執行最后一個操作的人,最后將nim和變為0.
The game of Nim
Nim游戲
最基本的公平游戲是Nim堆。一個Nim堆由確定數目代幣組成。在每個回合,一個玩家從堆上拿走1到整堆中任意數目的代幣。拿空整堆的人獲得勝利。
這個游戲如果獨立看是沒有意義的:先手玩家可直接拿走所有代幣並立即獲得勝利!
但是如果我們將各種大小的Nim堆加在一起,我們就得到了著名的Nim游戲。
大小為n的Nim堆的Grundy值為n。因此,Nim游戲中每個狀態的Grundy值為每堆大小的Nim和。
Games that decompose into sums of themselves
一些分解成自身和的游戲
Sprague-Grundy定理最自然的應用就是一些分解成自身和的一些游戲。
考慮下面這個游戲:有一個大小為m*n的棋盤,且有無限數目某特定形狀的骨牌供應。在每個回合,玩家在棋盤上一個空位放置一個骨牌,不能放骨牌的玩家就是敗者。
在游戲期間,棋盤會逐漸分成不同的區域,對其我們可以分別計算Grundy值。
再舉個例子,考慮Grundy游戲。這個游戲的一個狀態由一些不同大小的代幣堆組成,一次操作由只取一堆並把它分成兩個不相等的堆組成。當所有堆的大小只有1和2的時候游戲結束,因為它不能再分。
令g(n)為單個大小為n的堆的Grundy值。數列g(n)如下:
n: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20...
g(n):0 0 1 0 2 1 0 2 1 0 2 1 3 2 1 3 2 4 3 0
比如:
當n等於1,2時已滿足條件,即不能再取,也就沒有下一個局面,所以g(1)={};所以G(1)={0,1,2,3,4...};
所以g(1)=0;同理g(2)=0;依次遞推,g(3),g(4),g(5)等,
例如:g(6)={#(1,5),#(2,4)}={g(1)+g(5),g(2)+g(4)}=g(2,0);
所以G(6)={1,3,4,5,6...},所以g(6)=1;
此題的求法,具體參見我的博客的最下面求f(n)的值:http://www.cnblogs.com/hsqdboke/archive/2012/04/20/2459796.html