nim遊戲是博弈論中最經典的模型,是組合遊戲(combinatorial games)的一種,屬於「impartial combinatorial games」(以下簡稱icg)。
滿足以下條件的遊戲是icg:
1、有兩名選手;
2、兩名選手交替對遊戲進行移動(move),每次一步,選手可以在(一般而言)有限的合法移動集合中任選一種進行移動;
3、對於遊戲的任何一種可能的局面,合法的移動集合只取決於這個局面本身,不取決於輪到哪名選手操作、以前的任何操作、骰子的點數或者其它什麼因素;
4、如果輪到某名選手移動,且這個局面的合法的移動集合為空(也就是說此時無法進行移動),則這名選手負。
通常的nim遊戲的定義是這樣的:有若干堆石子,每堆石子的數量都是有限的,合法的移動是「選擇一堆石子並拿走若干顆(不能不拿)」,如果輪到某個人時所有的石子堆都已經被拿空了,則判負(因為他此刻沒有任何合法的移動)。如果輪到你的時候,只剩下一堆石子,那麼此時的必勝策略肯定是把這堆石子全部拿完一顆也不給對手剩,然後對手就輸了。
如果剩下兩堆不相等的石子,必勝策略是通過取多的一堆的石子將兩堆石子變得相等,以後如果對手在某一堆裡拿若干顆,你就可以在另一堆中拿同樣多的顆數,直至勝利。
如果你面對的是兩堆相等的石子,那麼此時你是沒有任何必勝策略的,反而對手可以遵循上面的策略保證必勝。
定義p-position和n-position,其中p代表previous,n代表next。
直觀的說,上一次move的人有必勝策略的局面是p-position,也就是「後手可保證必勝」或者「先手必敗」,現在輪到move的人有必勝策略的局面是n-position,也就是「先手可保證必勝」。
更嚴謹的定義是:
1.無法進行任何移動的局面(也就是terminal position)是p-position;
2.可以移動到p-position的局面是n-position;
3.所有移動都導致n-position的局面是p-position。
按照這個定義,如果局面不可能重現,或者說positions的集合可以進行拓撲排序,那麼每個position或者是p-position或者是n-position,而且可以通過定義計算出來。
比如剛才說的當只有兩堆石子且兩堆石子數量相等時後手有必勝策略,也就是這是乙個p-position,下面依靠定義證明一下(3,3)p-position。
首先(3,3)的子局面有(0,3)(1,3)(2,3),只需要計算出這三種局面的性質就可以了。
(0,3)的子局面有(0,0)、(0,1)、(0,2),其中(0,0)顯然是p-position,所以(0,3)是n-position(只要找到乙個是p-position的子局面就能說明是n-position)。
(1,3)的後繼中(1,1)是p-position(因為(1,1)的唯一子局面(0,1)是n-position),所以(1,3)也是n-position。
同樣可以證明(2,3)是n-position。
所以(3,3)的所有子局面都是n-position,它就是p-position。
通過一點簡單的數學歸納,可以嚴格的證明「有兩堆石子時的局面是p-position當且僅當這兩堆石子的數目相等」。
根據上面這個過程,可以得到乙個遞迴的演算法——對於當前的局面,遞迴計算它的所有子局面的性質,如果存在某個子局面是p-position,那麼向這個子局面的移動就是必勝策略。
當然,有大量的重疊子問題,所以可以用dp或者記憶化搜尋的方法以提高效率。
但問題是,利用這個演算法,對於某個nim遊戲的局面(a1,a2,…,an)來說,要想判斷它的性質以及找出必勝策略,需要計算o(a1a2…*an)個局面的性質,不管怎樣記憶化都無法降低這個時間複雜度。
所以我們需要更高效的判斷nim遊戲的局面的性質的方法。
證明證明一種判斷position的性質的方法的正確性,只需證明三個命題:
1、這個判斷將所有terminal position判為p-position;
2、根據這個判斷被判為n-position的局面一定可以移動到某個p-position;
3、根據這個判斷被判為p-position的局面無法移動到某個p-position。
第乙個命題顯然,terminal position只有乙個,就是全0,異或仍然是0。
第二個命題,對於某個局面(a1,a2,…,an),若a1^ a2^ …^ an!=0,一定存在某個合法的移動,將ai改變成ai』後滿足a1^ a2^ …^ ai』^ …^ an=0。不妨設a1^ a2^ …^ an=k,則一定存在某個ai,它的二進位制表示在k的最高位上是1(否則k的最高位那個1是怎麼得到的)。這時ai^ k第三個命題,對於某個局面(a1,a2,…,an),若a1^ a2^ …^ an=0,一定不存在某個合法的移動,將ai改變成ai』後滿足a1^ a2^ …^ ai』^ …^ an=0。因為異或運算滿足消去率,由a1^ a2^ …^ an=a1^ a2^ …^ ai』^ …^ an可以得到ai=ai』。所以將ai改變成ai』不是乙個合法的移動。證畢。
根據這個定理,我們可以在o(n)的時間內判斷乙個nim的局面的性質,且如果它是n-position,也可以在o(n)的時間內找到所有的必勝策略。nim問題就這樣基本上完美的解決了。
nim取子遊戲是由兩個人面對若干堆硬幣(或石子)進行的遊戲。
設有k>=1堆硬幣,各堆分別含有n1,n2,……nk枚硬幣。
遊戲的目的就是選擇最後剩下的硬幣。
遊戲法則如下:
1.兩個遊戲人交替進行遊戲(遊戲人i和遊戲人ii);
2.當輪到每個遊戲人取子時,選擇這些堆中的一堆,並從所選的堆中取走至少一枚硬幣(遊戲人可以取走他所選堆中的全部硬幣);
3.當所有的堆都變成空堆時,最後取子的遊戲人即為勝者。
這個遊戲中的變數是堆數k和各堆的硬幣數n1,n2,……nk。對應的組合問題是,確定遊戲人i獲勝還是遊戲人ii獲勝以及兩個遊戲人應該如何取子才能保證自己獲勝(獲勝策略)。
首選考查某些特殊情況。
如果遊戲開始時只有一堆硬幣,遊戲人i則通過取走所有的硬幣而獲勝。
現在設有2堆硬幣,且硬幣數量分別為n1和n2,遊戲人取得勝利取決於它們是否相等。
設n1!=n2,遊戲人i從大堆中取走的硬幣使得兩堆硬幣數量相等,於是,遊戲人i以後每次取子的數量與遊戲人ii相等而最終獲勝。
但是如果n1= n2,則:遊戲人ii只要按著遊戲人i取子的數量在另一堆中取相等數量的硬幣,最終獲勝者將會是遊戲人ii。
這樣,兩堆的取子獲勝策略就已經找到了。
每個正整數都有對應的乙個二進位制數,例如:57(10) =111001(2) ,即:57(10)=25+24+23+20。
於是,我們可以認為每一堆硬幣數由2的冪數的子堆組成。
這樣,含有57枚硬幣大堆就能看成是分別由數量為25、24、23、20的各個子堆組成。
現在考慮各大堆大小分別為n1,n2,……nk的一般的nim取子遊戲。
將每乙個數ni表示為其二進位制數(數的位數相等,不等時在前面補0):
n1 = as…a1a0
n2 = bs…b1b0
……nk = ms…m1m0
如果每一種大小的子堆的個數都是偶數,我們就稱nim取子遊戲是平衡的,而對應位相加是偶數的稱為平衡位,否則稱為非平衡位。
因此,nim取子遊戲是平衡的,當且僅當:
as + bs + … + ms 是偶數
……a1 + b1 + … + m1 是偶數
a0 + b0 + … + m0是偶數
於是,我們就能得出獲勝策略:
遊戲人i能夠在非平衡取子遊戲中取勝,而遊戲人ii能夠在平衡的取子遊戲中取勝。
經典數學問題 Nim遊戲
nim遊戲是博弈論中最經典的模型,是組合遊戲 combinatorial games 的一種,屬於 impartial combinatorial games 以下簡稱icg 滿足以下條件的遊戲是icg 1 有兩名選手 2 兩名選手交替對遊戲進行移動 move 每次一步,選手可以在 一般而言 有限的...
趣味數學(各大經典數學問題)
哥尼斯堡七橋問題 18世紀在哥尼斯堡城 今俄羅斯加里寧格勒 的普萊格爾河上有7座橋,將河中的兩個島和河岸鏈結,如圖1所示。城中的居民經常沿河過橋散步,於是提出了一 個問題 能否一次走遍7座橋,而每座橋只許通過一次,最後仍回到起始地點。這就是七橋問題,乙個著名的圖論問題。這個問題看起來似乎不難,但人們...
經典趣味數學問題之過河問題
一 問題描述 在漆黑的夜裡,甲乙丙丁共四位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,四個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,四人所需要的時間分別是1 2 5 8分鐘 而如果兩人同時過橋,所需要的時間就是...