1. 程式人生 > >acm中的一些博弈論知識

acm中的一些博弈論知識

(基本覆蓋了比賽中常用到的博弈論知識點,之前整理的,最近要開始系統的看博弈論,先找出來複習一下。)

零和與非零和博弈

先談幾個概念:

零和博弈:又稱零和遊戲,與非零和博弈相對,是博弈論的一個概念,指參與博弈的各方,在嚴格競爭下,一方的收益必然意味著另一方的損失,博弈各方的收益和損失相加總和永遠為“零”。雙方不存在合作的可能。也可以說:自己的幸福是建立在他人的痛苦之上的,二者的大小完全相等,因而雙方都想盡一切辦法以實現“損人利己”。零和博弈的例子有:賭博、期貨、股票投機等。非零和博弈:博弈中各方的收益或損失的總和不是零值,它區別於零和博弈。在經濟學研究中很有用。在這種狀況時,自己的所得並不與他人的所失的大小相等,連自己的幸福也未必建立在他人的痛苦之上,即使傷害他人也可能“損人不利己”,所以博弈雙方存在“雙贏”的可能,進而合作。非零和博弈的例子:譬如,在戀愛中一方受傷的時候,對方並不是一定得到滿足。也有可能雙方一起能得精神的滿足。也有可能雙方一起受傷。通常,彼此精神的損益不是零和的。比如目前的中美關係,就並非“非此即彼”,而是可以合作雙贏。不過想想看在這樣的利益交換之下,犧牲掉誰的利益?

帕累托最優:也稱為帕累託效率,是經濟學中的重要概念,並且在博弈論、 工程學和社會科學中有著廣泛的應用。 與其密切相關的另一個概念是帕累託改善。帕累托最優是指資源分配的一種理想狀態。假定固有的一群人和可分配的資源,如果從一種分配狀態到另一種狀態的變化中,在沒有使任何人境況變壞的前提下,使得至少一個人變得更好,這就是帕累託改善。帕累托最優的狀態就是不可能再有更多的帕累託改善的狀態;換句話說,不可能再改善某些人的境況,而不使任何其他人受損。需要指出的是,帕累托最優只是各種理想態標準中的“最低標準”。也就是說,一種狀態如果尚未達到帕累托最優,那麼它一定是不理想的,因為還存在改進的餘地,可以在不損害任何人的前提下使某一些人的福利得到提高。但是一種達到了帕累托最優的狀態並不一定真的很“理想”。比如說,假設一個社會裡只有一個百萬富翁和一個快餓死的乞丐,如果這個百萬富翁拿出自己財富的萬分之一,就可以使後者免於死亡。但是因為這樣無償的財富轉移損害了富翁的福利(假設這個乞丐沒有什麼可以用於回報富翁的資源或服務),所以進行這種財富轉移並不是帕累託改進,而這個只有一個百萬富翁和一個餓死乞丐的社會可以被認為是帕累托最優的。(這裡可以與古典功利主義的標準做一比較。按功利主義的標準,理想的狀態是使人們的福利的總和最大化的狀態。如果一個富翁損失很少的福利,卻能夠極大地增加乞丐的福利,使其免於死亡,那麼社會的福利總和就增加了,所以從功利主義的角度看,這樣的財富轉移是一種改善,而最初的極端不平等狀態則是不理想的,因為它的福利總和較低。可以看到,帕累託改進要求在提高某些人福利的時候不能減少任何一個人的福利,而功利主義則允許為了提高福利總和而減少一些人的福利。)

經濟學理論認為,如果市場是完備的和充分競爭的,市場交換的結果一定是帕累托最優的,並且會同時滿足以下3個條件:1. 交換最優:即使再交易,個人也不能從中得到更大的利益。此時對任意兩個消費者,任意兩種商品的邊際替代率是相同的,且兩個消費者的效用同時得到最大化。2. 生產最優:這個經濟體必須在自己的生產可能性邊界上。此時對任意兩個生產不同產品的生產者,需要投入的兩種生產要素的邊際技術替代率是相同的,且兩個消費者的產量同時得到最大化。3. 產品混合最優:經濟體產出產品的組合必須反映消費者的偏好。此時任意兩種商品之間的邊際替代率必須與任何生產者在這兩種商品之間的邊際產品轉換率相同。

如果一個經濟體不是帕累托最優,則存在一些人可以在不使其他人的境況變壞的情況下使自己的境況變好的情形。普遍認為這樣低效的產出的情況是需要避免的,因此帕累托最優是評價一個經濟體和政治方針的非常重要的標準。但是,如同上面指出的,一個帕累托最優的經濟系統只是在“最低”的意義上是“理想”的,並不能保證其中沒有貧困或嚴重的貧富差距。

帕累托最優是以提出這個概念的義大利經濟學家維弗雷多·帕雷託的名字命名的, 維弗雷多·帕雷託在他關於經濟效率和收入分配的研究中使用了這個概念

囚徒困境

囚徒困境是博弈論的非零和博弈中具代表性的例子,反映個人最佳選擇並非團體最佳選擇。雖然困境本身只屬模型性質,但現實中的價格競爭、環境保護等方面,也會頻繁出現類似情況。單次發生的囚徒困境,和多次重複的囚徒困境結果不會一樣。

在重複的囚徒困境中,博弈被反覆地進行。因而每個參與者都有機會去“懲罰”另一個參與者前一回合的不合作行為。這時,合作可能會作為均衡的結果出現。欺騙的動機這時可能被受到懲罰的威脅所克服,從而可能導向一個較好的、合作的結果。作為反覆接近無限的數量,納什均衡趨向於帕累托最優。

囚徒困境的主旨為,囚徒們雖然彼此合作,堅不吐實,可為全體帶來最佳利益(無罪開釋),但在資訊不明的情況下,因為出賣同夥可為自己帶來利益(縮短刑期),也因為同夥把自己招出來可為他帶來利益,因此彼此出賣雖違反最佳共同利益,反而是自己最大利益所在。但實際上,執法機構不可能設立如此情境來誘使所有囚徒招供,因為囚徒們必須考慮刑期以外之因素(出賣同夥會受到報復等),而無法完全以執法者所設立之利益(刑期)作考量。

1950年,由就職於蘭德公司的梅里爾·弗勒德(Merrill Flood)和梅爾文·德雷希爾(Melvin Dresher)擬定出相關困境的理論,後來由顧問艾伯特·塔克(Albert Tucker)以囚徒方式闡述,並命名為“囚徒困境”。經典的囚徒困境如下:

警方逮捕甲、乙兩名嫌疑犯,但沒有足夠證據指控二人有罪。於是警方分開囚禁嫌疑犯,分別和二人見面,並向雙方提供以下相同的選擇:

* 若一人認罪並作證檢控對方(相關術語稱“背叛”對方),而對方保持沉默,此人將即時獲釋,沉默者將判監10年。* 若二人都保持沉默(相關術語稱互相“合作”),則二人同樣判監半年。* 若二人都互相檢舉(互相“背叛”),則二人同樣判監2年。

                甲沉默(合作) 	          甲認罪(背叛)
乙沉默(合作) 	二人同服刑半年 	          甲即時獲釋;乙服刑10年
乙認罪(背叛) 	甲服刑10年;乙即時獲釋 	  二人同服刑2年

囚徒困境假定每個參與者(即“囚徒”)都是利己的,即都尋求最大自身利益,而不關心另一參與者的利益。參與者某一策略所得利益,如果在任何情況下都比其他策略要低的話,此策略稱為“嚴格劣勢”,理性的參與者絕不會選擇。另外,沒有任何其他力量干預個人決策,參與者可完全按照自己意願選擇策略。

囚徒到底應該選擇哪一項策略,才能將自己個人的刑期縮至最短?兩名囚徒由於隔絕監禁,並不知道對方選擇;而即使他們能交談,還是未必能夠盡信對方不會反口。就個人的理性選擇而言,檢舉背叛對方所得刑期,總比沉默要來得低。試設想困境中兩名理性囚徒會如何作出選擇:

* 若對方沉默、我背叛會讓我獲釋,所以會選擇背叛。
* 若對方背叛指控我,我也要指控對方才能得到較低的刑期,所以也是會選擇背叛。

二人面對的情況一樣,所以二人的理性思考都會得出相同的結論——選擇背叛。背叛是兩種策略之中的支配性策略。因此,這場博弈中唯一可能達到的納什均衡,就是雙方參與者都背叛對方,結果二人同樣服刑2年。

這場博弈的納什均衡,顯然不是顧及團體利益的帕累托最優解決方案。以全體利益而言,如果兩個參與者都合作保持沉默,兩人都只會被判刑半年,總體利益更高,結果也比兩人背叛對方、判刑2年的情況較佳。但根據以上假設,二人均為理性的個人,且只追求自己個人利益。均衡狀況會是兩個囚徒都選擇背叛,結果二人判監均比合作為高,總體利益較合作為低。這就是“困境”所在。例子華麗地證明了:非零和博弈中,帕累托最優和納什均衡是相沖突的。

固定局數的囚徒困境
試想像囚徒困境的情況進行十次。

我們可以合理地設想,如果囚徒第一次被對方指控,第二次這個囚徒也會指控對方。相反,如果第一次別人保持沉默,建立了互信的關係,你也會保持沉默,達致帕累托最優。
當然,兩個囚徒都會有相似的想法,在第一局保持沉默,以期望建立互信關係,所以雙方都會保持沉默。第二局時,雙方亦應有相似的想法,繼續保持沉默,以期繼續在互信的情況下進行第三局,以致餘下的八局。

這種想法合理嗎?

在第十局時,互信的關係明顯是沒有意義的,因為十局已經完結,囚徒沒有必要為維持互信的關係而沉默(沒有第十一局),所以第十局囚徒一定會背叛對方的,理由和只有一局囚徒困境一樣。
問題是,既然大家都知道在第十局,無論如何對方都會背叛自己的,你在第九局保持沉默也是沒有意思的,要知道,保持沉默(友好關係)的原因是為了希望下一局別人保持沉默。所以第九局雙方都一定會背叛對方的。

下一個問題是,雙方都有相同的想法,明知第九局對方會背叛自己,所以第八局保持沉默也是沒有意思的,第七局亦然,如此類推,納什均衡是十局都會互相背叛,建立互信關係是沒有可能的。
只有在囚徒困境的局數大家都不肯定的情況下,上述的推論才不會發生,才會出現互相保持沉默的現象。

現實的例子

上述例子可能顯得不甚自然,但現實中,無論是人類社會或大自然都可以找到類似囚徒困境的例子,將結果劃成同樣的支付矩陣。社會科學中的經濟學、政治學和社會學,以及自然科學的動物行動學、進化生物學等學科,都可以用囚徒困境分析,模擬生物面對無止境的囚徒困境博弈。囚徒困境可以廣為使用,說明這種博弈的重要性。以下為各界例子:
政治學例子:軍備競賽

在政治學中,兩國之間的軍備競賽可以用囚徒困境來描述。兩國都可以聲稱有兩種選擇:增加軍備(背叛)、或是達成削減武器協議(合作)。兩國都無法肯定對方會遵守協議,因此兩國最終會傾向增加軍備。似乎自相矛盾的是,雖然增加軍備會是兩國的“理性”行為,但結果卻顯得“非理性”(例如會對經濟造成都有損壞等)。這可視作遏制理論的推論,就是以強大的軍事力量來遏制對方的進攻,以達到和平。
經濟學例子:關稅戰

兩個國家,在關稅上可以有以兩個選擇:

1. 提高關稅,以保護自己的商品。(背叛)
2. 與對方達成關稅協定,降低關稅以利各自商品流通。(合作)

當一國因某些因素不遵守關稅協定,而獨自提高關稅(背叛)時,另一國也會作出同樣反應(亦背叛),這就引發了關稅戰,兩國的商品失去了對方的市場,對本身經濟也造成損害(共同背叛的結果)。然後二國又重新達成關稅協定。(重複博弈的結果是將發現共同合作利益最大。)

商業例子:廣告戰

商業活動中亦會出現各種囚徒困境例子。以廣告競爭為例。

兩個公司互相競爭,二公司的廣告互相影響,即一公司的廣告較被顧客接受則會奪取對方的部分收入。但若二者同時期發出質量類似的廣告,收入增加很少但成本增加。但若不提高廣告質量,生意又會被對方奪走。

此二公司可以有二選擇:

1. 互相達成協議,減少廣告的開支。(合作)
2. 增加廣告開支,設法提升廣告的質量,壓倒對方。(背叛)

若二公司不信任對方,無法合作,背叛成為支配性策略時,二公司將陷入廣告戰,而廣告成本的增加損害了二公司的收益,這就是陷入囚徒困境。在現實中,要二互相競爭的公司達成合作協議是較為困難的,多數都會陷入囚徒困境中。

自行車賽例子

自行車賽事的比賽策略也是一種博弈,而其結果可用囚徒困境的研究成果解釋。例如每年都舉辦的環法自由車賽中有以下情況:選手們在到終點前的路程常以大隊伍(英文:Peloton)方式前進,他們採取這策略是為了令自己不至於太落後,又出力適中。而最前方的選手在迎風時是最費力的,所以選擇在前方是最差的策略。通常會發生這樣的情況,大家起先都不願意向前(共同背叛),這使得全體速度很慢,而後通常會有二或多位選手騎到前面,然後一段時間內互相交換最前方位置,以分擔風的阻力(共同合作),使得全體的速度有所提升,而這時如果前方的其中一人試圖一直保持前方位置(背叛),其他選手以及大隊伍就會趕上(共同背叛)。而通常的情況是,在最前面次數最多的選手(合作)通常會到最後被落後的選手趕上(背叛),因為後面的選手騎在前面選手的沖流之中,比較不費力。

海盜分金幣

有五個理性的海盜,A, B, C, D 和 E,找到了100個金幣,需要想辦法分配金幣。
海盜們有嚴格的等級制度:A 比 B 職位高,B 比 C 高,C 比 D 高,D 比 E 高。

海盜世界的分配原則是:等級最高的海盜提出一種分配方案。所有的海盜投票決定是否接受分配,包括提議人。並且在票數相同的情況下,提議人有決定權。如果提議通過,那麼海盜們按照提議分配金幣。如果沒有通過,那麼提議人將被扔出船外,然後由下一個最高職位的海盜提出新的分配方案。

海盜們基於三個因素來做決定。首先,要能存活下來。其次,自己得到的利益最大化。最後,在所有其他條件相同的情況下,優先選擇把別人扔出船外。

直覺上認為,A 海盜會給自己分配很少,以避免被扔出船外。然而這和理論結果相差甚遠。
讓我們反過來看:如果只剩下 D 和 E,D 給自己100個金幣,給 E 0 個。因為 D 有決定權,所以分配達成。E 沒有別的選擇,他只能接受。

如果剩下三個人(C,D和E),C 知道 D 下輪會給 E 0 個金幣,所以 C 這輪給 E 1個金幣,讓 E 支援自己以使得提議通過。因此如果剩下三個人,結果是C:99,D:0,E:1。E 會反對 C 的做法麼?這樣對它沒有好處,假定它反對,把 C 扔出去對 E 也沒有好處,就像我們上面分析的。

如果 B, C, D 和 E 剩下, B 知道上述結果。所以為了避免被扔出去,他只需要給 D 1 個金幣,因為他有決定權,只需要 D 的支援就足夠了。因此他會提議 B:99, C:0, D:1,E:0。有人可能想到提議 B:99, C:0, D:0,E:1,因為 E 知道即使把 B 扔出去,也不會得到更多了。但由於海盜會優先把別人扔出去,所以 E 會選擇殺死 B,然後仍然可以從 C 的提議中得到相同金幣。

假設 A 知道所有的一切,他就能選擇讓 C 和 E 來支援他,提議變成:A: 98 金幣;B: 0 金幣;C: 1 金幣;D: 0 金幣;E: 1 金幣。

同樣的 A:98,B:0,C:0,D:1,E:1 或者其他的提議都不是最好的,因為 D 會選擇把A扔出去,然後從B 那裡得到相同的金幣。
通過這個例子我們可以在一定程度上了解博弈的本質,博弈並不是單純的尋找最優方案或者最優解,博弈關心的是一方的行為對其他人造成的影響,這一點和許多最優化問題並不相同。

旅行者的困境
航空公司丟失了兩位互相不認識乘客的旅行包。兩個旅行包正好都是一樣的,並且裡面有相同價值的古董,兩位乘客都向航空公司索賠 100 美元。為了評估出古董的真實價值,公司經理將兩位乘客分開以避免兩人合謀,分別讓他們寫下古董的價值,其金額要不低於 2 美元,並且不高於 100 美元。同時還告訴兩人:如果兩個數字是一樣的,那麼會被認為是其真實價值,他們能獲得相應金額的賠償。如果數字不一樣,較小的會被認為是真實價值,而兩人在獲得這個金額的同時有相應的獎賞/懲罰:寫下較小金額的會獲得 2 美元額外的獎勵,較大的會有 2 美元的懲罰。現在問題在於:兩位旅行者應該用什麼策略來決定他們應該寫下的金額?
設身處地想一想的話,這個(2,2)是合理的,如果我預期那位乘客和我有不共戴天之仇的話,那麼我會毫不猶豫寫下2元的。這樣的話,這個情況中並沒有告訴我們古董的真實價格是多少,也沒有告訴我們雙方對彼此的映像,即使一面也沒有見過的陌生人的話,更不會有不共戴天之仇吧,總的來說,我會寫下古董真實價格 V 略低一些,畢竟,那兩元的懲罰和獎勵對我的激勵並不大,影響我決策的更多的還是道德方面的因素。

猜均值的三分之二
在這個遊戲中,若干個參與者被要求每人給出一個0到100之間的數字,所給出的數字最接近平均值2/3的那個人將會是獲勝者。參與者之間並不知道其他人的選擇。按照理性人的假設,參與者們應該會先排除不可能的數字。例如超過67的數字就不可能,因為當大家都選100時,平均值的三分之二才不過66。這樣一來,每個人的選擇又變成了在0到66之間選一個數,此時大於44的數字又變得沒有意義了,接下來又是一個類似的迴圈……直到最後,所有理性人的選擇應該都為0。

無偏組合遊戲(ICG)

簡單的取拿遊戲
一堆石子(或者其它的什麼東西),下面是簡單的取拿遊戲規則:
兩名玩家,稱為 I 和 II;
有一堆石子,一共 21 個;
一次移動操作包括取走 1 個,2 個,或者 3 個石子,至少得取走 1 個,至多取走 3 個。
玩家 I 先開始,交替取,不可不取。
取走最後一個石子的獲勝。

我們可以反向推導。
如果只有 1 個,2 個或者 3 個石子留下,那麼下一個將要移動的玩家獲勝。
如果有 4 個留下,當前這個玩家取走後留下的石子數必然是 1 個,2 個或者 3 個,這樣另一個玩家必勝,因此 4 對於將要開始移動的玩家而言是必敗的局面,而對前一個玩家而言是必勝的局面。
如果有 5,6,7 個留下,玩家必須得給對方留下 4 個才能保證自己獲勝。
如果有 8 個留下,那麼下一個玩家必須留下 5,6,7 個,這樣先前那個玩家獲勝。
很容易發現,0,4,8,12,16 是我們希望留下的局面,我們希望狀態儘可能向這些局面轉化。由於本題起初是 21 個石子,由於 21 不是 4 的倍數,因此第一個玩家必然會贏,它只要留下的石子數是 4 的倍數對方就必然輸。

這便是 bash 博弈。

P 態和 N 態
在前面的遊戲中,0,4,8 等對於先前的玩家(Previous)而言是勝利的局面,稱為 P 態。而 1,2,3,5,6,7,9,10,11.。。等對下一個玩家(Next)是勝利的局面,稱為 N 態。

在這種無偏組合遊戲中,可以從結尾倒推來找出 P 態和 N 態。
(1)、標誌結尾局面為 P 態;
(2)、標誌能達到 P 態的為 N 態;
(3)、找到那些能達到 N 態的為 P 態;
(4)、如果能找到更多的 P 態,轉到(2);不然轉到(3)。

很容易看到向 P 態移動會獲勝,從一個 P 態開始,你的對手只能移動到 N 態,然後你再移動到 P 態,最終遊戲在 P 態終結。

P 態和 N 態有幾個特點:
(1)、所有的終結狀態都是 P 態;
(2)、從每個 N 態開始,至少有一步能移到 P 態;
(3)、從每個 P 態開始,每一步的移動都是 N 態。

減法遊戲
和上面的取石子游戲類似,假定有一個整數 n,兩個玩家輪流從整數中減去一個數 s,其中 s 的取值來自集合 S,對於上面的取石子游戲,S = {1,2,3}。讓我們通過類似的倒推找出 P 態。假定 S = {1,3,4}。容易發現 P 態集合是 {0,2,7,9,14,16,。。。}。所有態勢集合形成一個迴圈節,長度為 7。

x 	  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
position  P N P N N N N P N P N  N  N  N  P  ...


Wythoff’s Game (威佐夫博弈)

大致上是這樣的:有兩堆石子,不妨先認為一堆有 10,另一堆有 15 個,雙方輪流取走一些石子,合法的取法有如下兩種:
1、在一堆石子中取走任意多顆;
2、在兩堆石子中取走相同多的任意顆;
約定取走最後一顆石子的人為贏家,求必勝策略。

兩堆石頭地位是一樣的,我們用餘下的石子數(a,b)來表示狀態,並畫在平面直角座標系上。和前面類似,(0,0)肯定是 P 態,又叫必敗態或者奇異局勢。(0,k),(k,0),(k,k) 系列的節點肯定不是 P 態,你面對這樣的局面一定會勝,只要按照規則取一次就可以了。再看 y = x 上方未被劃去的格點,(1,2)是 P 態。k > 2 時,(1,k)不是 P 態,比如你要是面對(1,3)的局面,你是有可能贏的。同理,(k,2),(1 + k,2 + k)也不是 P 態,劃去這些點以及它們的對稱點,然後再找出 y = x 上方剩餘的點,你會發現(3,5)是一個 P 態,如此下去,如果我們只找出 a <= b 的 P 態,則它們是(0,0),(1,2),(3,5),(4,7),(6,10)。。。。。。它們有什麼規律嗎?
忽略(0,0),很快會發現對於第 i 個 P 態的 a,a = i * (sqrt(5) + 1)/2 然後取整。。。而 b = a + i。居然和黃金分割點扯上了關係。

假設面對的局勢是(a,b),若 b = a,則同時從兩堆中取走 a 個物體,就變為了奇異局勢(0,0);假定當前奇異局勢是(a[k],b[k]),如果 a = a[k] ,b > b[k],那麼,取走 b - b[k] 個物體,即變為奇異局勢;如果 a = a[k] , b < b[k] ,則同時從兩堆中拿走 a[k] - a[b - a[k]] 個物體,變為奇異局勢( a[b - a[k]] , a[b - a[k]] + b - a[k]);如果a > a[k] ,b= a[k] + k,則從第一堆中拿走多餘的數量a - a[k] 即可;如果 a < a[k] ,b= a[k] + k,分兩種情況,第一種,a=a[j] (j < k),從第二堆裡面拿走 b - b[j] 即可;第二種,a=b[j] (j < k),從第二堆裡面拿走 b - a[j] 即可。

從如上性質可知,兩個人如果都採用正確操作,那麼面對非奇異局勢,先拿者必勝;反之,則後拿者取勝。

考慮這個問題的一個擴充套件:
有一堆個數為 n 的石子,遊戲雙方輪流取石子,滿足:
1)先手不能在第一次把所有的石子取完;
2)之後每次可以取的石子數介於 1 到對手剛取的石子數的 2 倍之間(包含 1 和對手剛取的石子數的 2 倍)。

約定取走最後一個石子的人為贏家,求必敗態。

這個和之前的 Wythoff’s Game 和取石子游戲有一個很大的不同點,就是遊戲規則的動態化。之前的規則中,每次可以取的石子的策略集合是基本固定的,但是這次有規則 2:一方每次可以取的石子數依賴於對手剛才取的石子數。
這個問題居然和斐波那契數列有關,先下手的人獲勝當且僅當總數量不是斐波那契數。
有個很有用的定理:任何正整數可以表示為若干個不連續的 Fibonacci 數之和。
比如,我們要分解 83,可以寫成 83=55+28,而 28=21+7,7=5+2,故 83=55+21+5+2;
如果 n = 83,我們看看這個分解有什麼指導意義:假如先手取 2 顆,那麼後手無法取 5 顆或更多,而 5 是一個 Fibonacci 數,先手然後取走這 5 顆石子中的最後一顆,同樣的道理,接下去先手取走接下來的後 21 顆中的最後一顆,再取走後 55 顆中的最後一顆,那麼先手贏。

反過來如果 n 是 Fibonacci 數,比如 n = 89:如果先手第一次取的石子不小於 34 顆,那麼一定後手贏,因為 89 - 34 = 55 = 34 + 21 < 2*34,此時第二個人只要將剩下的全部取光即可。故只需要考慮先手第一次取得石子數 < 34 即可,於是剩下的石子數 x 介於 55 到 89 之間,它一定不是一個 Fibonacci 數,於是我們把 x 分解成 Fibonacci 數:x = 55 + f[i] + … + f[j],如果 f[j] <= 先手一開始所取石子數 y 的兩倍,那麼對 B 就是面臨 x 局面的先手,所以根據之前的分析,B只要先取 f[j] 個即可,以後再按之前的分析就可保證必勝。



Nim 博弈

從取石子游戲(Bash Game)到多堆的尼姆博弈是一個大進步,尼姆博弈的就是把取石子中的 1 堆變成了多堆。遊戲者輪流從某一堆棋子中取走一個或者多個(這裡暫時不限定每次最多能取幾個),最後不能再取的就是輸家。當指定相應數量時,一堆這樣的棋子稱作一個尼姆堆。

這裡假定是 3 堆。
其實現在這個問題的一部分解決了——任意多堆的相同個數的 Nim 堆。而且很容易知道,(0,N,N)一定是必敗態,如果有仔細嘗試的話,可以發現(1,2,3)也是必敗態,那到底有什麼規律呢?

命題:(a,b,c) 是必敗態等價於 p(a, b, c) = a xor b xor c = 0 ( xor 是異或運算)
如果我們面對的是一個非奇異局勢 (a,b,c),要如何變為奇異局勢呢?假設 a < b< c,我們只要將 c 變為 a xor b,即可,因為有如下的運算結果: 要將 c 變為 a xor b,只要從 c 中減去 c - (a xor b)即可。

推廣到多個堆也是類似的辦法。

Nim的一些變種

變種1: 取到最後一個石子的人輸.
首先明確奇數個1是必敗態, 偶數個1是必勝態. 這與正常的Nim不一致.
若只有一堆的個數大於1, 那麼現在可以控制全場的1個數的奇偶性, 所以是必勝的. 這與正常的Nim一致.
若不止一堆的個數大於1, 由於不能轉移到全是1的狀態, (可能可以轉移到僅有一堆大於1的狀態, 但此狀態與正常Nim一致), 所有當前可以轉移到的狀態的勝負性都是與正常的Nim一致的, 所以當前狀態的勝負性與正常的Nim也是一致的.
綜上, 除了全是1的狀態勝負性跟正常的Nim不一致, 其餘的狀態勝負性與正常的Nim一致.

變種2: 只能從最左或最右的一堆中取, 取到最後一個的贏.
對於 [L,X,R] 狀態, 若其是必敗狀態, 那麼|L-R|<=1.
證明: 設[L,X,R]是必敗態且R




遊戲圖與 SG 函式

前面幾節談到的遊戲可以用圖理論來描述,考慮一個圖 G = (X, F);其中 X 是頂點,也是先前遊戲中可能的態勢。F 是一個函式,對於 X 中的任意一個 x,F(x) 的值都出現在 X 中,對於 X 的一個元素 x,F(x) 的含義是一個玩家從 x 出發可以移動到的局勢。
對於一個兩人的類似前面的遊戲而言,可以在一個如此這樣的圖上進行博弈,首先指定一個起始點 x0,並使用下面的規則:
(1)玩家 I 從 x0 開始首先移動;
(2)玩家交替移動;
(3)在 x 態勢時,玩家要將態勢轉移到另一個態勢 y,其中 y 是 F(x) 中的元素。

為簡單起見,假定圖中不存在環,元素個數為 n,其中最長的一條路徑也不超過 n。那麼對於前面我們分析的減法遊戲,其中 S = {1, 2, 3}。假定遊戲中指定對 n 進行減法操作。X = {0, 1, 2..., n} 是圖頂點。F(0) 是空集。F(1) = {0},F(2) = {0, 1}。 對於 2<= k <= n,F(k) = {k -3, k -2, k -1}。
因此這個遊戲的圖大致如下。其中 n = 10。

邊的方向代表了可能的移動。

SG 函式
這種圖可以通過分析 SG 函式來分析。
所謂圖 (X, F) 的 SG 函式 g 是定義在 X 上的一個函式。
g(x) = min{n ≥ 0 : n ≠ g(y) for y ∈ F(x)}。換句話說,g(x) :是一個非負整數;儘可能的小;不出現在 x 的字尾節點的 g 函式取值中。
這是一個遞迴定義。但可以通過倒推來取得節點的值。對於終點 x,g(x) = 0,因為 F(x) 是空集。

如果一個態勢的 g(x) = 0 那麼它就是 P 態,否則就是 N 態。
下面的圖描述了 g 函式的求解過程,在開始所有的頂點本是沒有數字的。在開始,所有的終點 SG 函式值為 0,一共有 4 個終點,它們位於圖的左邊和下邊。對於點 a,它的字尾 SG 函式為 0,那麼它自身的 SG 值就是 1,它是所有沒有出現在 a 字尾節點的 SG 值的最小值。那麼 b 的 SG 值就是 2,因為它有 2 個字尾,一個是 a,令一個是終點,它們的 SG 值分別是 1 和 0,那麼它的 SG 值就是 2。那麼 c 的 SG 值就是 0,因為 c 只有一個字尾 a,而 a 的 SG 值為 1,那麼沒有出現在 c 字尾節點的 SG 值的最小值就是 0。

對於 S = {1, 2, 3} 的減法遊戲其 SG 函式是多少?
終點 0, SG 值為 0, 1 只能移到 0,而 g(0) = 0,所以 g(1) = 1,同樣,2 可以移動到 0 和 1,而 g(0) = 0,g(1) = 1,故 g(2) = 2,3 可以移動到 0,1,2 ,它們各自的 g(0) = 0, g(1) = 1, g(2) = 2,因此 g(3) = 3,但是對於 4 只能移動到 1,2,3,其各自的 SG 值為 1,2,3,故 g(4) = 0。
容易發現 g(x) = x( mod 4)。

考慮一種移石子游戲:每次必須移走至少剩餘的一半,我們可以如下計算 SG 函式:

x 	0 1 2 3 4 5 6 7 8 9 10 11 12 . . .
g(x) 	0 1 2 2 3 3 3 3 4 4 4  4  4  . . .

g(x) = min{k: power(2,k) > x}。

組合遊戲之和

SG 函式有什麼用?
假定我們有 n 個遊戲圖,G1 = (X1, F1),G2 = (X2, F2), . . . ,Gn = (Xn, Fn)。可以將它們結合成一個新圖,G = (X,F)。X = X1×· · ·×Xn 笛卡爾乘積。X 是個 n 元組 (x1, . . . , xn),對於 i,xi ∈ Xi。對於 x = (x1, . . . , xn) ∈ X,它的 F(x) 定義為
F(x) = F(x1, . . . , xn) = F1(x1) × {x2}×· · ·×{xn}
∪ {x1} × F2(x2)×· · ·×{xn}
∪ · · ·
∪ {x1} × {x2}×· · ·×Fn(xn).
一個自 x=(x1, . . . , xn) 開始的一次移動在於只移動 xi 到其一個後繼(位於 Fi(xi) 中的節點)。
對於組合圖 G,其 SG 函式為各子圖 SG 函式異或。

減法遊戲之和
假定 G(m) 代表一堆情況下的減法遊戲,其Sm = {1, 2, ..., m},表示每次可以移走 1 到 m 個石子,其 SG 函式 gm(x) = x (mod (m + 1))。
0 <= gm(x) <= m。考慮 3 個減法遊戲之和。在第一個遊戲中,第一堆 m = 3,有 9 個石子,第二堆 m = 5,有 10 個石子,在第三堆中 m = 7 有 14 個石子,因此初始狀態為(9,10,14)。此時的 SG 函式 g(9, 10, 14) = g3(9) xor g5(10) xor g7(14) = 1 xor 4 xor 6 = 3。此時可以在第三堆中拿走一個石子,此時的 SG 函式 g(9, 10, 13) = 1 xor 4 xor 5 = 0,這樣你就給對手留下了一個 P 態。

要麼全部,否則偶數
考慮一種移石子游戲:你可以移動任意個數的偶數個石子,只要它不是整堆;或者數量為奇數時拿走整堆。這個問題有兩種終結狀態:0 和 2。
g(2k) = k − 1,g(2k − 1) = k (k ≥ 1)。
如果當前遊戲有 3 堆,數量分別是 10,13,20。它們各自的 SG 值分別是 g(10) = 4, g(13) = 7, g(20) = 9,三者異或是 10 不是 0,因此這是 N 態,你可以將 20 對應堆的 SG 值改為 3:從 20 堆中拿走 12 個即可。因為這堆的 g(8) = 3。

堆的分拆
現在對 Nim 博弈進行改下,除了像通常的 Nim 堆那樣移動,還可以將一堆拆成 2 堆(不用移動)。顯然一堆情況下的 SG 函式滿足 g(0) = 0,g(1) = 1,對於 2 有幾種狀態,為 0,為 1 或者分拆成(1,1)。各自的 SG 值是 0,1,1 xor 1 = 0,因此 g(2) = 2。對於 3,後繼是 0,1,2 和 (1,2),其 SG 值分別是 0,1,2 和 1 xor 2 = 3,因此 g(3) = 4。繼續下去,可以發現

x 	0 1 2 3 4 5 6 7 8 9 10 11 12 . . .
g(x) 	0 1 2 4 3 5 6 8 7 9 10 12 11 . . .

g(4k + 1) = 4k + 1,g(4k + 2) = 4k + 2,g(4k + 3) = 4k + 4,g(4k + 4) = 4k + 3。

硬幣翻轉
硬幣翻轉是組合的典型例子。


資料整理來自部落格:www.chenyajun.com