博弈論的一點資料,關於NIM和SG函式

2021-05-28 08:32:49 字數 3460 閱讀 6462

最近手賤,又整acm的東西了。。。

說到博弈論,就想起了alice和bob。比如sicily 1798. alice and bob

之前做過一些題,可以構造出必勝的走法,需要技巧,遇到複雜一點的遊戲規則就沒轍了,所以還是得系統學一下一些博弈問題的解法。看到有人提起sg函式,趕緊按圖索驥,g一下,找些資料。

//文縐縐的定義,隨便看看就好

nim遊戲是組合遊戲(combinatorial games)的一種,準確來說,屬於「impartial combinatori games」(以下簡稱 icg)。滿足以下條件的遊戲是icg(可能不太嚴謹):

1、有兩名選手;

2、兩名選手交替對遊戲進行移動(move),每次一步,選手可以在(一般而言)有限的合法移動集合中任選一種進行移動;

3、對於遊戲的任何一種可能的局面,合法的移動集合只取決於這個局面本身,不取決於輪到哪名選手操作、以前的任何操作、骰子的點數或者其它什麼因素; 

4、如果輪到某名選手移動,且這個局面的合法的移動集合為空(也就是說此時無法進行移動),則這名選手負。根據這個定義,很多日常的遊戲並非 icg。例如象棋就不滿

足條件3,因為紅方只能移動紅子,黑方只能移動黑子,合法的移動集合取決於輪到哪名選手操作。

定義:有若干堆石子,每堆石子的數量都是有限的,合法的移動是「選擇一堆石子並拿走若干顆(不能不拿)」,如果輪到某個人時所有的石子堆都已經被拿空了,則判負(因為他此刻沒有任何合法的移動)。

當然,特殊情況就是只有一堆或者兩堆石子,自己去意淫一下吧。

其中p 代表previous,n 代表next。 p-position是必敗態,n-position是必勝態。

必敗(必勝)點屬性

(1) 所有終結點是必敗點(p點); //容易理解

(2) 從任何必勝點(n點)操作,至少有一種方法可以進入必敗點(p點); //就是那種我們要走的方法

(3)無論如何操作, 從必敗點(p點)都只能進入必勝點(n點).  //對手走完又只能把n留給我們

取子遊戲演算法實現

步驟1:將所有終結位置標記為必敗點(p點);

步驟2: 將所有一步操作能進入必敗點(p點)的位置標記為必勝點(n點)

步驟3:如果從某個點開始的所有一步操作都只能進入必勝點(n點) ,則將該點標記為必敗點(p點) ;

步驟4: 如果在步驟3未能找到新的必敗(p點),則演算法終止;否則,返回到步驟2

/*上面的說法似乎不太好理解。我簡單講下。顯然我們可以從終結條件遞推回來。往後往前開始掃瞄,(終結狀態方向為後)

a.如果當前是p點,那麼一步(向前)可以走到的都是n點

b.如果當前點未標明p/n屬性,那麼看看該點向後走是不是都只能到達n點,如果是,那麼該點是p點。

c.如果該點是n點,倒無法確定什麼。

如果沒辦法標乙個點,那麼異常結束。

*/kiki's game

我是用p n狀態遞推出來小規模的資料後找規律的,直接遞推提交爆記憶體。(x,y)中,x和y都是奇數的話,那麼無論怎麼移動,x和y中都有至少有乙個偶數,而且再移動一步後,都可以變成xy全奇數。

直接說結論好了。(bouton's theorem)對於乙個nim遊戲的局面(a1,a2,...,an),

它是p-position 當且僅當a1^a2^...^an=0,其中^表示異或(xor)運算。

根據定義,證明一種判斷position的性質的方法的正確性,只需證明三個命題: 

1、這個判斷將所有terminal position 判為p-position;

2、根據這個判斷被判為n-position 的局面一定可以移動到某個 p-position;

3、根據這個判斷被判為 p-position 的局面無法移動到某個p-position。

第乙個命題顯然,terminal position 只有乙個,就是全 0,異或仍然是0。 

第二個命題,對於某個局面(a1,a2,...,an),若 a1^a2^...^an!=0,一定存在某個合法的移動,將ai 改變成 ai'後滿足 a1^a2^...^ai'^...^an=0。不妨設 a1^a2^...^an=k,則一定存在某個 ai,它的二進位制表示在k的最高位上是 1(否則k 的最高位那個 1是怎麼得到的)。這時ai^k//注意可以拿走若干顆,數目不限

第三個命題,對於某個局面(a1,a2,...,an),若 a1^a2^...^an=0,一定不存在某個合法的移動,將 ai 改 變 成 ai' 後滿足 a1^a2^...^ai'^...^an=0 。 因 為 異 或 運 算 滿 足 消 去 率 , 由a1^a2^...^an=a1^a2^...^ai'^...^an 可以得到 ai=ai'。所以將 ai 改變成 ai'不是乙個合法的移動。證畢。

// 簡單理解,異或2次可以翻轉回來,我們只改乙個數字的話,翻不回來。

being a good boy in spring festival

求nim-sum,非零才能贏。然後每次從nim-sum去掉一堆撲克牌,結果是否小於這堆撲克牌數,如果能,方法數+1

zoj 3529 a game between alice and bob

上面強調了一點,遊戲中每次拿走的石頭數目是不限的,而這道題需要運用技巧進行轉換。

求出因子數即可!可以用dp,然後在篩素數的時候順便記錄一下其中乙個最大的因子。原始碼可以看這裡:

現在我們來研究乙個看上去似乎更為一般的遊戲:給定乙個有向無環圖和乙個起始頂點上的一枚棋子,兩名選手交替的將這枚棋子沿有向邊進行移動,無法移動者判負。事實上,這個遊戲可以認為是所有 impartial combinatorial games 的抽象模型。也就是說,任何乙個 icg都可以通過把每個局面看成乙個頂點,對每個局面和它的子局面連一條有向邊來抽象成這個「有向圖遊戲」。下面我們就在有向無環圖的頂點上定義 sprague-garundy函式。

mex(minimal excludant)運算

定義表示最小的不屬於這個集合的非負整數。例如mex=3、mex=0、mex{}=0。 

對於乙個給定的有向無環圖,定義關於圖的每個頂點的 sprague-garundy 函式 g 如下:

g(x)=mex。 

來看一下 sg 函式的性質。首先,所有的 terminal position 所對應的頂點,也就是沒有出邊的頂點,其 sg 值為 0,因為它的後繼集合是空集。然後對於乙個g(x)=0 的頂點 x,它的所後繼y都滿足 g(y)!=0。對於乙個g(x)!=0的頂點,必定存在乙個後繼 y滿足g(y)=0。

以上這三句話表明,頂點 x 所代表的 postion 是 p-position 當且僅當 g(x)=0(跟p-positioin/n-position 的定義的那三句話是完全對應的)。我們通過計算有向無環圖的每個頂點,就可以對每種局面找到必勝策略了。

s-nim

sg函式小試牛刀,哈哈

一堆石子的遊戲 ---->兩堆石子的遊戲 ---> nim遊戲 ---> 有向圖

p/n position  <----> nim-sum  <----> sg函式   //想起乙個詞 "同構"

nim和sg函式 博弈

hdu 組合博弈入門(或者直接搜整套課件)

博弈論一點點

基本就是把這裡的題過了一遍 sg函式資料 入門必備 感覺很不錯的文章 博弈論 一 nim遊戲 博弈論 二 sprague grundy函式 尋找必敗態 一類博弈問題的快速解法 練手 hdu1846 include using namespace std int main return 0 hdu21...

一點對博弈論的理解

大家對博弈論最深的理解相比就是帶有規律性的石子遊戲 可這些是前輩們多年總結起來的 在面對一道博弈論的題目時怎麼發現規律或在沒有規律時表示狀態的博弈狀態呢?n 表示必勝狀態,用非零自然數表示 p 表示必敗狀態,用零表示 我們定義一下這兩種狀態的轉移 定義之類的 我們通常從最終狀態向前推,則乙個狀態由多...

關於博弈論基礎知識的一些總結

博弈論是二人或多人在平等的對局中各自利用對方的策略變換自己的對抗策略,達到取勝目標的理論。a 當前執行者想贏。這個是必要的,有時候題目中判別勝負的條件會與平時練習的恰好相反,此時你就應該按照題目要求思考,即在經典模型中思考當前執行者想輸的策略。b 定義p position和n position,其中...