博弈論中SG函式的解釋與運用
序:博弈是資訊學和數學試題中常會出現的一種型別,演算法靈活多變是其最大特點,而其中有一類試題更是完全無法用常見的博弈樹來進行解答。 尋找必敗態即為針對此類試題給出一種解題思路。
此類問題一般有如下特點:
1、博弈模型為兩人輪流決策的非合作博弈。即兩人輪流進行決策,並且兩人都使用最優策略來獲取勝利。 2、博弈是有限的。即無論兩人怎樣決策,都會在有限步後決出勝負。 3、公平博弈。即兩人進行決策所遵循的規則相同。
理論鋪墊:
1、定義P-position和N-position:其中P代表Previous,N代表Next。直觀的說,上一次move的人有必勝策略的局面是P-position,也就是“先手必敗”,現在輪到move的人有必勝策略的局面是N-position,也就是“先手可保證必勝”。
(1).無法進行任何移動的局面(也就是terminal position)是P-position;
(2).可以移動到P-position的局面是N-position;
(3).所有移動都導致N-position的局面是P-position。
2、P/N狀態有如下性質:
(1)、若面臨末狀態者為獲勝則末狀態為勝態否則末狀態為必敗態。
(2)、一個局面是勝態的充要條件是該局面進行某種決策後會成為必敗態。
(3)、一個局面是必敗態的充要條件是該局面無論進行何種決策均會成為勝態
3、P點: 即必敗點,某玩家位於此點,只要對方無失誤,則必敗;
N點: 即必勝點,某玩家位於此點,只要自己無失誤,則必勝。
4、取石子游戲演算法實現
步驟1:將所有終結位置標記為必敗點(P點);
步驟2: 將所有一步操作能進入必敗點(P點)的位置標記為必勝點(N點)
步驟3:如果從某個點開始的所有一步操作都只能進入必勝點(N點) ,則將該點標記為必敗點(P點) ;
步驟4: 如果在步驟3未能找到新的必敗(P點),則演算法終止;否則,返回到步驟2
/*
a.如果當前是P點,那麼一步(向前)可以走到的都是N點
b.如果當前點未標明P/N屬性,那麼看看該點向後走是不是都只能到達N點,如果是,那麼該點是P點。
c.如果該點是N點,倒無法確定什麼。
如果沒辦法標一個點,那麼異常結束。
*/
幾種常見型別詳解:
一、巴什博弈
1、問題模型:只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取一個,最多取m個,最後取光者得勝。
2、解決思路:當n=m+1時,由於一次最多隻能取m個,所以無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝,所以當一方面對的局勢是n%(m+1)=0時,其面臨的是必敗的局勢。所以當n=(m+1)*r+s,(r為任意自然數,s≤m)時,如果先取者要拿走s個物品,如果後取者拿走x(≤m)個,那麼先取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以後保持這樣的取法,那麼先取者肯定獲勝。總之,要保持給對手留下(m+1)的倍數,就能最後獲勝。
3、變形:條件不變,改為最後取光的人輸。
結論:當(n-1)%(m+1)==0時後手勝利。
4、題目練習:HDOJ:2188 2149 1846
二、威佐夫博奕
1、問題模型:有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取一個,多者不限,最後取光者得勝。
2、解決思路:A:設(ai,bi)(ai ≤bi ,i=0,1,2,…,n)表示兩堆物品的數量並稱其為局勢,如果甲面對(0,0),那麼甲已經輸了,這種局勢我們稱為奇異局勢。前幾個奇異局勢是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。任給一個局勢(a,b),如下公式判斷它是不是奇異局勢: ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,…,n 方括號表示取整函式)。(證明見百度百科)
3、滿足上公式的局勢性質:
(1)任何自然數都包含在一個且僅有一個奇異局勢中。
由於ak是未在前面出現過的最小自然數,所以有ak > ak-1 ,而 bk= ak + k > ak-1 + k-1 = bk-1 > ak-1 。所以性質成立。
(2)任意操作都可將奇異局勢變為非奇異局勢。
若只改變奇異局勢(ak,bk)的某一個分量,那麼另一個分量不可能在其他奇異局勢中,所以必然是非奇異局勢。如果使(ak,bk)的兩個分量同時減少,則由於其差不變,且不可能是其他奇異局勢的差,因此也是非奇異局勢
(3)採用適當的方法,可以將非奇異局勢變為奇異局勢。
假設面對的局勢是(a,b),若 b = a,則同時從兩堆中取走 a 個物體,就變為了奇異局勢(0,0);如果a = ak ,b > bk,那麼,取走b – bk個物體,即變 為奇異局勢;如果 a = ak , b < bk ,則同時從兩堆中拿走 ak – ab – ak個物體,變為奇異局勢( ab – ak , ab – ak+ b – ak);如果a > ak , b= ak + k,則從第一堆中拿走多餘的數量a – ak 即可;如果a < ak ,b= ak + k,分兩種情況,第一種,a=aj (j < k),從第二堆裡面拿走 b – bj 即可; 第 二種,a=bj (j < k),從第二堆裡面拿走 b – aj 即可。
4、結論:兩個人如果都採用正確操作,那麼面對非奇異局勢,先拿者必勝;反之,則後拿者取勝。
5、練習:poj 1067
三、Fibonacci博弈
1、問題模型:
有一堆個數為n的石子,遊戲雙方輪流取石子,滿足:
(1)先手不能在第一次把所有的石子取完;
(2)之後每次可以取的石子數介於1到對手剛取的石子數的2倍之間(包含1和對手剛取的石子數的2倍)。 約定取走最後一個石子的人為贏家。
2、解決思路:
當n為Fibonacci數時,先手必敗。即存在先手的必敗態當且僅當石頭個數為Fibonacci數。
證明:根據“Zeckendorf定理”(齊肯多夫定理):任何正整數可以表示為若干個不連續的Fibonacci數之和。如n=83 = 55+21+5+2,我們看看這個分解有什麼指導意義:假如先手取2顆,那麼後手無法取5顆或更多,而5是一個Fibonacci數,那麼一定是先手取走這5顆石子中的最後一顆,同理,接下去先手取走接下來的後21顆中的最後一顆,再取走後55顆中的最後一顆,那麼先手贏。
反證:如果n是Fibonacci數,如n=89:記先手一開始所取的石子數為y
(1)若y>=34顆(也就是89的向前兩項),那麼一定後手贏,因為89-34=55=34+21<2*34。
(2)y<34時剩下的石子數x介於55到89之間,它一定不是一個Fibonacci數,把x分解成Fibonacci數:x=55+f[i]+…+f[j],若,如果f[j]<=2y,那麼對B就是面臨x局面的先手,所以根據之前的分析,後手只要先取f[j]個即可,以後再按之前的分析就可保證必勝。
3、練習題目:NYOJ 取石子游戲
四、尼姆博弈
1、問題模型:有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取一個,多者不限,最後取光者得勝。
2、解決思路:用(a,b,c)表示某種局勢,顯證(0,0,0)是第一種奇異局勢,無論誰面對奇異局勢,都必然失敗。第二種奇異局勢是(0,n,n),只要與對手拿走一樣多的物品,最後都將導致(0,0,0)。
搞定這個問題需要把必敗態的規律找出:(a,b,c)是必敗態等價於a^b^c=0(^表示異或運算)。
證明:(1)任何p(a,b,c)=0的局面出發的任意局面(a,b,c’);一定有p(a,b,c’)不等於0。否則可以得到c=c’。
(2)任何p(a,b,c)不等於0的局面都可以走向 p(a,b,c)=0的局面
(3)對於 (4,9,13) 這個容易驗證是奇異局勢
其中有兩個8,兩個4,兩個1,非零項成對出現,這就是尼姆和為 零的本質。別人要是拿掉13裡的8或者1,那你就拿掉對應的9 中的那個8或者1;別人要是拿 掉13裡的4,你就拿掉4裡的4; 別人如果拿掉13裡的3,就把10作分解,然後想辦法滿 足非零項成對即可。
3、推廣一:如果我們面對的是一個非奇異局勢(a,b,c),要如何變為奇異局勢呢?假設 a < b< c,我們只要將 c 變為 a^b,即可,因為有如下的運算結果: a^b^(a^b)=(a^a)^(b^b)=0^0=0。要將c 變為a^b,只從 c中減去 c-(a^b)
4、推廣二:當石子堆數為n堆時,則推廣為當對每堆的數目進行亦或之後值為零是必敗態。
5、練習:hdoj 1847
五、公平組合博弈(Impartial Combinatori Games)
1、定義:
(1)兩人蔘與。
(2)遊戲局面的狀態集合是有限。
(3)對於同一個局面,兩個遊戲者的可操作集合完全相同
(4)遊戲者輪流進行遊戲。
(5)當無法進行操作時遊戲結束,此時不能進行操作的一方算輸。
(6)無論遊戲如何進行,總可以在有限步數之內結束。
2、模型:給定一個有向無環圖和一個起始頂點上的一枚棋子,兩名選手交替的將這枚棋子沿有向邊進行移動,無法移動者判負。事實上,這個遊戲可以認為是所有公平組合遊戲(Impartial Combinatori Games)的抽象模型。其實,任何一個ICG都可以通過把每個局勢看成一個頂點,對每個局勢和它的子局勢連一條有向邊來抽象成這個“有向圖遊戲”。
3、解決思路:
現在,假定我們給出兩個遊戲G1 和 G2。如果我們只知道單個遊戲的P-狀態和N-狀態我們能夠正確地玩好遊戲和G1 + G2嗎?答案是否定的。不難看出兩個P-狀態的和總是P-狀態,P-狀態和N-狀態的和總是N-狀態。但是兩個N-狀態的和既可能是P-狀態也可能是N-狀態。因此,只知道單個遊戲的P-狀態和N-狀態是不夠的。
為了正確地玩好遊戲和我們需要推廣P-狀態和N-狀態,它就是Sprague-Grudy函式(或者簡稱為g函式)
4、Sprague-Grudy定理:
令N = {0, 1, 2, 3, ...} 為自然數的集合。Sprague-Grundy 函式給遊戲中的每個狀態分配了一個自然數。結點v的Grundy值等於沒有在v的後繼的Grundy值中出現的最小自然數.
形式上:給定一個有限子集 S ⊂ N,令mex S(最小排斥值)為沒有出現在S中的最小自然數。定義mex(minimal excludant)運算,這是施加於一個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
對於一個給定的有向無環圖,定義關於圖的每個頂點的Sprague-Garundy函式g如下:g(x)=mex{ g(y) | y是x的後繼 }。
5、性質:
(1)所有的終結點所對應的頂點,其SG值為0,因為它的後繼集合是空集——所有終結點是必敗點(P點)。
(2)對於一個g(x)=0的頂點x,它的所有後繼y都滿足g(y)!=0——無論如何操作,從必敗點(P點)都只能進入必勝點(N點)//對手走完又只能把N留給我們。
(3)對於一個g(x)!=0的頂點,必定存在一個後繼點y滿足g(y)=0——從任何必勝點(N點)操作,至少有一種方法可以進入必敗點(P點)//就是那種我們要走的方法。
6、應用:
(1)可選步數為1-m的連續整數,直接取模即可,SG(x) = x % (m+1);
(2)可選步數為任意步,SG(x) = x;
(3)可選步數為一系列不連續的數,用mex(計算每個節點的值)
7、練習:hdoj 1847 1536 3980
SG函式
給定一個有向無環圖和一個起始頂點上的一枚棋子,兩名選手交替的將這枚棋子沿有向邊進行移動,無法移 動者判負。事實上,這個遊戲可以認為是所有Impartial Combinatorial Games的抽象模型。 也就是說,任何一個ICG都可以通過把每個局面看成一個頂點,對每個局面和它的子局面連一條有向邊來抽象成這個“有向圖遊戲”。下 面我們就在有向無環圖的頂點上定義Sprague-Grundy函式。首先定義mex(minimal excludant)運算,這是施加於一個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。 對於一個給定的有向無環圖,定義關於圖的每個頂點的Sprague-Grundy函式g如下:g(x)=mex{ g(y) | y是x的後繼 }。 來看一下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的 定義的那三句話是完全對應的)。我們通過計算有向無環圖的每個頂點的SG值,就可以對每種局面找到必勝策略了。但SG函式的用途遠沒有這樣簡單。如果將有 向圖遊戲變複雜一點,比如說,有向圖上並不是只有一枚棋子,而是有n枚棋子,每次可以任選一顆進行移動,這時,怎樣找到必勝策略呢? 讓我們再來考慮一下頂點的SG值的意義。當g(x)=k時,表明對於任意一個0<=i<k,都存在x的一個後繼y滿足g(y)=i。也 就是說,當某枚棋子的SG值是k時,我們可以把它變成0、變成1、……、變成k-1,但絕對不能保持k不變。不知道你能不能根據這個聯想到Nim遊戲, Nim遊戲的規則就是:每次選擇一堆數量為k的石子,可以把它變成0、變成1、……、變成k-1,但絕對不能保持k不變。這表明,如果將n枚棋子所在的頂 點的SG值看作n堆相應數量的石子,那麼這個Nim遊戲的每個必勝策略都對應於原來這n枚棋子的必勝策略! 對於n個棋子,設它們對應的頂點的SG值分別為(a1,a2,…,an),再設局面(a1,a2,…,an)時的Nim遊戲的一種必勝策略是把ai 變成k,那麼原遊戲的一種必勝策略就是把第i枚棋子移動到一個SG值為k的頂點。這聽上去有點過於神奇——怎麼繞了一圈又回到Nim遊戲上了。 其實我們還是隻要證明這種多棋子的有向圖遊戲的局面是P-position當且僅當所有棋子所在的位置的SG函式的異或為0。這個證明與上節的Bouton’s Theorem幾乎是完全相同的,只需要適當的改幾個名詞就行了。 剛才,我為了使問題看上去更容易一些,認為n枚棋子是在一個有向圖上移動。但如果不是在一個有向圖上,而是每個棋子在一個有向圖上,每次可以任選一個棋子(也就是任選一個有向圖)進行移動,這樣也不會給結論帶來任何變化。 所以我們可以定義有向圖遊戲的和(Sum of Graph Games):設G1、G2、……、Gn是n個有向圖遊戲,定義遊戲G是G1、G2、……、Gn的和(Sum),遊戲G的移動規則是:任選一個子遊戲Gi 並移動上面的棋子。Sprague-Grundy Theorem就是:g(G)=g(G1)^g(G2)^…^g(Gn)。也就是說,遊戲的和的SG函式值是它的所有子游戲的SG函式值的異或。 再考慮在本文一開頭的一句話:任何一個ICG都可以抽象成一個有向圖遊戲。所以“SG函式”和“遊戲的和”的概念就不是侷限於有向圖遊戲。我們給每 個ICG的每個position定義SG值,也可以定義n個ICG的和。所以說當我們面對由n個遊戲組合成的一個遊戲時,只需對於每個遊戲找出求它的每個 局面的SG值的方法,就可以把這些SG值全部看成Nim的石子堆,然後依照找Nim的必勝策略的方法來找這個遊戲的必勝策略了! 回到本文開頭的問題。有n堆石子,每次可以從第1堆石子裡取1顆、2顆或3顆,可以從第2堆石子裡取奇數顆,可以從第3堆及以後石子裡取任意顆…… 我們可以把它看作3個子遊戲,第1個子遊戲只有一堆石子,每次可以取1、2、3顆,很容易看出x顆石子的局面的SG值是x%4。第2個子遊戲也是隻有一堆 石子,每次可以取奇數顆,經過簡單的畫圖可以知道這個遊戲有x顆石子時的SG值是x%2。第3個遊戲有n-2堆石子,就是一個Nim遊戲。對於原遊戲的每 個局面,把三個子游戲的SG值異或一下就得到了整個遊戲的SG值,然後就可以根據這個SG值判斷是否有必勝策略以及做出決策了。其實看作3個子遊戲還是保 守了些,乾脆看作n個子遊戲,其中第1、2個子遊戲如上所述,第3個及以後的子游戲都是“1堆石子,每次取幾顆都可以”,稱為“任取石子游戲”,這個超簡 單的遊戲有x顆石子的SG值顯然就是x。其實,n堆石子的Nim遊戲本身不就是n個“任取石子游戲”的和嗎? 所以,對於我們來說,SG函式與“遊戲的和”的概念不是讓我們去組合、製造稀奇古怪的遊戲,而是把遇到的看上去有些複雜的遊戲試圖分成若干個子游 戲,對於每個比原遊戲簡化很多的子游戲找出它的SG函式,然後全部異或起來就得到了原遊戲的SG函式,就可以解決原遊戲了。