寫這篇博客之前,花了許久時間來搞這個SG函數,倒是各路大神的論文看的多,卻到底沒幾個看懂的。還好網上一些大牛博客還是性價比相當高的,多少理解了些,也自己通過做一些題加深了下了解。
既然是博弈,經典的NIM游戲不得不提一下,這也是要不斷提醒自己別忘了NIM游戲才是SG函數由來的核心關鍵!
1. 若干堆石頭。
2. 甲和乙輪流從任意堆中取任意個石頭。
3. 誰不能取就輸。
分析:
對於一個博弈來說,P-position表示previous,代表先手必敗,即后手必勝,N-position表示next,代表先手必勝,后手必敗。
兩個博弈的結論:
若當前狀態為N,至少存在下一個能達到的狀態是P。(1)
若當前狀態為P,則所有下一個能達到的狀態是N。(2)
顯然(0, 0, ..., 0)為必勝態N
憑借這樣,因此我們可以通過記憶化搜索可以搜出答案,但是時間復雜度是n!級別的。因此需要更高效的方法來解決NIM問題。
》》》Bouton's Theorem
對於一個Nim游戲的局面(a1, a2, ..., an),它是P-position當且僅當a1 xor a2 xor... xor an=0
簡要證明:
顯然(0, 0, ..., 0)為必敗態。
可歸納證明
A)對於P-position局面(a1, a2, ..., an)滿足a1 xor a2 xor... xor an=0,對於所有合法的移動,
不妨設為新局面(a1-x, a2, ..., an),則
(a1-x) xor a2 xor ... xor an
=(a1-x) xor a2 xor ... xor an xor a1 xor a1
=(a1-x) xor a1!=0(其中a1>x)。
故滿足結論(2)
B)對於N-position局面滿足a1 xor a2 xor... xor an=k!=0,則存在一個移動使得新局面(a1', a2', ..., an')有a1' xor a2' xor... xor an'=0。因為{ak}中存在ai的二進制在k的最高位上為1,否則k的最高位不能得到,將ai變為ai xor k(<ai),有 a1 xor a2 xor ... xor an xor ai xor k = 0。
故滿足結論(1)
故若Nim游戲局面滿足博弈的兩個結論,故存在必勝/必敗態及必勝態的必勝步驟。
至此,Nim游戲得到基本解決。
接下來才是重頭菜!
引入SG函數,SG(x)=mex{SG(y) | x->y },其實就是狀態x能轉移到y。
SG是表示當前局面的狀態(a1,a2,...,an)的一種狀態(自然數集合)的函數。有點暈—。—
mex(Y)表示非Y集合中最小的自然數。例如mex(0,2)=1,mex(1,3)=0。
此前每次看到很多相關博客引入SG函數都很突兀,憑什么要這樣定義mex(),還有SG到底是什么東西?而后都是好像以這兩個為基礎給出SG的性質,證明之類,看得也似懂非懂。我也不能十分保證我能夠講明白這個高深的理論,如果發現有錯,歡迎大牛們指正!
還是從Nim游戲引入一下這個SG,或者說SG的核心就是Nim游戲,先看看有什么作用。
(如果發現看不太懂,回去看看SG的定義)
只考慮一堆石頭的情況,
SG(0)=0(因為(0)沒有后繼,所以自然SG(0)=0)
SG(1)=mex(SG(0)=0)=1
SG(2)=mex(SG(0)=0,SG(1)=1)=2
...
SG(n)=n
當然一維Nim游戲比較特殊,才有SG(n)=n
考慮兩堆的話,
SG(0,0)=0
SG(1,0)=SG(0,1)=mex(SG(0,0)=0)=1
SG(2,0)=SG(0,2)=mex(SG(0,0)=0,SG(1,0)=1)=2
SG(1,1)=mex(SG(0,1)=1)=0 //開始有點感覺了嗎?
SG(2,1)=SG(1,2)=mex(SG(1,1)=0,SG(2,0)=2,SG(0,1)=1)=3
...
從二維的數據上可以歸納出,SG(a,b)=a^b
更多的,想必也能猜出來吧,其實就是之前討論Nim游戲的結論,所以我才斗膽說SG核心來源於Nim,事實真相倒是不大清楚,相關中文資料確實少。
想必現在應該有點感覺吧,SG的本質應該是將n維Nim游戲映射到1維Nim游戲。
想想,每個n維狀態對應的1維狀態SG,則其狀態就和1維相同,可以變為SG-1,SG-2,,,,,1,0,故先手每次都可以將其變成0,而這相當於這一次的1維Nim游戲勝利,而只要能把這個狀態保持下去,那么最終就一定能夠勝利,也就是說n維Nim游戲就贏了。
此外異或這真是很神奇的運算。
至此,Nim游戲的結論已經是毋庸置疑,而SG的含義也明白了,而SG的求法卻有些模糊,為什么SG(x)=mex(SG(y) | x->y) ?
要注意到,SG函數的應用遠遠不局限於Nim游戲,Nim游戲只是SG的一個根基吧?拓展出來的問題更是千變萬化。
我們先來看一個看似更為普遍的問題,實際上是Nim游戲的變性。
對於有向無環圖,一個起點處有一個棋子,兩個人輪流移動棋子一步,誰先到達終點誰就勝利。
我們依然套用SG函數模型(SG(x)=mex(SG(y) | x->y) )來看,(現在狀態x就是棋子所在位置)
SG函數應該滿足一下兩個條件:
A)SG(x)為0當且僅當當前局面x為P-position
B)SG(x)不為0當且僅當當前局面x為N-position
要注意到SG函數是遞歸求出來的
若單純從該有向圖博弈游戲來看,滿足
a)若SG(x)=b!=0,對於任意a∈N && a<b,均存在節點x能夠達到的節點y滿足SG(y)=a (從SG定義可知)
b)若SG(x)=b,若x為終點,則當前局面為P-position
若x非終點,則對於任意節點x能夠到達的節點y滿足SG(x)!=b
因此只需遞歸算出起點的SG值,接着判斷起點的SG是否為0,即可判斷當前局面是N/P-position。
可以看出,上述兩點都是由SG函數的定義得到,這就是SG函數這樣定義的直接原因!當然你可能還是不清楚這樣定義的根本原因。
對於該博弈游戲已經得到解決,但是如果是n個這樣的博弈游戲合並起來呢?
對於有向無環圖,n個起點處有棋子,兩個人輪流移動一個棋子一步,誰無法移動就失敗。
單單靠SG函數依然是可以計算出來的,但是你實際上還是只用到SG函數是否為0,而對於其SG非0的值的意義沒有利用到。
其實對比Nim游戲模型:
a)若SG(x)=b,對於任意a∈N && a<b,均存在x能夠達到的狀態y滿足SG(y)=a.
b)若SG(x)=b,若狀態x為(0, 0, ..., 0),則當前局面為P-position
若狀態x非(0, 0, ..., 0),則對於任意x能夠達到的狀態y,均有SG(y)!=b.
可以發現上面兩個游戲實際上是一致的。
這樣就能夠套用Bouton's Theorem對有向圖博弈游戲進行運算,即SG(a1,a2,...an)=SG(a1) xor SG(a2) xor ... xor SG(an) ,這才是SG函數如此定義的最終目的,讓它能夠轉化為Nim游戲。
從而這個博弈問題即可輕松通過n個棋子的SG值進行異或,求出整個游戲的SG值,判斷是否為0即可。
是不是一下子將一個復雜的問題得到大大的簡化?
接下來證明SG(x)在多個博弈游戲組合起來時的一個整體博弈游戲依然滿足滿足 a)& b):
首先能轉化成Nim游戲模型的游戲,其SG值滿足:
SG(a1,a2,...an)=SG(a1) xor SG(a2) xor ... xor SG(an)
在這個基礎上,
a)即證明x=(a1, a2, ..., an)=>y=(a1', a2', ..., an')下 有SG(y)=a (所有a∈N && a<b),取k=a xor b,顯然存在SG(ai)的二進制在k的最高位上為1,取SG(ai’)=SG(ai) xor k,則SG(a1', a2', ... , an')=SG(a1) xor SG(a2) xor ... xor SG(an) xor k = a 。
得證
b) 若b)不成立,則對於任意x,均存在能夠達到的狀態y,有SG(y)=b,則有 SG(a1) xor SG(a2) xor ... xor SG(an) = 0 ,設狀態y為(a1', a2, ..., an) 有 SG(a1') xor SG(a2) xor ... xor SG(an)=b ,由異或滿足消去率,a1=a1',與SG定義矛盾。
得證
當然上述還需要數學歸納法來證明
詳細的證明參見 王曉珂《解析一類組合游戲》
小結:
SG函數的真正目的是將復雜的博弈問題分解成一個個獨立的博弈問題之后,通過SG函數將其轉化為一個個Nim游戲,然后利用Bouton's Theorem求出整個博弈問題的解。這也就是Sprague-Grundy定理。SG函數的定義就是根據Nim游戲的性質構造出來的一個函數,可以將普通的博弈問題轉化為Nim問題,而Nim問題一定有解,故相應博弈問題也一定有解。
這些題目進行鞏固以加深了解博弈論知識》》》博弈論相關題目
除此之外,今后還將繼續更新此文,擴充一些必要的拓展。
推薦的幾篇相關大牛博客(比起那些生澀的論文好太多):
必讀論文:
《GAME THEORY》——Thomas S. Ferguson