//博弈是個好東西,可惜我不懂...所以最近惡補了一下...有點總結寫給自己看..順便分享一下求大佬賜教...
這裡要先說一下
必勝點(
p-positio)和
必敗點 (n-position)
必勝點和必敗點的概念:
p點:必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。
n點:必勝點,處於此情況下,雙方操作均正確的情況下必勝。
必勝點和必敗點的性質:
1、所有終結點是 必敗點 p 。(我們以此為基本前提進行推理,換句話說,我們以此為假設)
2、從任何必勝點n 操作,至少有一種方式可以進入必敗點 p。
3、無論如何操作,必敗點p 都只能進入 必勝點 n。
1.nim遊戲,nim遊戲從noip到noi到acm...都是最基礎最簡單的博弈...也是最經典的博弈...比如石子遊戲
n堆石子,兩個人輪流拿,可以拿一堆或者一堆中的一部分,最後誰不能操作誰就輸了
nim遊戲就是把這n堆石子分開考慮,考慮單獨一堆的遊戲情況,最後把n堆石子的遊戲最終情況異或一下就是最終結果
根據定義,證明一種判斷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.sprague-grundy定理(sg定理):
遊戲和的sg函式等於各個遊戲sg函式的nim和。這樣就可以將每乙個子遊戲分而治之,從而簡化了問題。而bouton定理就是sprague-grundy定理在nim遊戲中的直接應用,
因為單堆的nim遊戲 sg函式滿足 sg(x) = x。
sg函式:首先定義mex(minimal excludant)運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex=3、mex=0、mex{}=0。
對於任意狀態 x , 定義 sg(x) = mex(s),其中 s 是 x 後繼狀態的sg函式值的集合。如 x 有三個後繼狀態分別為 sg(a),sg(b),sg(c),那麼sg(x) = mex。 這樣 集合s 的終態必然是空集,所以sg函式的終態為 sg(x) = 0,當且僅當 x 為必敗點p時。
比如另一種石子遊戲
有1堆n個的石子,每次只能取個石子,先取完石子者勝利,那麼各個數的sg值為多少?
sg[0]=0,f=,
x=1 時,可以取走1 - f個石子,剩餘個,所以 sg[1] = mex= mex = 1;
x=2 時,可以取走2 - f個石子,剩餘個,所以 sg[2] = mex= mex = 0;
x=3 時,可以取走3 - f個石子,剩餘個,所以 sg[3] = mex = mex =1;
x=4 時,可以取走4- f個石子,剩餘個,所以 sg[4] = mex = mex = 2;
x=5 時,可以取走5 - f個石子,剩餘個,所以sg[5] = mex =mex = 3;
以此類推.....
x 0 1 2 3 4 5 6 7 8....
sg[x] 0 1 0 1 2 3 2 0 1....
由上述例項我們就可以得到sg函式值求解步驟,那麼計算1~n的sg函式值步驟如下:
1、使用 陣列f 將 可改變當前狀態 的方式記錄下來。
2、然後我們使用 另乙個陣列 將當前狀態x 的後繼狀態標記。
3、最後模擬mex運算,也就是我們在標記值中 搜尋 未被標記值 的最小值,將其賦值給sg(x)。
4、我們不斷的重複 2 - 3 的步驟,就完成了 計算1~n 的函式值。
如果當前狀態由幾個部分組成,那麼sg等於這幾個部分sg的異或值。
就和nim遊戲一樣,如果每堆有x個石子,那麼這一堆的sg值就是x,n堆的sg就是每堆sg的異或。
為什麼sg的值和nim和是一樣的呢?
我的理解是如果當前sg值為x,那麼它可以到達小於x的任何子狀態,就和拿石子是一樣的。但是也有可能到達比x更大的sg的子狀態,但是就算乙個人到達了這個sg更大的狀態,第二個人又可以把sg變回原來的值,所以是沒有影響的。最後遊戲結束時,總有乙個sg值是x的狀態不能到達更大的sg...
這裡給出一道題目:hdu1848
另一種石子遊戲,在基本規則不變的基礎上限制了每次能取的石子數量,但是本質上並沒有發生變化
#include #include using namespace std;
int f[10000];
int sg[10000]=;
int vis[10000];
void init() }}
int main()
博弈入門(Bash,Wythoff,Nimm)
rua,嘿嘿嘿,我開始學博弈啦 只有一堆n個物品,兩個人輪流從這堆物品中取物,規 定每次至少取乙個,最多取m個。最後取光者得勝。若n m 1,因為一次最多只能取m個物品,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。n k m 1 s,k為任意自然數,s m 那麼先取者要拿走...
博弈論入門
博弈論 是二人或多人在平等的對局中各自利用對方的策略變換自己的對抗策略,達到取勝目標的理論。博弈論是研究互動決策的理論。博弈可以分析自己與對手的利弊關係,從而確立自己在博弈中的優勢,因此有不少博弈理論,可以幫助對弈者分析局勢,從而採取相應策略,最終達到取勝的目的。一.bash博弈 問題 只有一堆n個...
博弈論入門
參考 三個簡單的博弈論問題 博弈 1066 bash遊戲 原題傳送 有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次最少拿1顆,最多拿k顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n和k,問最後誰能贏得比賽。例如n 3,k 2。無論a如何拿,b都可以拿到最...