博弈是信息學和數學試題中常會出現的一種類型,算法靈活多變是其最大特點,而其中有一類試題更是完全無法用常見的博弈樹來進行解答。尋找必敗態即為針對此類試題給出一種解題思路。
此類問題一般有如下特點:
1、博弈模型為兩人輪流決策的非合作博弈。即兩人輪流進行決策,并且兩人都使用最優策略來獲取勝利。
2、博弈是有限的。即無論兩人怎樣決策,都會在有限步后決出勝負。
3、公平博弈。即兩人進行決策所遵循的規則相同。
以下題目都屬于這一類:
POJ1740 A New Stone Game
MIPT100 Nim Game -- who is the winner?
POJ1704 Georgia and Bob
POJ1067 取石子游戲
本著先理論后實踐的原則,本文先對“尋找必敗態”做出理論上的解釋:
要理解這種思想,首先要明白什么叫必敗態。說簡單點,必敗態就是“在對方使用最優策略時,無論做出什么決策都會導致失敗的局面”。其他的局面稱為勝態,值得注意的是在勝態下做出錯誤的決策也有可能導致失敗。此類博弈問題的精髓就是讓對手永遠面對必敗態。
必敗態和勝態有著如下性質:
1、若面臨末狀態者為獲勝則末狀態為勝態否則末狀態為必敗態。
2、一個局面是勝態的充要條件是該局面進行某種決策后會成為必敗態。
3、一個局面是必敗態的充要條件是該局面無論進行何種決策均會成為勝態
這三條性質正是博弈樹的原理,但博弈樹是通過計算每一個局面是勝態還是必敗態來解題,這樣在局面數很多的情況下是很難做到的,此時,我們可以利用人腦的推演歸納能力找到必敗態的共性,就可以比較好的解決此類問題了。
下面就通過實際題目來做一些分析:
例1 POJ1740 A New Stone Game
題目大意是:有N堆石子,兩人輪流進行操作,每一次為“操作者指定一堆石子,先從中扔掉一部分(至少一顆,可以全部扔掉),然后可以將該堆剩下的石子中的任意多顆任意移到其他未取完的堆中”,操作者無法完成操作時為負。
分析:
只有一堆時先手必勝。
有兩堆時若兩堆相等則后手只用和先手一樣決策即可保證勝利,后手必勝。若不同則先手可以使其變成相等的兩堆,先手必勝。
有三堆時先手只用一次決策即可將其變成兩堆相等的局面,先手必勝。
有四堆時由于三堆必勝,無論先手后手都想逼對方取完其中一堆,而只有在四堆都為一顆時才會有人取完其中一堆,聯系前面的結論可以發現,只有當四堆可以分成兩兩相等的兩對時先手才會失敗。
分析到這里,題目好像已經有了一些眉目了,憑借歸納猜想,我們猜測必敗態的條件為“堆數為偶數(不妨設為2N),并且可以分為兩兩相等的N對”。
下面只需證明一下這個猜想。其實證明這樣的猜想很簡單,只用檢驗是否滿足必敗態的三條性質即可。
首先,末狀態為必敗態,第一條性質符合。
其次,可以證明任何一個勝態都有策略變成必敗態(分奇數堆和偶數堆兩種情況討論)。
最后,證明任何一個必敗態都無法變成另一個必敗態(比較簡單)。
由于篇幅關系,這里就不具體證明了,如果有興趣可以自己試試∶P
接下來的程序就相當簡單了,只用判斷一下即可。
有些題則比這一題的條件隱蔽許多,例如:
例2 MIPT100 Nim Game -- who is the winner?
題目大意是:有N堆石子,兩人輪流取,每次可以從任意一堆中取任意多顆(但至少一顆),誰先取完誰勝。
分析:
還是用按照“手推小數據=〉猜想=〉證明”的模式。
一堆時先手必勝。
兩堆時若兩堆相等則先手必敗,否則先手勝。
三堆的情況就有點復雜了,此時,我們只好借助博弈樹來在小范圍內求解,從這些解中我們可以看出,對于由兩個不同數字構成的兩元組,都有且僅有一個三元必敗態包含它,這又意味著什么呢?我們定義一個函數F(a,b),表示“包含a,b的三元必敗態中的第三數”,則有
F(1,2)=3,F(1,3)=2,F(1,4)=5,F(1,5)=4,F(1,6)=7,F(1,7)=6...
F(2,1)=3,F(2,3)=1,F(2,4)=6,F(2,5)=7,F(2,6)=4,F(2,7)=5...
F(3,1)=2,F(3,2)=1,F(3,4)=7,F(3,5)=6,F(3,6)=5,F(3,7)=4...
..................................................................................
..................................................................................
敏銳的選手馬上會發現,這個F(a,b)不就是a XOR b的結果么?做到這里,答案就在眼前了,'XOR'運算恐怕就是本題的關鍵。
繼續求出一些四元必敗態,這個性質仍然符合,于是我們猜想,必敗態即為“所有堆的石子數XOR運算后結果為零的局面”。這也解釋了為什么一堆石子必勝,兩堆石子僅在相等時必敗。
接下來又是證明:
依舊判斷是否符合三條性質。
第一條第三條顯然滿足,關鍵就是第二條。
必勝態下,設所有堆石子XOR后結果為N,將其寫成二進制,則至少有一堆石子寫成二進制后在N的最高位上為一,則可以證明從這堆石子中取可以變成必敗態,這里還是留給有興趣的選手:)
這一題就明顯沒有上一題輕松了,而且這是個經典問題,結論可以記下來。下面這個例子就是例2的強化版:
例3 POJ1704 Georgia and Bob
題目大意是:一個1*M的棋盤上有N個棋子,初始位置一定,兩人輪流操作,每次移動一枚棋子,要求只能向左移且至少移動一格,而且不能到達或經過以前有棋子的格子,誰無法移動棋子就算輸。
分析:
乍一看這一題棋子移動還要受其他棋子的限制,好像無法求出通解,但仔細分析會發現別有洞天。
一個棋子每一次向左移的最大步數是固定的,而且隨著移動減少,不是和取石子很像么?那么和取石子的區別在哪呢?就在于每一次移動時都會讓右邊相鄰的那顆棋子移動空間變大,這樣就和取石子只減不增有所不同了,我們應該怎樣解決這個問題呢?
我們并不放棄將其與我們熟悉的取石子對應,但我們將策略做小小的變動:
將棋子從右端向左端每相鄰兩個分為一對,如果只剩一個就將棋盤左端加一格放一顆棋子與之配對,這樣配對后好像和以前沒有什么區別,但決策時就方便多了,因為我們大可不必關心組與組之間的距離,當對手移動一組中靠左邊的棋子時,我們只需將靠右的那一顆移動相同步數即可!同時我們把每一組兩顆棋子的距離視作一堆石子,在對手移動兩顆棋子中靠右的那一顆時,我們就和他玩取石子游戲,這樣就把本題與取石子對應上了。
本例說明有許多模型看似復雜,但經過一些巧妙的變換,便可以轉化成一些我們熟悉的模型,同時也充分體現了博弈的靈活。
如果說前面的例子是介紹這種思想的運用的話,下面的方法就是講這種思路的優越性了,因為這一題并不是走的“手推小數據=〉猜想=〉證明”的老路,而是直接利用性質推導必敗條件。
例4 url=http://acm.pku.edu.cn/JudgeOnline/showmessage?message_id=4163]POJ1067 取石子游戲[/URL]
題目大意是:......題目本來就是中文的-_-b。
分析:
剛拿到這一題時,我不加思索的猜想必敗態為“兩堆石子的數目是2:1”,用性質判定:第一條顯然符合,第二條分情況討論每一種“勝態”都有一種固定的方法變成“必敗態”,再看第三條,設第一堆有N顆,第二堆有2*N顆,則無論怎樣拿都無法讓第二堆保持為第一堆的兩倍。證畢。
本以為此題就這么簡簡單單完了,但是我突然發現,當第一堆2顆,第二堆4顆時,從第二堆中取出3顆石子的話第二堆的確無法保持為第一堆的兩倍,但第一堆會變成第二堆的兩倍,基于此,整個猜想被徹底推翻。
于是我反轉思路,干脆從性質入手。
我們令必敗二元組為(a,b)形式,并令a<b。
根據性質三,有這樣兩個推論:
推論一:對于任意兩個的必敗二元組(a1,b1),(a2,b2),有a1<>a2,b1<>b2,a1<>b2,a2<>b1。
推論二:對于任意兩個的必敗二元組(a1,b1),(a2,b2),有b1-a1<>b2-a2。
利用性質和該推論,我們證明如下結論:“將必敗二元組按首元為關鍵字排序,每個必敗二元組中首元為未在前面的必敗二元組中出現的最小正整數,并且第N組中兩個數差為N”。
利用數學歸納法證明:
第一組為(1,2),滿足題意。
若前N組滿足題意,則有:
設為在前N組中出現的最小正整數為M,則對于二元組(M,M+N+1)有:
如果從數量為M的堆中取了石子,不妨設變成了(K,L),則L-K>N,這樣就有一個包含K,且不與前面N組任何一組相同的二元組,根據推論一,這個二元組一定不是必敗二元組。
如果只從數量為M+N+1的堆中取,不妨設剩下K顆,又分三種情況:
K>M,則N+1>K-M>0,根據推論二,這個二元組一定不是必敗二元組。
K=M或0,顯然不是必敗二元組。
0<K<M,則(K,M)為包含K,且不與前面N組任何一組相同的二元組,根據推論一,這個二元組一定不是必敗二元組。
綜上,根據性質三,(M,M+N+1)為必敗二元組,又根據排序的法則,(M,M+N+1)一定是數列的第(N+1)項。證畢。
這樣利用性質和性質得出的推論,此題的必敗態也完美的找出了。
從上面的例子可以看出,利用尋找必敗態的思路解題對猜想和數學證明的能力要求很高,對思維的訓練有很大好處,同時編程復雜度相當低,也不失為一種好的解題方法。