博弈論總結


博弈論總結

開頭&一些基本性質

本文的大部分內容來自於\(YMD\)的課件。(\(orz\ YMD\))

一、必勝點和必敗點

  • \(P\)點:必敗點,在雙方都聰明無比的情況下(比如\(zsy\)\(ppl\)在玩游戲),當前先手的人必敗的情況。
  • \(N\)點:必勝點,在雙方操作都正確的情況下先手必勝的位置。

幾個性質

  • 所有的終止位置都是必敗點\(P\)(我們認為這個是公理,即所有推導都在這個性質成立的基礎上進行。
  • 從任何一個必勝點\(N\)操作,至少有一種方法可以達到一個必敗點\(P\)
  • 從一個必敗點\(P\)出發,只能夠到達一個必勝點\(N\)

二、無偏博弈

無偏博弈是一類任意局勢對於游戲雙方都是平等的回合制雙人游戲。平等的含義是當前的所有可行的走法僅僅只依賴與當前的局勢,而與當前誰移動無關。換而言之,兩個人除了先后手的區別之外就不存在任何區別。除此之外,還需要滿足一下性質:

  • 完全信息,任何一個游戲者都能夠知曉整個游戲狀態。
  • 無隨機行動,所有的行動都會轉移到一個唯一確定的狀態。
  • 在有限步內游戲會終止,此時有唯一的勝者。

三、常見模型

  • 巴什博奕(\(Bash\ Game\))
  • 威佐夫博弈(\(Wythoff\ Game\))
  • 尼姆游戲(\(Nim\ Game\))
  • \(Anti-SG\)游戲
  • \(Multi-SG\)游戲
  • \(Every-SG\)游戲
  • 翻硬幣游戲
  • 樹上刪邊游戲

巴什博奕(\(Bash\ Game\))

基本問題

有一堆石子,總個數是\(n\),兩名玩家輪流在石子堆中拿石子,每次至少取\(1\)個,至多取\(m\)個。取走最后一個石子的玩家為勝者。判定先手和后手誰勝。

解決方法

如果\((m+1)|n\)則先手必敗,否則先手必勝。

證明

假設\((m+1)|n\),那么假設先手拿走了\(x\)個,那么后手必定可以拿走\((m+1)-x\)個,這樣子無論怎么拿,剩下的石頭個數都將是\(m+1\)的倍數。那么最后一次取的時候石頭個數必定還剩下\(m+1\)個,無論先手拿多少個,都會剩下石頭,此時后手必定可以將剩下的所有石頭取光從而獲勝。

否則的話,先手可以取走模\(m+1\)余數個數個石頭,此時模型轉換為了先手面對\((m+1)|n\)個石頭的情況,也就是后手必敗,即先手必勝。

題目&代碼

HDU1846 Brave Game

威佐夫博弈(\(Wythoff\ Game\))

基本問題

有兩堆石子,石子數可以不同。兩人輪流取石子,每次可以在一堆中取,或者從兩堆中取走相同個數的石子,數量不限,取走最后一個石頭的人獲勝。判定先手是否必勝。

解決方法

這個東西意義不是很大,打表找規律之后可以發現先手必敗的狀態一定形如\(([i\times\phi],[i\times\phi^2])\)。其中\(\phi=\frac{\sqrt{5}+1}{2}\)\([x]\)表示不大於\(x\)的最大整數。一些證明可以參考這個神仙博主的博客

題目&模板

洛谷2252&HDU1527 取石子游戲

尼姆博弈(\(Nim\ Game\))

基本問題

有三堆石子,兩人輪流取,每次可以從一堆中取走任意數量個石子,至少取走一個,問先后手誰勝。

一般推廣:有\(n\)堆石子\(x_1,x_2,x_3,...,x_n\),兩人輪流取,每次可以從任意一堆石子中取走至少一個石子,問先后手誰勝。

解決方法

方法很簡單,直接求所有\(x_i\)的異或和,如果異或和為\(0\)則先手必敗,否則先手必勝。形式化的表達即當且僅當\(x_1\oplus x_2\oplus x_3\oplus...\oplus x_n=0\)時,先手必敗。

同理,也就是所以異或和為\(0\)的狀態是\(P\)狀態,所有異或和非\(0\)的是\(N\)狀態。

證明(偽證):

首先當沒有石子的時候,先手必敗,此時所有石子的異或和為\(0\),這個是\(P\)狀態。

接下來我們證明任意一個\(N\)狀態至少能夠達到一個\(P\)狀態。

假設當前所有石子個數的異或和為\(k\),即\(\oplus_{i=1}^nx_i=k\),那么,必定存在一個\(x_i\)滿足\(x_i\)二進制位上存在\(k\)的最高位,並且不難證明\(x_i\oplus k<x_i\),那么,將\(x_i\)異或上\(k\)之后,剩下所有的數的異或和恰好為\(0\),又回到了一個\(P\)狀態。

而一個\(P\)狀態的異或和為\(0\),任何一個數減小之后異或和一定不為\(0\),所以可以證明任何一個\(P\)狀態的后繼狀態都是\(N\)狀態。

綜上,異或和為\(0\)的狀態先手必敗,其他情況先手必勝。

拓展形式

  • 每次取的石子數存在上界\(m\)

    這個是\(Bash\ Game+Nim\ Game\),只需要把所有石子按照\(m+1\)取模再考慮\(Nim\)游戲就好了。

  • 每次允許從\(k\)堆石子中取(\(Nim_k\))

    我們一般考慮的情況是\(Nim_1\),我們的解法是考慮\(2\)進制下的異或和是否為\(0\),而異或和是不進位的加法,同理,對於\(Nim_k\)的情況,我們考慮\(k+1\)進制下每一位不進位加法的結果,如果每一位都是\(0\)的話就是\(P\)局面,否則是\(N\)局面。

  • 階梯博弈:博弈在階梯上進行,每次可以將一堆的若干式子移動到上一階去,不可操作者輸。

    忽略所有的偶數階梯,只留下奇數階梯,轉化為普通的\(Nim\)游戲。大致的思路是這樣的:首先終止狀態一定是所有石子都在\(0\)號階梯,即一個偶數階梯。那么如果對方移動了一個偶數階梯上的石子,那么你可以在移動結束的那個奇數階梯,直接把等數量的石子繼續向前移動,這樣子可以保證偶數階梯上的石子對於結果沒有任何影響。那么如果移動的是一個奇數階梯,因為偶數階梯是沒有影響的,所以你可以認為移動奇數階梯就是直接被移走了,那么這就是一個普通的\(Nim\)游戲了。

題目&模板

洛谷2197 \(Nim\)游戲裸題

BZOJ1299 Nim游戲變形

POJ1704 階梯博弈變形

\(SG\)定理和\(SG\)函數

  • \(Sprague-Grundy\)定理:所有一般勝利下的無偏博弈(定義在上面)都能夠轉化成尼姆數表達的尼姆堆博弈,一個無偏博弈的尼姆值定義為這個博弈的等價尼姆數。(抄自\(YMD\)課件)
  • \(SG\)函數:對於每一個狀態的一個尼姆數的函數又被稱作\(Sprague-Grundy\)函數。

翻譯成人話就是:對於當前游戲\(X\),它可以拆分成若干個子游戲\(x_1,x_2,x_3,...,x_n\)。那么\(SG(X)=SG(x_1)\oplus SG(x_2)\oplus...\oplus SG(x_n)\)

接下來定義\(mex\)運算,\(mex\)運算是對於一個集合\(S\)而言的,\(mex(S)\)表示的是最小的、不屬於集合\(S\)的非負整數。例如\(mex\{1,2,3\}=0,mex\{\phi\}=0\)。那么我們有運算\(SG(x)=mex\{SG(y),<x,y>\in E\}\),其中\(E\)是邊集。即對於當前狀態\(x\)\(SG\)函數,它的值定義為所有的后繼狀態的\(mex\)值。對於\(SG\)函數為\(0\)的位置一定是\(P\)位置,\(SG\)函數非\(0\)的位置是\(N\)位置。

這里直接空說很不好,我們舉個例子。

HDU1848 Fibonacci again and again,為了節約篇幅,直接戳鏈接看題目&題解&代碼。

事實上,注意"后繼"這個詞語,我們不難發現上述的東西可以理解為一個\(DAG\)上的問題。

\(Anti-SG\)游戲&\(SJ\)定理

基本問題

決策集合為空者的操作者勝利。翻譯成\(Nim\)一點的問題就是,給定\(n\)堆式子,每次每個人可以從任意一堆石子中拿走不少於一個的石子,拿走最后一個石子的人輸。

解決方法

\(SJ\)定理:對於一個\(Anti-SG\)游戲,如果我們規定當前局面中所有單一游戲的\(SG\)\(0\)時,游戲結束,則先手必勝的條件為:

  • 游戲的\(SG\)值不為\(0\),且存在一個單一游戲的\(SG\)值大於\(1\)
  • 游戲的\(SG\)值為\(0\),且不存在一個單一游戲的\(SG\)值大於\(1\)

題目&模板

BZOJ1022 \(Anti-SG\)模板題

\(Multi-SG\)游戲

基本模型

決策集合為空的操作者輸。一個單一游戲的后繼可以是多個單一游戲。還是寫成\(Nim\)一點的式子,給定你\(n\)堆石子,每次可以取走任意數量個,或者將一堆式子拆分成兩堆(事實上更多也是可行的)非空石子,不能操作者輸,判定勝負。

解決方法

還是可以使用\(SG\)函數解決,舉個例子,比如當前存在一堆\(3\)個石子,那么可以直接走\(0,1,2,3\)個石子,也可以拆分成\((1,2)\)兩堆,因此\(SG(3)=mex\{SG(0),SG(1),SG(2),SG(3),SG((1,2))=SG(1)\oplus SG(2)\}\)

那么這個問題本質上還是一個\(Nim\)游戲,可以直接用\(SG\)函數解決。

同時,對於這樣每次可以拆分兩堆的\(Multi-SG\)游戲,打表后發現有這樣一個性質:

\[SG(x)=\begin{cases} x-1&(x\ mod\ 4=0)\\ x&(x\ mod\ 4=1\&2)\\ x+1&(x\ mod\ 4=3) \end{cases} \]

題目&模板

HDU3032 \(Multi-SG\)模板題

BZOJ2940 簡單的\(Multi-SG\)題目

BZOJ1188 有些困難的\(Multi-SG\)模型

BZOJ3576 有點難度的\(Multi-SG\)變形

\(Every-SG\)游戲

基本模型

對於沒有結束的任何一個單一游戲,操作者必須對其進行一步操作,無法操作者輸。

解決方法

所有游戲都是獨立的,並且我們發現無法操作者輸,而同時又在進行多個游戲。因此,我們知道勝負情況只與最后結束的游戲的勝負情況相關。既然只與最后結束的游戲相關,那么我們這樣分析:首先對於一個能夠取得勝利的游戲,我們必定會取得勝利,這樣一定不會讓結果更差,因為只要贏了,這局游戲就一定不會讓自己輸。那么對於所有單個游戲的勝負情況,我們一定可以判定,但是對於整個\(Every-SG\)的情況,我們只能夠通過最后結束的游戲判定。所以,對於一個我們必勝的游戲,我們一定會想辦法將其盡可能的向后拖,即我們期望它盡可能完的結束;反過來,對於一個必敗的游戲,我們一定會讓他盡可能早的結束。這幾句推論正確的理由都是所有游戲都是互相獨立的。

那么,我們首先可以判定出所有位置是\(N\)點還是\(P\)點,然后根據必勝和必敗的關系,我們必定要決策步數最小還是步數最大,那么這個就非常類似於一個\(min-max\)搜索。至於\(N\)點和\(P\)點的判定我們可以很容易的用\(SG\)函數表示出來。我們定義\(step(x)\)為狀態\(x\)時(在滿足\(N/P\)的條件下)的步數,我們可以得到這樣一個轉移:

\[step(x)=\begin{cases} 0&u=End\\ max\{step(v)\},<u,v>\in E&u\in N,v\in P\\ min\{step(v)\},<u,v>\in E&u\in P \end{cases} \]

不難發現對於一個\(P\)狀態,\(step\)一定是偶數,對於一個\(N\)狀態,\(step\)一定是一個奇數。那么對於這樣一個游戲,先手必勝的條件就變成了當且僅當所有單一游戲的最大\(step\)是一個奇數。

題目&模板

HDU3595 觀察性質后直接用\(Every-SG\)求解

翻硬幣游戲

題目

\(n\)枚硬幣排成一排,依次編號\(1\)\(N\),有的正面朝上,有的反面朝上。現在按照一定的規則翻硬幣(比如每次只能翻一枚或者兩枚,或者每次只能翻動連續的幾枚),但是強制要求最靠右的硬幣必須從正面被翻到了反面。操作集合為空者負。

解決方法

結論是這樣的:當前局面的\(SG\)值是所有正面朝上的硬幣單獨存在時的\(SG\)值的異或和。

證明?我也不會啊。可以感性理解一下,無論如何最右邊的硬幣都要翻,它翻了之后必定改變前面的狀態,但是前面的狀態是什么似乎和之前的狀態無關(假裝能夠說服我自己),之和之前的狀態和現在狀態的差別(也就是看成\(01\)串后的異或和)相關,所以你可以把游戲拆分成所有正面朝上的硬幣的子游戲。

如果您想參考更多翻硬幣的規則,可以戳這里

鏈接中給出這么多游戲的主要目的是因為直接使用\(SG\)函數求解效率太低,很多時候利用\(SG\)函數打表找規律才是最好的方法。

樹的刪邊游戲

題目

給定一個\(n\)個節點的有根樹,兩人輪流刪邊,刪去邊之后,不和根節點聯通的部分都會被移除。不能操作者輸,判斷勝負。

解決方法

結論:定義葉子節點的\(SG\)值為\(0\),其他所有節點的\(SG\)值為它所有兒子的\(SG\)值加\(1\)后的異或和。

證明:我也懶得會,沒有太多的意義,如果有興趣看可以戳這里

結尾

對於這一部分的博弈,這些東西都是比較常見的博弈模型。它們主要利用\(SG\)函數求解,換而言之,\(SG\)函數就是這篇文章中所有博弈游戲的靈魂。所有的一切都是利用\(SG\)函數區分\(N/P\)狀態,利用\(SG\)函數,也可以得到很多題目不會差於對抗搜索復雜度的算法。

但是有很多的博弈題目似乎並用不上\(SG\)函數,或者說很難用上,這個時候的解決方法一般就是要么直接打表找規律,要么通過分析和構造,找到先手必勝的條件再來進行判斷。這些非常見的博弈模型也就不是我在這里能夠窮舉完的啦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM