尋找必敗態——一類博弈問題的快速解法

轉自:http://www.cnblogs.com/Knuth/archive/2009/09/05/1561005.html

    博弈是信息學和數學試題中常會出現的一種類型,算法靈活多變是其最大特點,而其中有一類試題更是完全無法用常見的博弈樹來進行解答。 尋找必敗態即爲針對此類試題給出一種解題思路。
                   此類問題一般有如下特點:
                   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)項。證畢。
           這樣利用性質和性質得出的推論,此題的必敗態也完美的找出了。

           從上面的例子可以看出,利用尋找必敗態的思路解題對猜想和數學證明的能力要求很高,對思維的訓練有很大好處,同時編程複雜度相當低,也不失爲一種好的解題方法。

發佈了49 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章