nim遊戲是博弈論中最經典的模型(之一?),它又有著十分簡單的規則和無比優美的結論,由這個遊戲開始了解博弈論恐怕是最合適不過了。
nim遊戲是組合遊戲(combinatorial games)的一種,準確來說,屬於「impartial combinatorial
games」(以下簡稱icg)。滿足以下條件的遊戲是icg(可能不太嚴謹):1、有兩名選手;2、兩名選手交替對遊戲進行移動(move),每次一
步,選手可以在(一般而言)有限的合法移動集合中任選一種進行移動;3、對於遊戲的任何一種可能的局面,合法的移動集合只取決於這個局面本身,不取決於輪
到哪名選手操作、以前的任何操作、骰子的點數或者其它什麼因素;
4、如果輪到某名選手移動,且這個局面的合法的移動集合為空(也就是說此時無法進行移動),則這名選手負。根據這個定義,很多日常的遊戲並非icg。例如
象棋就不滿足條件3,因為紅方只能移動紅子,黑方只能移動黑子,合法的移動集合取決於輪到哪名選手操作。
通常的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,而且可以通過定義計算出來。
以nim遊戲為例來進行一下計算。比如說我剛才說當只有兩堆石子且兩堆石子數量相等時後手有必勝策略,也就是這是乙個p-position,下面我們依靠
定義證明一下(3,3)是乙個p-position。首先(3,3)的子局面(也就是通過合法移動可以導致的局面)有(0,3)(1,3)(2,3)(顯
然交換石子堆的位置不影響其性質,所以把(x,y)和(y,x)看成同一種局面),只需要計算出這三種局面的性質就可以了。
(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(a1*a2*...*an)個局面的性質,不管
怎樣記憶化都無法降低這個時間複雜度。所以我們需要更高效的判斷nim遊戲的局面的性質的方法。
直接說結論好了。(bouton's
theorem)對於乙個nim遊戲的局面(a1,a2,...,an),它是p-position當且僅當a1^a2^...^an=0,其中^表示異
或(xor)運算。怎麼樣,是不是很神奇?我看到它的時候也覺得很神奇,完全沒有道理的和異或運算扯上了關係。但這個定理的證明卻也不複雜,基本上就是按
照兩種position的證明來的。
根據定義,證明一種判斷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問題就這樣基本上完美的解決了。
在下一節「sprague-grundy函式」中,我們將面對更多與nim遊戲有關的變種,還會看到nim遊戲的a1^a2^...^an這個值更廣泛的。
ICG博弈 尼姆博弈(Nim Game)及證明
這是最後一篇icg博弈,尼姆博弈,對比前面的巴什博弈和威佐夫博弈,尼姆博弈的玩法更加自由化,因此想贏的過程也更加複雜。如果沒有了解過巴什博弈和威佐夫博弈的,建議先看上兩篇 巴什博弈及證明 威佐夫博弈及證明 目前有任意堆石子,每堆石子個數也是任意的,雙方輪流從中取出石子,規則如下 每一步應取走至少一枚...
組合遊戲(博弈)
昨天看大白書翻到了組合遊戲這章,看著發覺原來是博弈論的內容,於是便看下去了。真是不看不知道,一看才知道自己的水平有多弱,不過好在還是集中精神地看了大部分。從nim遊戲 n堆石子,每人每次可以從任意一堆中取至少1個 至多整堆的石子,不能取者為輸 開始講起,引入必勝態 必敗態的概念 1.乙個狀態是必敗狀...
博弈 塗色遊戲
在乙個2 n的格仔上,alice和bob又開始了新遊戲之旅。這些格仔中的一些已經被塗過色,alice和bob輪流在這些格仔裡進行塗色操作,使用兩種塗色工具,第一種可以塗色任意乙個格仔,第二種可以塗色任意乙個2 2的格仔。每一輪遊戲裡,他們可以選擇一種工具來塗色尚未被染色的格仔。需要注意,塗色2 2的...