每日一題 2019/4/4 Nim博弈

今天是頭疼、想看Final但是還是要做題的一天

今天學一下Nim博弈

首先是經典問題:n堆石子,每堆a[i]個,兩個人每次至少從一堆中拿一個,誰沒的拿了就輸了,問誰贏

答案是如果n堆石子的異或和爲0,先手必敗,否則先手必勝

證明的思路是:對於一個a[1] ^ a[2] ^ ... ^a[n]這個狀態,記爲x,如果x = 0,是不可能取石子使x != 0,但是如果x != 0,是一定存在一種方法使x = 0。不具體寫了,稍加思考就能想到。

題目:#1163 : 博弈遊戲·Nim遊戲

 

二:

Alice和Bob這一次準備玩一個關於硬幣的遊戲:
N枚硬幣排成一列,有的正面朝上,有的背面朝上,從左到右依次編號爲1..N。現在兩人輪流翻硬幣,每次只能將一枚正面朝上的硬幣翻過來,並且可以隨自己的意願,在一枚硬幣翻轉後決定要不要將該硬幣左邊的任意一枚硬幣也翻一次(正面翻到背面或背面翻到正面)。翻最後一枚正面向上的硬幣的人獲勝。同樣的,這次遊戲裏面Alice仍然先手,兩人均採取最優的策略,對於給定的初始局面,Alice會獲勝還是Bob會獲勝?

題解不想自己敲了,粘一下

這個遊戲叫做Turning Turtles,它的本質就是Nim遊戲。那麼它到底是如何轉化爲Nim遊戲的呢?讓我們一步一步來分析。

首先,我們先將局面分解一下,每一次我們只考慮一枚硬幣。
不妨設所有硬幣全部背面朝上的局面爲局面0
假設現在N枚硬幣,只有第1枚是正面朝上的。該局面只能轉化爲全部硬幣背面朝上的局面。我們假定該局面爲 局面1,則局面1可以轉化爲局面0。
假設只有第2枚是正面朝上的。該局面可以轉化爲:只有硬幣1正面朝上;全部硬幣背面朝上。我們假定該局面爲 局面2,局面2可以轉化爲局面1和局面0。
同理我們可以推定,第i枚硬幣正面朝上的局面爲局面i,局面i可以轉化爲局面0..i-1。

現在,我們考慮把給定的局面拆成單個硬幣的局面集合,比如給定了{HHTHTTHT},其中H表示正面朝上,T表示背面朝上。那麼就是當前局面={局面1,局面2,局面4,局面7}。每一次我們可以改變其中個一個局面,當出現局面0時就從集合中刪去。
這樣一看是不是就變成了Nim遊戲了?然而事實並沒有那麼簡單。

進一步分析,若同時存在i,j(j<i)兩枚硬幣正面朝上。我們將這個局面拆成2個單一的局面:即局面i和局面j。
在反轉i的時候我們考慮從局面i轉移到局面j,那麼我們會有兩個局面j。
表示第j枚被反轉了2次,也就是回到了背面朝上的狀態。
那麼我們得到這個遊戲一個性質:當出現兩個同樣的局面時,等價於這兩個局面合併變成了局面0。

這種情況在Nim遊戲中是沒有的,那麼它會對Nim遊戲的狀態造成影響麼?
我們想一想,在Nim遊戲中,如果出現兩個數量相同的堆時,比如A[i]=A[j]。在計算Nim遊戲狀態時我們採用的xor操作,xor有交換律和結合律。則我們可以變成:
(A[i] xor A[j]) xor Other
因爲A[i] = A[j],所以A[i] xor A[j] = 0。上式實際就是:
0 xor Other
也就是說在原Nim遊戲中,若出現了兩個數量相同的堆時,實際上這兩堆已經不對總局面造成影響了,也就可以認爲這兩對合併爲了一個數量爲0的堆。

到此,我們可以發現這個硬幣遊戲完全滿足Nim遊戲的規則,其解答也滿足Nim遊戲的性質,這題也就很簡單的轉化爲了普通的Nim遊戲。在實際的博弈遊戲中會發現很多都是可以轉化爲Nim遊戲模型。如何正確的建立模型和轉化遊戲模型也就是解決博弈遊戲一個很重要的手段。

比如Nimble遊戲:
遊戲開始時有許多硬幣任意分佈在樓梯上,共N階樓梯從地面由下向上編號爲0到N。遊戲者在每次操作時可以將任意一枚硬幣向下移動,直至地面。遊戲者輪流操作,將最後一枚硬幣移至地面(即第0階)的人獲勝。在雙方都採取最優策略的情況下,對於給定的初始局面,問先手必勝還是先手必敗。
每一枚硬幣仍然對應了一個石子堆,向下移動就等價於從石子堆裏面取出石子。

同樣的例子還有很多,有些遊戲甚至需要做好幾次轉換才能移動到Nim遊戲模型,在之後我們就會見到。

 

還是挺好理解的。

題目:#1172 : 博弈遊戲·Nim遊戲·二

 

三:

在這一次遊戲中Alice和Bob決定在原來的Nim遊戲上增加一條規則:每一次行動時,不僅可以選擇一堆取走任意數量的石子(至少取1顆,至多取出這一堆剩下的所有石子),還可以選擇將一堆石子分成兩堆石子,但並不取走石子。比如說有一堆石子爲k個,當Alice或者Bob行動時,可以將這一堆石子分成兩堆,分別爲x,y。滿足x+y=k,x,y>0。那麼增加了這一條規則後,在Alice總先手的情況下,請你根據石子堆的情況判斷是Alice會獲勝還是Bob會獲勝?

Solution:

對於ICG遊戲,我們可以將遊戲中每一個可能發生的局面表示爲一個點。並且若存在局面i和局面j,且j是i的後繼局面(即局面i可以轉化爲局面j),我們用一條有向邊,從i出發到j,連接表示局面i和局面j的點。則整個遊戲可以表示成爲一個有向無環圖:

根據ICG遊戲的定義我們知道,任意一個無法繼續進行下去的局面爲終結局面,即P局面(先手必敗)。在上圖中我們可以標記所有出度爲0的點爲P點。接着根據ICG遊戲的兩條性質,我們可以逆推出所有點爲P局面還是N局面:

因此,對於任意一個ICG遊戲,我們可以採取逆推的方法,標記出所有局面是N局面還是P局面。
但僅僅只是標記N、P,所能得到的信息太少,於是我們定義了Sg(Sprague-Grundy)函數:

對於一個遊戲可能發生的局面x,我們如下定義它的sg值:
(1)若當前局面x爲終結局面,則sg值爲0。
(2)若當前局面x非終結局面,其sg值爲:sg(x) = mex{sg(y) | y是x的後繼局面}。
mex{a[i]}表示a中未出現的最小非負整數。舉個例子來說:
mex{0, 1, 2} = 3, mex{1, 2}=0, mex{0,1,3}=2

我們將上圖用sg函數表示後,得到:

可以發現,若一個局面x爲P局面,則有sg(x)=0;否則sg(x)>0。同樣sg值也滿足N、P之間的轉換關係:
若一個局面x,其sg(x)>0,則一定存在一個後續局面y,sg(y)=0。
若一個局面x,其sg(x)=0,則x的所有後續局面y,sg(y)>0。

由上面的推論,我們可以知道用N、P-Position可以描述的遊戲用sg同樣可以描述。並且在sg函數中還有一個非常好用的定理,叫做sg定理:
對於多個單一遊戲,X=x[1..n],每一次我們只能改變其中一個單一遊戲的局面。則其總局面的sg值等於這些單一遊戲的sg值異或和。
即:
sg(X) = sg(x[1]) xor sg(x[2]) xor … xor sg(x[n])
要證明這一點我們只要證明:
(1) 假設sg(x[1]) xor sg(x[2]) xor … xor sg(x[n]) = A,對於任意一個0 <= B < A,總存在一個X的後續局面Y,使得sg(Y) = B。
(2) 假設sg(x[1]) xor sg(x[2]) xor … xor sg(x[n]) = A,不存在一個X的後續局面Y,使得sg(Y) = A。
下先證明(1):
假設M = A xor 
B,設M表示爲二進制之後最高位的1爲第k位。所以A的第k位爲1,B的第k位爲0。又因爲A的第k位爲1,至少存在一個i,sg(x[i])的第k位也爲1。那麼一定有sg(x[i]) xor M < sg(x[i]),即一定通過某個操作使x[i]變爲x[i’],且sg(x[i’]) = sg(x[i]) xor M。那麼:
sg(x[i’]) xor Other = sg(x[i]) xor M xor Other = M xor A = B
下證明(2):
若sg(X) = A,sg(Y) = A。不妨設我們改變的遊戲爲x[i],則X=x[1..n], Y=x[1…i’…n]。有sg(x[i]) = sg(x[i’]),產生矛盾,所以sg(Y)不可能等於A。

現在讓我們回到我們的題目上:
局面上一共有N堆石子,每一次我們只能改變一堆石子。那麼我們可以將每一堆石子看作一個單一遊戲。
對於一堆石子,若該堆石子數量爲0,就達到了終止狀態,所以sg(0) = 0。
若其石子數量爲k,接下來我們從k=1開始枚舉遞推每一個sg(k)。對於k,其可能的後繼狀態有:
(1)不分堆:石子數量爲k’=0..k-1,則sg(k’)
(2)分堆:石子變爲2堆,數量爲(1,k-1),(2,k-2),…,(k-1,1)。設第一堆的石子數量爲i,則sg值爲sg(i) xor sg(k-i)。(這裏用到了sg定理)
那麼可以推算出sg(k) = mex{sg(0), sg(i), sg(i) xor sg(k - i) | i = 1..k-1}。

k     0 1 2 3 4 5 6 7 8 9 10 11 12 …
sg(k) 0 1 2 4 3 5 6 8 7 9 10 12 11 …

對於N堆石子,其sg值則爲這N堆各自的sg值異或和。

總算是學到sg函數了。

題目:#1173 : 博弈遊戲·Nim遊戲·三

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章