博弈論小結

2021-06-05 18:43:18 字數 3906 閱讀 2497

博弈論,今天算是告一段落了。

①博弈模型為兩個人輪流決定的非合作博弈,即兩個人輪流進行決策,並且每次都會採用最優策略。

②博弈模型必須是有限布可以完成的。

③對兩個人的規則是公平的。

p狀態(必敗態)

:前乙個選手(previous player)將取勝的位置稱為必敗點。 

n狀態(必勝態):乙個選手(next player)將取勝的位置稱為必勝點。

①將所有終止狀態定義為p狀態

②將所有可以一步到達p狀態的點,定義為n狀態

③如果存在某個狀態,它的下一步都是n狀態,定義為p狀態

④迴圈②,③步驟 一)

巴什博奕(bash game):

只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取m個。最後取光者得勝。

判斷條件:n%(m+1),不為零時獲勝。第一步取走n%(m+1)個,然後根據第二個人所取數目k,跟著他取走(m+1-k)個即可。 二)

威佐夫博奕(wythoff game):

有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取乙個,多者不限,最後取光者得勝

判斷條件:使用(ak,bk)來表示兩個堆裡面的物品數,則p狀態滿足:ak=k*[(1+√5)/2],bk=ak+k,(k=0,1,2,3......);

三)尼姆博奕(nimm game)簡稱nim模型:

有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。

判斷條件:使用(a1,a2,a3)來描述所處狀態,ans=a1^a2^a3,如果ans為零則為p狀態。

定理1:nim遊戲的乙個狀態(x1, x2, x3) 是p狀態,當且僅當x1+x2+x3=0。多與三個狀態一樣滿足該定理

定理的證明自己網上找。

自己的理解:nim模型,為多種情況相同處理的並,而且處理只能是取走任意顆石子

四)sprague-grundy函式(簡稱sg函式)

:有n堆石子,每次可以從第1堆石子裡取1顆、2顆或3顆,可以從第2堆石子裡取奇數顆,可以從第3堆及以後石子裡取任意顆,最後取光著得勝。

首先來了解一下什麼為sg函式,對於乙個遞增有界的圖g(x,f)來說,sg函式g,是定義在x上的函式,函式值是非負整數,使得g(x)的值等於所有x的後繼的sg函式中沒有出現的最小非負整數。對於遞增有界的圖,sg函式是唯一的、有界的。所有的終止狀態x,因為f(x)是空集,所以g(x)=0.

根據定義,考慮以下三點:

如果x是終止狀態,那麼g(x)=0。

乙個狀態x,如果g(x)≠0,那麼一定存在乙個x的後繼y,使得g(y)=0。

乙個狀態x,如果g(x)=0,那麼所有x的後繼y,都有g(y)≠0。

這三句話表明,頂點x所代表的position是p-position當且僅當g(x)==0.

計算出所有情況的sg值,最後求異或g(g)=g(g1)^g(g2)^g(g3)........,當g(g)==0時為p狀態。

定理2:

設g=g1+g2+…+gn,gi的sg函式是gi,i=1, 2, …, n。那麼g的sg函式g(x1, x2, …, xn)=g1(x1)+g2(x2)+…+gn(xn),加法表示nim和,即不進製的二進位制加法。

自己的理解:sg模型,為多種情況不同處理的並,每次都需要求一次g函式,處理可以隨便進行

5)補充:階梯博弈:n個階梯,階梯上有一些石子,要求將階梯上的石子都放到地上,操作只能是從第i個階梯取若干個石子到第i-1上

判斷條件:對只需要對奇數號碼的階梯進行nim運算即可。

先取者使狀態到p狀態,如果後面乙個人也從奇數號碼階梯取石子,則按照nim步驟操作即可,從奇數階梯到偶數階梯相當於取出石子扔掉。若從偶數號碼階梯取石子,則先取者只需要將相同的石子從個該階梯傳到下面乙個即可。

這裡有詳細介紹:

尋找必敗態——一類博弈問題的快速解法

這其實也是每類博弈題最先考慮的問題,或者突破點所在。

theory初步,對兩個定理有詳細的證明

遊戲函式

組合博弈知識彙總,這個部落格裡面有很多的補充

hdoj1846,題型①

//ac,最簡單的博弈題

#include int main()

return 0;

}

poj1067,題型②

//取石子遊戲---威佐夫博奕(wythoff game)

#include #include int main()

int k=b-a;

if(a==(int)(k*t))

printf("0\n");

else

printf("1\n");

} return 0;

}

hdoj1850,nim模型

//nim組合博弈問題

#include const int nmax=1000000+10;

int m,n[nmax];

int main()

return 0;

}//第二種解法

#include #include const int nmax=1000+10;

int a[10];

int g[nmax];

void init()

int main()

return 0;

}

hdoj1536,再來乙個sg函式問題加深一下印象

#include #include const int mmax=105,nmax=10005;

int k,m,n;

int s[mmax],h[mmax];

int g[nmax];

bool h[nmax][mmax];//從②處可得知,二維陣列的大小。

void init()

int f(int n)

int main()

return 0;

}

poj1704,階梯博弈

/*

思路:階梯博弈

建模:將兩個棋子之間的位置數看做石子堆,棋子向左移動看做從左側石子堆向右側石子堆轉移。

所以該題可轉換成階梯博弈模型進行求解。

*/#include #include const int nmax=1010;

int t,n,p[nmax];

int cmp(const void *a,const void *b)

int main()

printf("%s\n",ans==0?"bob will win":"georgia will win");

}}

hdoj1517,尋找失敗類自己找出規律來

/*

思路:尋找失敗類

這道題是自己做出來的好興奮啊,原來wa,

通過測試特殊資料找出了程式細節處理上的錯誤

*/#include int op(long long n)

int main()

while(n>18) n=op(n);

if(n>1 && n<=9)

printf("stan wins.\n");

else

printf("ollie wins.\n");*/

//或者

while(n>18) n=op(n);//因為這裡在n=18時候會停止迴圈,邊界處理沒有明確,1<=n<=18;

if(n<=9)

printf("stan wins.\n");

else

printf("ollie wins.\n");

} return 0;

}

博弈論小結

孤單堆的根數異或只會影響二進位制的最後一位,但充裕堆會影響高位 非最後一位 乙個充裕堆,高位必有一位不為0,則所有根數異或不為0。故不會是t態。定理5 s0態,即僅有奇數個孤單堆,必敗。t0態必勝。證明 s0態,其實就是每次只能取一根。每次第奇數根都由己取,第偶數根都由對 方取,所以最後一根必己取。...

博弈論小結

博弈論問題一般是,兩人都採取最優的策略進行博弈,判讀兩人勝負。博弈論一般分為以下幾種 這只是一篇結論性的文章。不會證明 必勝態 當前狀態按照最優策略一定必勝。必敗態 相反,就是必敗態。p position 先手必敗。上次move的人有必勝策略。即這次move的人必敗。n position 先手必勝。...

博弈論學習小結

最近學習了一下博弈論的一些知識,也做了一些題目,下面本人對三種比較基本的博弈知識作如下小結 1 巴什博奕 給對手留下 m 1 的倍數即可勝。如一堆n個物品,最多取m個,最少1個 if n m win else if n m 1 m n m 1 1 win else lose 2 威佐夫博奕 兩堆物品...