博弈論的研究對象是一類遊戲,有特定的模型。html
好像有個專門的名詞叫作Impartial Combinatorial Games(簡稱ICG)函數
大概的定義以下:spa
整個遊戲能夠抽象成一個DAG;.net
每一個點都表明遊戲過程當中的某個決策狀態(特殊的,出度爲0的點是遊戲的終止狀態);htm
每條邊都表示能夠從某個狀態,通過直接的一次操做,轉移到另外一個狀態。對象
有兩個玩家,從指定的某個狀態開始,依次執行操做,誰先由於當前到達了終止狀態而沒法操做的人輸。blog
由於是DAG,因此必定會轉移到終止狀態的。遊戲
問題就是,從某狀態開始,先手必勝仍是後手必勝?get
舉個栗子——Nim遊戲的一個變種博客
有一堆$n$個石子,每次能夠取$1-k$個,當前沒法操做的人輸,問是否先手存在必勝策略?
對於這種問題,對於以每一個狀態爲起點的狀況,咱們都會惟一肯定是先手必勝仍是後手必勝。
這應該是很好想,幾乎不用證實的。
能夠對每一個點標記兩種狀態N和P,分別表示先手必勝和後手必勝
首先根據定義,終狀態爲P
而後,全部能直接到達終狀態的狀態就爲N了
進一步推廣,若是某點的出邊指向的點的集合中,有至少一個點爲P,那麼這個點爲N;不然就爲P。
好比對於上面提到的栗子
對每一個狀態都標號爲當前剩餘石子數
那麼$0$是P,$1-k$就都是N,$k+1$是P。。。。。。
接着就能夠推出當且僅當$(k+1)\mid a$時a是P。
對於這種基礎的問題,枚舉狀態建好圖後DP或者記憶化搜索就能夠快速解決了。
博弈論所涉及到的更多的遊戲,會把若干ICG拼湊在一塊兒,成爲一個規模更大的模型。
好比說上面那個Nim遊戲變種的升級版——
有$n$堆石子,每堆$a_i$個,每次能夠取$1-k$個,當前沒法操做的人輸,問是否先手存在必勝策略?
這時候,若是仍沿用上面的方法求解,咱們會發現狀態維度很大,時間和空間根本承受不了。
這裏介紹SG函數與SG定理,詳細證實就算了,我太弱了。
strangedbly巨佬的博客給出了十分易懂的證實,我的力薦。
定義運算$mex(S)$(S是一個天然數集合),結果爲S中未出現的最小天然數。
定義$SG(i)$(i是一個狀態,在圖中是一個點)爲對全部$i$可直達狀態(在圖中與i經過有向邊鏈接的全部點)的SG函數值取mex的值,即。
$$SG(i)=mex({j\mid SG(j),(i,j)\in G})$$
定義SG定理:點$i$爲P當且僅當$SG(i)=0$
若干ICG(能夠不相同)組合在一塊兒的遊戲,把每一個遊戲的SG值異或起來,不爲0則先手必勝。
接着對例子分析一下。
能夠發現,對於單堆石子來講,剩零個時$SG$值爲$0$,剩一個時爲$1$。。。剩$k$個爲$k$,剩$k+1$個時由於不能轉移到零個,$SG$值又變成了$0$。。。。。。
這能夠說明SG函數對於判斷狀態爲N仍是P是很是有效的。
那麼對於若干堆石子(即整個升級版遊戲)來講,勝負又會如何呢?只要把這若干個$SG$值都異或起來就徹底OK啦。
#實現
簡單的ICG可直接經過遞推、DP等方法推導出全部點的狀態。固然,若是找到規律,能夠直接$O(1)$判斷都說很差。
多個ICG的組合遊戲,則必定是離不開SG函數的。
但假如點很是多,或者每一個點的後繼肯定起來很是麻煩的時候,DP是不能解決問題的。
那怎麼辦?那確定是有規律啊!一眼看不出規律怎麼辦?可別忘了打表啊!
固然,打表也是有技巧的。至於如何如何,蒟蒻也說不出什麼門道來,仍是多刷題爲上上策。
#題目