1. 程式人生 > >博弈論 SG函式

博弈論 SG函式

遊戲1
l    有兩個遊戲者:A和B。
l    有21顆石子。
l    兩人輪流取走石子,每次可取1、2或3顆。
l    A先取。
l    取走最後一顆石子的人獲勝,即沒有石子可取的人算輸。
如果剩下1、2或3顆石子,那麼接下來取的人就能獲勝;如果剩下4顆,那麼無論接下來的人怎麼取,都會出現前面這種情況,所以接下來取的人一定會輸;如果剩下5、6或7顆石子,那麼接下來取的人只要使得剩下4顆石子,他就能獲勝。0,4,8,12,……都是下一個取石子者的必敗狀態。現在有21顆石子,21除以4的餘數是1,所以先走者有必勝的策略,他第一次只要取走1顆石子,以後每一次都保證剩下的石子是4的倍數就行了。

什麼是“平等組合遊戲”?
l    兩人遊戲。
l    有一個狀態集,而且通常是有限的。
l    規定哪些狀態轉移是允許的。
l    所有規定對於兩人來說是一樣的。
l    兩人輪流走步。
l    有一個終止狀態,到達終止狀態後遊戲即告終止。
l    遊戲可以在有限步內終止。

P狀態和N狀態
就像第一個遊戲一樣,狀態0,4,8,……是剛才走步的人的必勝狀態,我們稱之為P狀態;而1,2,3,5,6,7,……都是下一個走步的人的必勝狀態,我們稱之為N狀態。
我們可以從終止狀態出發,推出每一個狀態,指出它是P狀態還是N狀態。就拿第一個遊戲舉例:
步驟一 將所有終止狀態設為P狀態。
步驟二 將所有一步之內可以到達一個P狀態的狀態設為N狀態。
步驟三 如果一個狀態,不管怎麼走都只能走到N狀態,那麼就將這個狀態設為P狀態。
步驟四 返回步驟二。
如果能夠走到P狀態,就能獲勝。因為安照上面的定義,對手不管如何選擇,只可能走到N狀態。接下來總存在一個P狀態你可以走到。這樣一直走到終止狀態,你獲勝。當然這裡所說得都是指對於最後走步的人獲勝的遊戲。

我們嚴格的來定義P狀態和N狀態
l    所有的終止狀態都是P狀態;
l    對於任何的N狀態,肯定存在一種方式可以一步轉到一個P狀態;
l    對於任何的P狀態,不管怎麼走步,都只能轉到N狀態。
而對於最後走步的人失敗的遊戲,只要將所有終止狀態改成N狀態,然後開始倒推就可以了。當然,必勝狀態是N狀態。也就是說,如果想勝利,就希望面對N狀態,轉移到P狀態。

現在對遊戲1略微擴充套件一下。
有一個決策集S,S中的元素是正整數。遊戲的規則大致與遊戲1一樣,只是現在每次可以取的石子數必須是S中的元素。如果S={1,2,3},那麼就是遊戲1。
大家分析一下,當S={1,3,4}的時候,哪些狀態是P狀態,哪些是N狀態。
我們發現P狀態是{0,2,7,9,14,16,……},N狀態是{1,3,4,5,6,8,10,……}。
規律是如果n除以7的餘數是0或2,那麼狀態n就是P狀態,否則就是N狀態。
如果遊戲開始時,石子總數是100,那麼這是一個P狀態,也就是說後走的人有必勝策略。


遊戲2 Nim遊戲
有三堆石子,分別含有x1,x2和x3顆石子。兩人輪流取石子,每次可以選擇一堆,從這堆裡取走任意多顆石子,但不能不取。取走最後一顆石子的人獲勝。

我們用三元組來表示狀態,很明顯(0, 0, 0)是唯一的終止狀態,是P狀態。
先考慮只剩一堆有石子的情況(0, 0, x),很明顯這是,這些狀態都是N狀態。
剩兩堆的情況,如果兩堆的石子數相等(0, x, x),那麼這些都是P狀態。因為下一次走步的人一定會使得兩堆石子不相等,再下一次可以使得兩堆的石子數回到相等的狀態,包括終止狀態。如果兩堆的石子數不相等,那麼就是N狀態。
三堆都非空的情況就複雜得多。我們可以得到(1, 1, 1)、(1,1, 2)、(1, 1, 3)和(1, 2, 2)都是N狀態,因為它們可以轉變成(0, 1, 1)或(0, 2, 2),它們都是P狀態。(1,2, 3)是P狀態,因為不管怎麼選擇,下一次一定變到N狀態。

“Nim和”就是兩個數二進位制表示的不進位加法,也就是兩個整數進行xor位運算。
定義:兩個數(xm…x0)2和(ym…y0)2,是(zm…z0)2,其中zi=(xi+yi) mod 2,0<=i<=m。
例如,22和51的Nim和是37:


整數關於Nim和(以後用“+”表示)滿足交換律和結合律。有單位元0,因為0+x=x。任何兩個相等的數之和是0,即x+x=0。有削去律,即如果x+y=x+z,那麼y=z。因為,如果x+y=x+z,兩邊都加上x,得到x+x+y=x+x+z,即y=z。

定理1:Nim遊戲的一個狀態(x1, x2, x3) 是P狀態,當且僅當x1+x2+x3=0。

考慮狀態(13, 12, 8)。Nim和是9,不等於0,所以這是一個N狀態。

那麼接下來應該怎麼走,才能走到一個P狀態呢?你可以從第一堆中取走9顆石子。

或者你也可以從第二堆中取走7顆石子,等等。

如果石子的堆數大於3,只要堆數是有限的,上面的定理仍然成立。即如果有n堆石子,狀態(x1, x2, …, xn)是P狀態的充要條件是x1+x2+…+xn=0。下面就來證明。
我們用ρ表示所有Nim和為零的狀態組成的集合;用п表示ρ的補集,即所有Nim和為正整數的狀態組成的集合。讓我們逐一檢驗P狀態和N狀態的定義。
l    所有的終止狀態都在ρ中。由於終止狀態只有一個(0, 0, …, 0),0+0+…+0=0。
l    所有屬於п的狀態,一步之內一定可以走到ρ中的狀態。找出Nim和最左端為1的那一列,然後任意選擇一個這一列是1的堆,從這堆中取走若干顆石子,使得Nim和為0。這總是可以做到的,因為將那一列的1變成0,而它左邊的列不用修改,這個數就肯定變小了。對於其他Nim和是1的列,只要將這個數相對列的0改成1,1改成0就可以了。
l    所有屬於ρ的狀態,一定轉變到п中的狀態。任意一個P狀態(x1,x2, …, xn),不妨假設從第一堆中取出若干顆石子。如果存在x1’<x1,而(x1’, x2, …, xn)也是P狀態。那麼x1+x2+…+xn=0=x1’+x2+…+xn,根據前面講的削去律,x1’=x1,與假設x1’<x1矛盾。所以(x1’, x2, …, xn)一定是N狀態,屬於п。

通過上面的證明,你能得到從一個N狀態走到P狀態的方案數嗎?而且這個數是奇數。

那麼,對於最後走步的人失敗的Nim遊戲,又怎麼辦呢?通常情況下,這類遊戲比最後走步的人獲勝的遊戲難得多。但Nim遊戲是個例外。我們來分析一下。
P狀態和N狀態的定義不變,如果初始狀態是N狀態,先走者有必勝策略。當超過1顆石子的堆數大於1的時候,按照前面所講的方法走。直到超過1顆石子的堆數等於1,這時將這堆石子全部取掉或剩1顆,保證非空(剩下1顆石子)的堆數為奇數。如果初始狀態是N狀態,按照策略,先走者不可能將“超過1顆石子的堆數等於1”的狀態留給對方,因為這樣的狀態不可能是P狀態。而且對方不可能在一步之內從“超過1顆石子的堆數大於1”的狀態變到“超過1顆石子的堆數小於1”的狀態。


圖遊戲
現在我們使用有向圖來描述一個遊戲,所有的狀態用頂點表示,所有合法的移動用有向邊表示。接下來我們會給出Sprague-Grundy函式(簡稱SG函式),它比起P狀態和N狀態,能夠提供更多的資訊。

定義:用(X, F)來表示有向圖G。X是頂點集,F是後繼函式。設x是一個頂點,F(x)是一個集合,包含於X,任意一個元素y屬於F(x),表示從x出發到y有一條邊。F(x)就是x的後繼集合,也可看成從x出發的決策集。如果F(x)是空集,那麼就表示x是終止狀態。

圖遊戲:一個兩人遊戲,在一個圖G(X, F)上玩,指明一個頂點x0並按照下列的規則:
l    A先走,從x0開始;
l    兩人輪流走步;
l    從頂點x出發,只能走到頂點y,y屬於F(x);
l    遇到終止狀態,即不能走步,此人輸。

對於一個圖,如果不管x0是哪個點,總存在一個n,使得從x0出發的任意一條路經的長度都不超過n,那麼這個圖就被稱為是“遞增有界”的。接下來主要討論遞增有界的圖遊戲。
拿遊戲1來舉例,設有n顆石子。頂點集X={0, 1, 2, …, n},F(0)是空集,F(1)={0},F(2)={0, 1},F(k)={k-3, k-2, k-1},3<=k<=n。下圖是n=10的情況。



SG函式
定義:
對於一個遞增有界的圖G(X, F)來說,SG函式g,是定義在X上的函式,函式值是非負整數,使得


用語言來描述就是:g(x)的值等於所有x的後繼的SG函式中沒有出現的最小非負整數。
對於遞增有界的圖,SG函式是唯一的、有界的。
所有的終止狀態x,因為F(x)是空集,所以g(x)=0。

給出下圖的SG函式。


例1
給出遊戲1的SG函式,看看有什麼規律,與P狀態和N狀態有什麼關係。
x    0    1    2   3    4    5    6   7    8    9   10    11    …
g(x)    0    1   2    3    0    1   2    3    0    1   2    3    …

例2
有一堆石子,設當前剩下n顆石子,這一步至少要取走n/2取上界顆。唯一的終止狀態是剩0顆石子。給出SG函式,看看有什麼規律。
x    0    1    2   3    4    5    6   7    8    9    10   11    12    …
g(x)    0    1   2    2    3    3   3    3    4    4   4    4    4    …

根據例1的結果,我們猜測SG函式與P狀態和N狀態是有關的。如果g(x)=0,那麼x就是P狀態,否則x就是N狀態。證明是很顯然的,我們只要根據兩者的定義,考慮以下三點:
l    如果x是終止狀態,那麼g(x)=0。
l    一個狀態x,如果g(x)≠0,那麼一定存在一個x的後繼y,使得g(y)=0。
l    一個狀態x,如果g(x)=0,那麼所有x的後繼y,都有g(y)≠0。
當然,SG函式還包含了其他的資訊,這些資訊在以後會用到。


多個組合遊戲的並
給定若干個組合遊戲,可以按照下面的規則將它們併成一個新的遊戲。
l    對每個遊戲給定初始狀態。
l    兩人輪流走步,從A開始。
l    每一輪,選擇一個未到達終止狀態的遊戲,在這個遊戲中按照規則走一步,其他遊戲的狀態不變。
l    最後一個走步者獲勝,即走完之後所有遊戲都到達終止狀態。
我們稱這個新的遊戲為“多個組合遊戲的並”。我們要來看如何用每一個遊戲的SG函式來求這個新的組合遊戲的SG函式。

n個圖遊戲的並
定義:有n個遞增有界的圖遊戲G1(X1, F1),……,Gn(Xn, Fn)。把它們合併成一個新的遊戲G(X, F),記為G=G1+G2+…+Gn。X是所有遊戲頂點集的笛卡爾積,即X=X1*X2*…*Xn。也就是說,我們用n元組(x1, x2, …, xn)來表示G中的頂點x,其中xi屬於Xi,對於所有的i。x的後繼F(x)可以定義成:

這樣定義的新的遊戲G,一定也是遞增有界的。把每個遊戲的界相加,就得到了新遊戲的界。
正如Nim遊戲那樣,如果堆數是1,那麼非常簡單;如果堆數是2,也很容易分析;但堆數如果大於2,就不是很明顯了。所以即使每個圖遊戲都是很平凡的,n個圖遊戲的並也可能相當複雜。

下面介紹的SG定理可以看成是定理1的一般化。
定理2
設G=G1+G2+…+Gn,Gi的SG函式是gi,i=1, 2, …, n。那麼G的SG函式g(x1, x2, …,xn)=g1(x1)+g2(x2)+…+gn(xn),加法表示Nim和,即不進位的二進位制加法。
證明:
令x(x1, x2, …, xn)是X中任意一點,b= g1(x1)+g2(x2)+…+gn(xn)。
根據SG函式的定義,我們要說明兩點:
(1)、對於任意的非負整數a(a<b),一定存在一個x的後繼y,使得g(y)=a。
(2)、x的任意一個後繼y,都有g(y)¹b。
首先來說明(1)。設d=a+b(nim和),d的二進位制表示有k位,則2k-1<=d<2k。d的第k位是1而且a<b,所以a的第k位是0,b的第k位是1。因為b=g1(x1)+g2(x2)+…+gn(xn),所以至少存在一個分量的第k位是1,不妨設它就是g1(x1)。那麼,就有d+g1(x1)<g1(x1),也就存在從x1到x1’的一次走步,使得g1(x1’)=d+g1(x1)。那麼g1(x1’)+g2(x2)+…+gn(xn)=d+g1(x1)+g2(x2)+…+gn(xn)= d+b=a。
再說明(2)。反證法。不失一般性,假設後繼的走步是從x1到x1’,又有g1(x1’)+g2(x2)+…+gn(xn)=g1(x1)+g2(x2)+…+gn(xn)。根據消去率,g1(x1’)=g1(x1),這與SG函式的定義不符,假設不成立。

例3、你每次可以從一堆石子中取走{1, 2, …, m}顆。對於1堆的問題,SG函式gm(x)=xmod (m+1)。如果考慮3個這樣的遊戲的並,第一個遊戲m=3,有9顆石子;第二個遊戲m=5,有10顆石子;第三個遊戲m=7,有14顆石子。g(9,10,14)=g3(9)+g5(10)+g7(14)=1+4+6=3,是一個N狀態。要取勝的話,下一次可以選擇第三個遊戲,取走1顆石子,使得g7(13)=5。那麼,還有別的取法嗎?
var
  n,m,p,t,i:longint;

begin
  readln(n);
  t:=0;
  for i:=1 to n do begin
    readln(m,p);
    t:=t xor (p mod (m+1));
    end;
  if t=0 then writeln('P') else writeln('N');
end.


取走-分割遊戲
這種遊戲允許取走某些東西,然後將原來的一個遊戲分成若干個相同的遊戲。
例1、Lasker’s Nim遊戲:每一輪允許兩種操作之一。(1)從一堆石子中取走任意多個(2)將一堆數量不少於2的石子分成都不為空的兩堆。
分析:
很明顯,g(0)=0,g(1)=1。狀態2的後繼有0,1和(1,1),它們的SG函式值分別是0,1和0,所以g(2)=2。狀態3的後繼有0,1,2和(1,2),它們的SG函式值分別是0,1,2和3,所以g(3)=4。狀態4的後繼有0,1,2,3,(1,3)和(2,2),它們的SG函式值分別是0,1,2,4,5和0,所以g(4)=3。在推一些,我們得到:

我們推測:對於所有的k>=0,有g(4k+1)=4k+1;g(4k+2)=4k+2;g(4k+3)=4k+4;g(4k+4)=4k+3。
請自行證明。
假設遊戲初始時有3堆,分別有2、5和7顆石子。三堆的SG函式值分別是2、5和8,它們的Nim和等於15。所以要走到P狀態,就要使得第三堆的SG值變成7,可以將第三堆分成按1和6分成兩堆。