Nim遊戲與取火柴問題
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。計算
以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當且僅當這兩堆石子的數目相等”。結論
實例
例1:2. 取火柴遊戲的規則如下:一堆火柴有N根,A、B兩人輪流取出。每人每次可以取1 根或2 根,最先沒有火柴可取的人爲敗方,另一方爲勝方。如果先取者有必勝策略則記爲1,先取者沒有必勝策略記爲0。第一題比較簡單,可以推廣到有n根火柴每人可取1到m根 若n % ( m + 1 ) == 1則先取必敗,否則必勝,這個比較好證明 很簡單可以證明當火柴數爲1時先取必敗,然後火柴數爲m + 1時,無論先取的人怎樣取,假定取x個,那麼第二個人取m - x個,即可只剩一個留給對方。這樣一直下來,如果用D( x ) = 1表示當留有x個火柴時先取必敗,那麼 D( 1 ) = 1 D( m + 2 ) = 1 D( 2m + 3 ) = 1 ........ 在這道題的情況就是 D( 1 ) = 1 D( 4 ) = 1 D( 7 ) = 1 ......... 所以剛開始這些情況是必敗的,換言之,如果剛開始不是這種情況,則先取的人可以取n % ( m + 1 ) - 1個(注意n % ( m + 1 ) == 0的情況,這是應該是取m個),就可以轉化成上述令對手必敗的情況。
例2:2.(取石子游戲)現有5堆石子,石子數依次爲3,5,7,19,50,甲乙兩人輪流從任一堆中任取(每次只能取自一堆,不能不取),取最後一顆石子的一方獲勝.甲先取,問甲有沒有獲勝策略(即無論乙怎樣取,甲只要不失誤,都能獲勝) 如果有,甲第一步應該在哪一堆裏取多少 請寫出你的結果