組合遊戲與博弈
【引言】
分金幣問題:有100個金幣,兩個人輪流從這堆金幣中取金幣,規定每次至少取1個,最多取5個。取完最後一枚金幣的人獲勝。假入你先手取金幣,對方是足夠聰明的,你能找到一種必勝的方法嗎?
【問題分析】
首先我們考慮到這樣一個簡單的事實,如果最後把6個金幣留給對方去取,那麽很顯然,對方必敗。再往前推進一步,如果把12枚金幣留給對方去取,對方也必敗。
為什麽呢?原因很簡單,不論對方取幾個,我都能夠把金幣取成6個,這樣就回到上一個對方必敗的局勢了。
那麽我們可以更進一步地推出,如果把金幣取成18個,24個,30個.......留個對方呢?我們都可以必勝。所以可以推出,如果一開始金幣不是6的倍數,我們必然可以將其取成6的倍數,對方必敗。
反過來考慮,如果一開始金幣就是6的倍數,我們先手又不得不取,那麽不論我們取幾個,對方一定會將其取成6的倍數,那麽我們先手必敗。至此可以得出這樣一個結論:初始金幣個數100不是(5+1)的倍數,先手必勝。
【問題推廣】如果金幣是N個,每次至多取M個,至少取一個,那麽先手勝負情況如何?
結論:當 N %(M+1)= 0時,先手必敗,否則,先手必勝。這樣對於這個問題,我們就總結出了一般性規律,這個遊戲很經典,我們稱之為--巴什博弈。
【理論上升】我們已經總結出了巴什博弈的一般性規律,那麽對於諸於此類的組合遊戲,我們如何去用更抽象的工具去研究它呢?
引入P點和N點,
P點: 即必敗點,某玩家位於此點,只要對方無失誤,則必敗;
N點: 即必勝點,某玩家位於此點,只要自己無失誤,則必勝。
P/N點有如下性質:
(1)P點不能一步到達下一個P點,N點可以一步到達P點。這就是為什麽面臨P點必敗,因為你只要到達了P點,再進行決策無法再使局面變為P點,這樣的話必然把N點留給對方,對方面臨N點,又能一步到達P點,又將P點(必敗點)留給了你,這樣下去你必敗無疑。
(2)終結狀態是P點。很好理解,當上一個人把所有金幣取完了,那麽這時的狀態變成P點,你面臨的是空空如也,是勝負已分的終結狀態,所以終結狀態是P點。
(3)決定先手是否必勝,只要看初始局勢是P點還是N點。是P點,必敗;是N點,必勝。
在引言的取金幣問題中,當n = 19, m = 5時, P/N狀態如下表。顯然,初始狀態,剩余19個,是N點,先手必勝。
【問題推廣和變形】
一、巴什博弈
1、問題模型:只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取一個,最多取m個,最後取光者得勝。
2、解決思路:當n=m+1時,由於一次最多只能取m個,所以無論先取者拿走多少個,後取者都能夠一次拿走剩余的物品,後者取勝,所以當一方面對的局勢是n%(m+1)=0時,其面臨的是必敗的局勢。所以當n=(m+1)*r+s,(r為任意自然數,s≤m)時,如果先取者要拿走s個物品,如果後取者拿走x(≤m)個,那麽先取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以後保持這樣的取法,那麽先取者肯定獲勝。總之,要保持給對手留下(m+1)的倍數,就能最後獲勝。
3.一般性規律:當 N %(M+1)= 0時,先手必敗,否則,先手必勝。
二、威佐夫博弈
1.問題模型:有兩堆物品,數量分別為M,N,兩個人輪流取物品,先取完所有物品的人獲勝。取物品時有兩種方法,一是可以從某一堆取若幹物品(至少一個,多者不限),或者是從兩堆中同時取相同數量的物品。
2.策略:首先我們考慮一下面臨什麽局勢會輸,也就是兩堆物品數量分別是什麽的時候會輸,也就是什麽是P點。
(1)顯然(0,0)是P點。然後(1,2)是P點,為什麽呢,因為有個2在,不論你在第一堆取還是第二堆取,剩下的人一定可以取完所有。進一步思考,當你面臨(2,x),其中x>=2,你必勝,因為你要麽一次性取完所有,要麽把(1,2)留給對手,對手必敗。所以除了(2,1),其他所有(2,x)都不是必敗點。
(2)考慮(3,x)必敗的情況,(3,1)(3,2)(3,3)顯然都是必勝點。進一步推知(3,4)是必勝點。然後我們試試(3,5),發現它是必敗點。你不論怎麽取都會把之前我們已知的必勝點留給對方,所以你必敗。x>5的情況呢,必然是必勝點,因為你可以把X取成5,把必敗點(3,5)留給對方。這樣我們可以得出結論(3,x)中除了(3,5)必敗其余都是必勝。
(3)考慮(4,x)必敗的情況,(4,1)(4,2)(4,3)(4,5),(4,6)顯然都是必勝點。然而(4,7)卻是必敗點,你不論怎麽取都會把之前我們已知的必勝點留給對方,所以你必敗。
(4)這樣我們已經知道的必敗局勢有(0,0)、(1,2)、(3,5)、(4,7),我們把這種局勢稱之為奇異局勢。不難發現,如果記(ak, bk)為第k個奇異局勢(第0個必敗局勢是(0,0)),那麽ak是之前未出現過的最小數字,bk = ak + k;
3.一般性規律
那麽第K項的(ak, bk)是什麽呢?通項公式是:
具體證明見:https://baike.baidu.com/item/%E5%A8%81%E4%BD%90%E5%A4%AB%E5%8D%9A%E5%BC%88/19858256?fr=aladdin
4.註意事項。由於ak是整數,所以k一旦很大,比如10^100對根號5的精度要求極高,這時候調用庫函數sqrt(double x)是得不到這麽高的精度的,需要自己去實現一個實數開方的方法,返回一個高精度實數。
具體可以見我的另外一篇博客。
三、尼姆博弈
1. 問題模型:有3堆各若幹個物品,兩個人輪流從某一堆取任意多的物品,每次至少取一個,多者不限,最後取光者得勝。
2. 策略:
(1)首先我們分分析一下奇異局勢。(0,0,0)是第一個奇異局勢,然後可以證明(0,n, n)是奇異局勢,因為只要把這個局勢留給對面,對面在一堆中取幾個,那麽我們都在另外一堆取相同數目的物品,到最後肯定勝利。
(2)如果面臨的局勢是(1,2,3),你可以發現這也是一個奇異局勢,因為無論怎麽取,對手必然可以將其變為(0,n, n)的局勢留給你。
如果面臨(5,6,3),我們把它寫成二進制陣列的形式:
1 0 1
1 1 0
0 1 1
可以發現,不論你取走哪一行的哪一個1,我都取走另外某一行的對應位的1,並且最後一定是我(後手)勝利。
進一步可以發現,這三個數的二進制陣列中,第1列到最後一列都有偶數個1,所以我們可以采取前面所說的策略,不論先手取走哪一行的哪一列的一個1,我都取走另外某一行的對應列的一個1。這樣必然能夠使得我取走該矩陣該列最後一個1,如果對於該矩陣每一列我能取走最後一個1,那麽很顯然,我必然是先取光所有物品的人。
由此我們可以發現:只要把這三個數寫成二進制矩陣的形式,看看該矩陣是不是每一列的1的數目都是偶數,如果是,先手必敗。
這樣的矩陣有什麽特點呢?那就是二進制的異或和為0.(每一列1的個數都是偶數嘛)。如果局勢(x,y,z)是奇異局勢,那麽x xor y xor z = 0.
3. 推廣到N堆,局勢(X1, X2 , X3, X4, ......Xn)為奇異局勢的充要條件是 X1 xor X2 xor X3 xor X4 xor ......xor Xn = 0.
四、斐波那契博弈(引用自大佬博客)
1、問題模型:
有一堆個數為n的石子,遊戲雙方輪流取石子,滿足:
(1)先手不能在第一次把所有的石子取完;
(2)之後每次可以取的石子數介於1到對手剛取的石子數的2倍之間(包含1和對手剛取的石子數的2倍)。 約定取走最後一個石子的人為贏家。
2、策略:
當n為Fibonacci數時,先手必敗。即存在先手的必敗態當且僅當石頭個數為Fibonacci數。
證明:根據“Zeckendorf定理”(齊肯多夫定理):任何正整數可以表示為若幹個不連續的Fibonacci數之和。如n=83 = 55+21+5+2,我們看看這個分解有什麽指導意義:假如先手取2顆,那麽後手無法取5顆或更多,而5是一個Fibonacci數,那麽一定是先手取走這5顆石子中的最後一顆,同理,接下去先手取走接下來的後21顆中的最後一顆,再取走後55顆中的最後一顆,那麽先手贏。
反證:如果n是Fibonacci數,如n=89:記先手一開始所取的石子數為y
(1)若y>=34顆(也就是89的向前兩項),那麽一定後手贏,因為89-34=55=34+21<2*34。
(2)y<34時剩下的石子數x介於55到89之間,它一定不是一個Fibonacci數,把x分解成Fibonacci數:x=55+f[i]+…+f[j],若,如果f[j]<=2y,那麽對B就是面臨x局面的先手,所以根據之前的分析,後手只要先取f[j]個即可,以後再按之前的分析就可保證必勝。
五、公平組合遊戲與SG函數(未完待續)
組合遊戲與博弈