1. 程式人生 > >博弈論的演算法總結

博弈論的演算法總結

  開頭先囉嗦一句:想學好博弈,必然要花費很多的時間,深入學習,不要存在一知半解,應該是一看到題目,就想到博弈的型別。

以及,想不斷重複不斷重複,做大量各大oj網站的題目,最後吃透它。

博弈:

  博弈論又被稱為對策論(Game Theory),既是現代數學的一個新分支,也是運籌學的一個重要學科。

博弈,具體的例子就是下棋,雙方都考慮最有利於自已的步驟,但是最終必有一方輸,一方贏。

  博弈的策略:參與者在行動之前所準備好的一套完整的行動方案,就是想好下完這步棋,對方會如何下,

以及接下來該如何下,最終得出結果。

常見的博弈有以下:

1.博弈:合作博弈和非合作博弈
   合作博弈:指參與者能夠達成一種具有約束力的協議,在協議範圍內選擇有利於雙方的策略
   非合作博弈:指參與者無法達成這樣一種協議
2.博弈:靜態博弈和動態博弈
   靜態博弈:指在博弈中,參與者同時選擇,或雖非同時選擇,但是在邏輯時間
                   上是同時的。(期末老師評分與同學給老師評分)
   動態博弈:指在博弈中,參與者的行動有先後順序,且後行動者能夠觀察
                   到先行動者的行動。(下棋)
3.博弈:完全資訊博弈與不完全資訊博弈
   完全資訊博弈:指在博弈中,每個參與者對其他參與者的型別,策略空間及損益函式都有準確的資訊。(賣家與買家)
   不完全資訊博弈:總有一些資訊不是所有參與者都知道的
4.博弈:零和博弈與非零和博弈
   零和博弈:指博弈前的損益總和與博弈後的損益總和相等
   非零和博弈:指博弈後的損益大於(小於)博弈前的損益總和(正和或負和 )

下面我主要講一些關於比賽中用到的博弈型別:

首先你要理解必勝狀態和必敗狀態:

  對下先手來說,

  一個狀態是必敗狀態當且僅當它的所有後繼都是必敗狀態。

  一個狀態是必勝狀態當且僅當它至少有一個後繼是必敗狀態。

  就是說,博弈者,一旦捉住了勝利的把柄,必然最後勝利。

博弈中常常用到的:

  兩個數,不用中間變數實現交換。
  a b;
  a = a^b;
  b = a^b;
  a = a^b;

巴什博弈:

百度百科:

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

  顯然,如果n=m+1,那麼由於一次最多隻能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現瞭如何取勝的法則:如果n=(m+1)r+s,(r為任意自然數,s≤m),那麼先取者要拿走s個物品,如果後取者拿走k(≤m)個,那麼先取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以後保持這樣的取法,那麼先取者肯定獲勝。總之,要保持給對手留下(m+1)的倍數,就能最後獲勝。這個遊戲還可以有一種變相的玩法:兩個人輪流報數,每次至少報一個,最多報十個,誰能報到100者勝。對於巴什博弈,那麼我們規定,如果最後取光者輸,那麼又會如何呢?(n-1)%(m+1)==0則後手勝利

先手會重新決定策略,所以不是簡單的相反行的 例如n=15,m=3 後手 先手 剩餘 0 2 13 1 3 9 2 2 5 3 1 1 1 0 0 先手勝利 輸的人最後必定只抓走一個,如果>1個,則必定會留一個給對手 請去刷一下的題目,均是巴什博弈 HDU1846  HDU1847   HDU2147  HDU2149  HDU2188 HDU2897

威佐夫博弈:

  一定要去百度百科上面,先理解透意思。

  下面是一些威佐夫博弈的總結:

  威佐夫博弈(Wythoff's game):有兩堆各若干個物品,兩個人輪流從某一堆取至少一個或同時從兩堆中取同樣多的物品,規定每次至少取一個,多者不限,最後取光者得勝。 這種情況下是頗為複雜的。我們用(a[k],b[k])(a[k] ≤ b[k] ,k=0,1,2,...,n)(表示兩堆物品的數量並稱其為局勢,如果甲面對(0,0),那麼甲已經輸了,這種局勢我們稱為奇異局勢。 前幾個奇異局勢是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。注:k表示奇異局勢的序號, 第一個奇異局勢k=0。 可以看出,a[0]=b[0]=0,a[k]是未在前面出現過的最小自然數,而 b[k]= a[k] + k。  

設當前局勢為(a,b); a <= b
①a==b:同時從兩堆取走a個石子,轉化為(0,0)
②a==a[k]&&b>b[k]:從第二堆取走b−b[k]個石子,轉化為(a,b[k])
③a==a[k]&&b<b[k]:同時從兩堆取走a−a[b−a]個石子,轉化為(a[b−a],b−a+a[b−a])
④a>a[k]&&b==b[k]:從第一堆取走a−a[k]個石子,轉化為(a[k],b)
⑤a<a[k]&&b==b[k]:若a==a[j] (j<k),則從第二堆取走b−b[j]個石子,轉化為(a,b[j]);

  否則必有a==b[j](j<k)a==b[j](j<k),則從第二堆取走b−a[j]b−a[j]個石子,轉化為(a[j],a)

  例如5  8 ,5>a(8-5)=a3=4  8>b(8-5)=b3=7 從兩堆中取走a-a(b-a)=5-4=1個,變成奇異局勢(4,7)。

  例如4 6 ,4>a(6-4)=a2=3  6>b(6-4)=b2=5 從兩堆中取走a-a(b-a)=4-3=1個,變成奇異局勢(3,5)。

  可以理解成變成差為b-a的奇異局勢。

如果a=bk並且b-a!=k,則從b堆中取走b-ak個,變成奇異局勢(ak,bk).

  例如,5 10 ,5=b2 10-5=5!=2 則從10中取走10-a2=10-3=7個,變成奇異局勢(3,5)。

為什麼要b-a!=k呢?例如7 10 , 7=a3,10-7=3=k 也可以變成奇異局勢(4,7)。但這已經在4)判斷過了。

  奇異局勢就是當你面臨這種情況的時候,你必然是輸的,反之,你必贏。   (a,b),a,b兩堆物品的重量,此處是b>a;   解題的技巧:   if a > b , 交換兩個值。   c = b-a;   c = (int)(c*((根號5)+1)/2)   if(c == b)  先手必輸   else 先手必贏   題目: HDU1527  HDU2177特別要注意HDU2177這道題目。

尼姆博弈(Nimm Game):

尼姆博弈指的是這樣一個博弈遊戲:  有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能從一堆物品中取部分或全部物品,最少取一件,  取到最後一件物品的人獲勝。

結論就是:把每堆物品數全部異或起來,如果得到的值為0,那麼先手必敗,否則先手必勝。

  可以參考這個網站,https://blog.csdn.net/u011644423/article/details/37870703。

  經典題目:http://acm.hdu.edu.cn/showproblem.php?pid=2176