(转)博弈 SG函数
此文為以下博客做的摘要:
https://blog.csdn.net/strangedbly/article/details/51137432
----------------------------------------------------------------------------------------
1、定義P-position和N-positon
P表示Previous,N表示Next。
即上一個(gè)移動(dòng)的人有必勝策略的局面是P-position,“先手必?cái) 被颉昂笫直貏佟?#xff0c;現(xiàn)在移動(dòng)的人有必勝策略的局面是N-positon,“后手必?cái) 被颉跋仁直貏佟?。下面為更?yán)謹(jǐn)?shù)亩x:
1、無法進(jìn)行任何移動(dòng)的局面(即terminal position)是P-position;
2、可以移動(dòng)到P-position的局面是N-position;
3、所有移動(dòng)都導(dǎo)致N-position的局面是P-position。
根據(jù)定義,不重現(xiàn)局面,那么positions的集合可以進(jìn)行拓?fù)渑判?#xff0c;并且能通過定義判斷為P-position還是N-position。
2、Nim游戲
對(duì)于一個(gè)Nim游戲的局面(a1, a2, ...an),它是P-position當(dāng)且僅當(dāng) a1^a2^...^an = 0,其中 ^ 表示異或運(yùn)算。
要證明這個(gè)定理,基本上是證明這種運(yùn)算符合上述position的定義。即證明三個(gè)命題:1、這個(gè)判斷將所有無法移動(dòng)的局面判為P-position;2、被判為N-position的局面一定可以移動(dòng)到某個(gè)P-position;3、被判為P-position的局面無法移動(dòng)到某個(gè)P-position。
第一個(gè)命題:無法移動(dòng)的局面只有全為0,即異或仍為0。
第二個(gè)命題:對(duì)于某個(gè)局面(a1,a2,...,an),若a1^a2^...^an!=0,一定存在某個(gè)合法的移動(dòng),將ai改變成ai'后滿足a1^a2^...^ai'^...^an=0。不妨設(shè)a1^a2^...^an=k,則一定存在某個(gè)ai,它的二進(jìn)制表示在k的最高位上是1(否則k的最高位那個(gè)1是怎么得到的)。這時(shí)ai^k<ai一定成立。則我們可以將ai改變成ai'=ai^k,此時(shí)a1^a2^...^ai'^...^an=a1^a2^...^an^k=0。
第三個(gè)命題:對(duì)于某個(gè)局面(a1,a2,...,an),若a1^a2^...^an=0,一定不存在某個(gè)合法的移動(dòng),將ai改變成ai'后滿足a1^a2^...^ai'^...^an=0。因?yàn)楫惢蜻\(yùn)算滿足消去率,由a1^a2^...^an=a1^a2^...^ai'^...^an可以得到ai=ai'。所以將ai改變成ai'不是一個(gè)合法的移動(dòng)。證畢。
3、Sprague-Grundy函數(shù)
首先給出這個(gè)函數(shù)適用范圍,貌似所有博弈的題目都是符合這個(gè)范圍?,F(xiàn)在來研究似乎更為一般的游戲:給定一個(gè)有向無環(huán)圖和一個(gè)其實(shí)頂點(diǎn)上的一枚棋子,兩名選手交替將這棋子沿有向邊移動(dòng),無法移動(dòng)者判負(fù)。事實(shí)上,這個(gè)游戲可以認(rèn)為是所有Impartial Combinatorial Games的抽象模型。即任何一個(gè)ICG都可以通過把每個(gè)局面看成一個(gè)頂點(diǎn),對(duì)每個(gè)局面和它的子局面連一條有向邊來抽象成這個(gè)“有向圖游戲”。
首先定義mex(minimal excludant)運(yùn)算,這是施加于一個(gè)集合的運(yùn)算,表示最小的不屬于這個(gè)集合的非負(fù)整數(shù)。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
對(duì)于一個(gè)給定的有向無環(huán)圖,定義關(guān)于圖的每個(gè)頂點(diǎn)的Sprague-Garundy函數(shù)g如下:g(x)=mex{ g(y) | y是x的后繼 }。
來看一下SG函數(shù)的性質(zhì)。首先,所有的terminal position所對(duì)應(yīng)的頂點(diǎn),也就是沒有出邊的頂點(diǎn),其SG值為0,因?yàn)樗暮罄^集合是空集。下面為原作圖
(pic1)
對(duì)于一個(gè)g(x) = 0的頂點(diǎn)x,它的所有后繼 y 都滿足 g(y) != 0。
對(duì)于一個(gè)g(x) != 0的頂點(diǎn),必定存在一個(gè)后繼 y 滿足 g(y) = 0。
即頂點(diǎn) x 代表的position為P-position,當(dāng)且僅當(dāng) g(x) = 0。相應(yīng)地N-position為 g(x) != 0。所以有向無環(huán)圖的每個(gè)頂點(diǎn)SG值能夠計(jì)算出來,就能找到每種局面的必勝策略。但SG函數(shù)的用途遠(yuǎn)沒有這么簡單。如果將有向圖游戲變復(fù)雜,比如,有向圖上不止有一枚棋子,而是有n枚,每次可以人選一顆移動(dòng),這時(shí)怎么找必勝策略?
?
考慮一下頂點(diǎn)的SG值的意義。當(dāng)g(x) = k時(shí),表明對(duì)于任意一個(gè) 0 <= i < k,都存在x的一個(gè)后繼 y 滿足g(y) = i。即當(dāng)某棋子的SG值為k時(shí),我們可以把它變成0、變成1、……、變成k-1,但絕對(duì)不能保持k不變。這類似于Nim游戲,Nim游戲的規(guī)則就是:每次選擇一堆數(shù)量為k的石子,可以把它變成0、變成1、……、變成k-1,但絕對(duì)不能保持k不變。這表明,如果將n枚棋子所在的頂點(diǎn)的SG值看作n堆相應(yīng)數(shù)量的石子,那么這個(gè)Nim游戲的每個(gè)必勝策略都對(duì)應(yīng)于原來這n枚棋子的必勝策略!
對(duì)于n個(gè)棋子,設(shè)它們對(duì)應(yīng)的頂點(diǎn)的SG值分別為(a1,a2,...,an),再設(shè)局面(a1,a2,...,an)時(shí)的Nim游戲的一種必勝策略是把a(bǔ)i變成k,那么原游戲的一種必勝策略就是把第i枚棋子移動(dòng)到一個(gè)SG值為k的頂點(diǎn)。其實(shí)我們還是只要證明這種多棋子的有向圖游戲的局面是P-position當(dāng)且僅當(dāng)所有棋子所在的位置的SG函數(shù)的異或?yàn)?。這個(gè)證明與上面的Bouton's Theorem幾乎是完全相同的,只需要適當(dāng)?shù)母膸讉€(gè)名詞就行了。
剛才,為了使問題看上去更容易一些,認(rèn)為n枚棋子是在一個(gè)有向圖上移動(dòng)。但如果不是在一個(gè)有向圖上,而是每個(gè)棋子在其對(duì)應(yīng)的有向圖上,每次可以任選一個(gè)棋子(也就是任選一個(gè)有向圖)進(jìn)行移動(dòng),這樣也不會(huì)給結(jié)論帶來任何變化。
?
所以我們可以定義有向圖游戲的和(Sum of Graph Games):設(shè)G1、G2、……、Gn是n個(gè)有向圖游戲,定義游戲G是G1、G2、……、Gn的和(Sum),游戲G的移動(dòng)規(guī)則是:任選一個(gè)子游戲Gi并移動(dòng)上面的棋子。Sprague-Grundy Theorem就是:g(G)=g(G1)^g(G2)^...^g(Gn)。也就是說,游戲的和的SG函數(shù)值是它的所有子游戲的SG函數(shù)值的異或。
?
任何一個(gè)ICG都可以抽象成一個(gè)有向圖游戲。所以“SG函數(shù)”和“游戲的和”的概念就不是局限于有向圖游戲。我們給每個(gè)ICG的每個(gè)position定義SG值,也可以定義n個(gè)ICG的和。所以說當(dāng)我們面對(duì)由n個(gè)游戲組合成的一個(gè)游戲時(shí),只需對(duì)于每個(gè)游戲找出求它的每個(gè)局面的SG值的方法,就可以把這些SG值全部看成Nim的石子堆,然后依照找Nim的必勝策略的方法來找這個(gè)游戲的必勝策略了!(Nim其實(shí)就是n個(gè)從一堆中拿石子的游戲求SG的變型,總SG=n個(gè)sg的異或)。(very important)
?
有n堆石子,每次可以從第1堆石子里取1顆、2顆或3顆,可以從第2堆石子里取奇數(shù)顆,可以從第3堆及以后石子里取任意顆……我們可以把它看作3個(gè)子游戲,第1個(gè)子游戲只有一堆石子,每次可以取1、2、3顆,很容易(看下圖pic2)看出x%4==0時(shí)處于P局面,即x顆石子的局面的SG值是x%4,(即把pic2中的值改成原值%4)。第2個(gè)子游戲也是只有一堆石子,每次可以取奇數(shù)顆,經(jīng)過簡單的畫圖可以知道這個(gè)游戲有x顆石子時(shí)的SG值是x%2。第3個(gè)游戲有n-2堆石子,就是一個(gè)Nim游戲。對(duì)于原游戲的每個(gè)局面,把三個(gè)子游戲的SG值異或一下就得到了整個(gè)游戲的SG值,然后就可以根據(jù)這個(gè)SG值判斷是否有必勝策略以及做出決策了。其實(shí)看作3個(gè)子游戲還是保守了些,干脆看作n個(gè)子游戲,其中第1、2個(gè)子游戲如上所述,第3個(gè)及以后的子游戲都是“1堆石子,每次取幾顆都可以”,稱為“任取石子游戲”,這個(gè)超簡單的游戲有x顆石子的SG值顯然就是x。其實(shí),n堆石子的Nim游戲本身不就是n個(gè)“任取石子游戲”的和嗎?
(pic2)
所以,對(duì)于我們來說,SG函數(shù)與“游戲的和”的概念不是讓我們?nèi)ソM合、制造稀奇古怪的游戲,而是把遇到的看上去有些復(fù)雜的游戲試圖分成若干個(gè)子游戲,對(duì)于每個(gè)比原游戲簡化很多的子游戲找出它的SG函數(shù),然后全部異或起來就得到了原游戲的SG函數(shù),就可以解決原游戲了。
以下是本文最重要的部分:
解題模型:
1.把原游戲分解成多個(gè)獨(dú)立的子游戲,則原游戲的SG函數(shù)值是它的所有子游戲的SG函數(shù)值的異或。
? ? ? ?即sg(G)=sg(G1)^sg(G2)^...^sg(Gn)。
2.分別考慮沒一個(gè)子游戲,計(jì)算其SG值。
? ? ?SG值的計(jì)算方法:(重點(diǎn))
? ? ??1.可選步數(shù)為1~m的連續(xù)整數(shù),直接取模即可,SG(x) = x % (m+1);
2.可選步數(shù)為任意步,SG(x)?= x;
3.可選步數(shù)為一系列不連續(xù)的數(shù),用模板計(jì)算。
模板1:打表
1 //f[], 可以取走的石頭個(gè)數(shù) 2 //sg[],SG函數(shù)值 3 //mex[],mex{} 4 int f[MAXN], sg[MAXN], mex[MAXN]; 5 void getSG(int n) 6 { 7 int i, j; 8 memset(sg, 0, sizeof(sg)); 9 for(i = 1;i <= n;++i) 10 { 11 memset(mex, 0, sizeof(mex)); 12 for(j = 1;f[j] <= i;++j) 13 mex[sg[i - f[j]] = 1; 14 for(j = 0;j <= n;++j) 15 if(mex[j] == 0) 16 { 17 sg[i] = j; 18 break; 19 } 20 } 21 }模板2:DFS
//s[i] 數(shù)組要從小排到大,SG函數(shù)要初始化為 -1, 每個(gè)集合只需初始化一遍 //n是集合s 的大小,s[i]是定義的特殊取法規(guī)則的數(shù)組 int s[105], sg[10005], n; //memset(sg, -1, sizeof(sg)); //sort(s, s + n); int SG_dfs(int x) {int i;if(sg[x] != -1)return sg[x];bool vis[105];memset(vis, 0, sizeof(vis));for(i = 0;i < n;++i){if(x >= s[i]){SG_dfs(x - s[i]);vis[sg[x - s[i]] = 1;//mex{} }}int e;for(i = 0;;++i)if(!vis[i]){e = i;break;}return sg[x] = e; }首選打表,實(shí)在不行才用DFS。
3.計(jì)算sg(G)=sg(G1)^sg(G2)^...^sg(Gn),sg(G)=0,即P-Position,即先手必?cái) ?/strong>
?
--------------------------------------------------------------------------------------------
原博主下面還有題,另外也開了一篇寫題的博客
轉(zhuǎn)載于:https://www.cnblogs.com/shuizhidao/p/9271712.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的(转)博弈 SG函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为快应用引擎架构及开发实践
- 下一篇: [BZOJ1833][ZJOI2010]