1. 程式人生 > >博弈之Nim淺談

博弈之Nim淺談

博弈論應該算是一門獨立的學問吧,它是現代數學不斷進步的產物,是運籌學中重要的一部分。作為一個電腦科學與技術專業的學生,在這裡談論這高深的“博弈”二字實有不妥,所以,講的不好的地方請多見諒。

  • Nim的遊戲規則(問題描述):有N堆物品,每堆有M[i](1 <= i <= N)個物品,兩個人輪流從任意一堆上取任意多的物品,最後取光者勝。兩人都採取最優策略,問,是先手贏還是後手贏?

  • 定理(亦是結論):如果M[1] xor M[2] xor M[3] xor …… xor M[N] == 0,那麼先手輸,否則先手贏。(xor是位運算中的抑或操作)

在這裡,我主要是講解Nim Game中上述定理的推導證明,因為這是我一開始很難理解的地方,而且網上也不容易找到這個定理的詳細推導證明的過程。

推導過程(定理證明):

N堆物品的情況太複雜了,我們首先來考慮一些簡單的情況。
1.M[1] == M[2] && M[1] == M[3] && …… && M[1] == M[N],這種特殊情況下,若N為奇數,肯定是先手必贏,N為偶數時先手必輸,原因是:當N=1時,先手必贏;N等於2時,先手必輸,因為先手只能做這樣的操作(a,a)==> (a,b),a > b >=0,當b==0時,後手就贏了,否則後手可以將狀態轉換成(b,b);當N為3時,可以直接轉換成(a,a)這種情況,以此類推。當然,這個例子只是作為一個啟發,然後可以對應著上面的定理來看,或許能有一些感覺。
2.N == 1 && M[1] != 0的情況(其實也就是其它N - 1堆物品的數量均為0),這種情況下,先手只要一次性把所有的物品取完,那麼就贏了。
3.N == 2 && M[1] == M[2] && M[1] != 0(其實也就是其它N - 2堆物品的數量均為0),這種情況是先手輸。為什麼呢?不論先手取多少,後手只要在另外的一堆物品中取的物品的數量和他相等,最終肯定會變到情況2,然後這時該後手取物品,那麼後手就贏了。
4.N == 2 && M[1] != M[2] && M[1] != 0 && M[2] != 0, 這種情況是先手贏。因為先手可以把這個狀態轉移到情況3,然後就贏了。

我們來分析上述四種情況和定理之間的關係。
情況1,先手輸,M[1] xor M[2] xor …… xor M[N] == 0,N為偶數時,
先手贏,M[1] xor M[2] xor …… xor M[N] == 0,N為奇數時。
情況2,先手贏。M[1] != 0.
情況3,先手輸。M[1] xor M[2] == 0.
情況4,先手贏。M[1] xor M[2] != 0.

我們再來考慮一下N == 3(就是有3堆物品的數量不為0,其餘全為0)的情況。

5.N == 3 && M[1] xor M[2] xor M[3] != 0 && M[1] != 0 && M[2] != 0 && M[3] != 0,這種情況下我們一定會有方法到達下面的第6種情況或者第3種情況的。
6.N == 3 && M[1] xor M[2] xor M[3] == 0 && M[1] != 0 && M [2] != 0 && M[3] != 0,這種情況下肯定沒有任何兩堆物品的數量是相等的。假如M[1] == M[2], 那麼M[1] xor M[2] == 0,0 xor 任何數是等於這個數的,所以和之前的條件肯定矛盾了。而且,此時你若從任何一堆物品中取走K個物品,肯定會有M[1] xor (M[2] - k) xor M[3] != 0(若在第2堆物品中取)。所以,這種情況要麼是到達第4中情況,要麼是到達第5種情況,而最終肯定會到達第4種情況的。所以,第5種情況先手贏,第6種情況先手會輸。

我們從N == 2推導到了N == 3,那麼只要你不嫌複雜,你肯定能從N == 3推導到N == 4的。我們可以一直推導到N很大的情況下。

PS:我並沒有講什麼P點和N點。因為我覺得從P點和N點的角度,可能不太是那麼容易講清楚,可能是自身理解的問題吧。在上述的推導過程中,P點即是敗點,N點即是勝點。意思就是,若先手的初始位置在N點,則先手肯定有辦法贏;若先手的初始位置在P點,則後手肯定會有辦法贏的。

其中,還有關於P點和N的三個簡單卻十分重要的屬性:

  • 所有的終結點均是P點。
  • 對於任意的N點,至少會有一種方法進入P點。
  • 無論如何操作,P點只能進入N點。

所以,在回頭去看前面的推導過程,我們就會很輕鬆了。

非常感謝熱心的朋友給我指出錯誤,已經更正,thanks。