1. 程式人生 > >[待更新]淺談博弈論

[待更新]淺談博弈論

博弈論

博弈論適用

一般為博弈論的題目有以下標誌

  1. 兩個選手交替進行遊戲
  2. 每個選手當前可進行的操作只與局面有關
  3. 遊戲有至少一個終止情況

如果不滿足上述條件而題目很像博弈的話,可以往dp(狀壓)或者其他東西上考慮
例如:
Gems Fight! [HDU - 4778]

思路

博弈論類題目就目前做過的題來看,一般有兩種情況,要麼考慮必勝局面推公式或者刷SG表找規律,要麼直接碼出SG函式

考慮必勝局面的做法一般先推出能一眼看出的必勝局面(最好其他局面都可以向下轉化為類似這個必勝局面),然後推出其他局面和這些必勝局面的關係。有些時候需要大膽一點猜結論

碼SG函式的題目一般資料範圍很小,因為刷SG表複雜度是記憶化dfs的複雜度,從資料範圍上也能看出一點出題人的小心思

SG函式

考慮一個博弈遊戲的所有局面,將其分為兩種,先手必勝和先手必敗。
每一個局面經過一次合法操作所能到達的局面連一條單向邊,就可構成一個類似解空間的有向樹

現給出SG函式的定義
S G ( x )

= m i n { y y K (
x ) , y N } , K ( x ) = { S G ( y ) x > y } SG(x) = min\{y|y \notin K(x),y \in N\},K(x) = \{ SG(y)|x->y \}
(看起來很繁瑣,其實SG(x)就是與x相連點的SG值中沒有出現的最小自然數)

乍一看這個函式的定義很突兀,怎麼就和最小自然數聯絡上了?

現在假設只看 S G ( x ) = 0 SG(x)=0 以及 S G ( x ) > 0 SG(x) > 0 兩類
博弈終止局面的 S G SG 值為0,代表先手必敗。

現有比較淺顯的定理

  • 如果一個點A所連的點有一個是先手必敗的點,那麼點A就是先手必勝
  • 如果一個點A所連的點都是先手必勝的點,那麼點A就是先手必敗點

現在再來考慮剛才簡化的 S G SG 函式
一個點A所連點存在一個 S G ( x ) = 0 SG(x)=0 的點,那麼這個點就是先手必勝( S G ( A ) > 0 SG(A)>0 ),如果一個點A所連點都是 S G ( x ) > 0 SG(x)>0 ,那麼這個點就是先手必敗( S G ( A ) = 0 SG(A)=0 )

大多數的題目這類簡化版的 S G SG 函式就夠用了

而取最小未出現自然數在取石子一類題目中比較常見,類似Nim遊戲或者其變種。(如果沒有了解過Nim遊戲的可以去了解一下,這個結論的推導也是根據 S G SG 函式來的)

利用完整版的 S G SG 函式,可以將n堆石子的類Nim遊戲分成n個1堆石子的子游戲,然後將n個子遊戲的 S G SG 值異或起來就是整個遊戲的 S G SG

推公式

推公式方面就是要多大膽假設,把問題往簡單的數學模型上靠。
一般檢測一個公式是不是正確的可以用一下3步

  1. 遊戲的終態是不是先手必敗態
  2. 先手必勝的局面能否移動到一個先手必敗的局面
  3. 先手必敗的局面無法移動到一個先手必敗的局面

其實就是推出的式子滿足最基本的勝負轉換

(就先寫這麼多吧,也是做了一些題想總結一下,之後有時間的話再帶著具體的例子來仔細講講)