常用的4個博弈論演算法
巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈
只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取m個。最後取光者得勝。
顯然,如果n=m+1,那麼由於一次最多只能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現了如何取勝的法則:如果n=(m+1)r+s,(r為任意自然數,s≤m),那麼先取者要拿走s個物品,如果後取者拿走k(≤m)個,那麼先取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以後保持這樣的取法,那麼先取者肯定獲勝。
#include
#include
#include
#include
#include
using
namespace
std;
int main()
return
0;
}
講解 後來補上 。。。。
這種博弈比前面一種要稍微複雜一點。我們來看下下面這個遊戲。
有兩堆火柴棍,每次可以從某一堆取至少1根火柴棍(無上限),或者從兩堆取相同的火柴棍數。最後取完的是勝利者。
只要記住公式:a[i] = i*(1+√5)/2 b[i] = a[i]+i;
我們用a[i]表示失敗態中的第乙個,b[i]表示失敗態中的第二個.(i從0開始).
#include
#include
#include
#include
#include
#include
using
namespace
std;
int main()
return
0;
}
指的是這樣的乙個博弈遊戲,目前有任意堆石子,每堆石子個數也是任意的,雙方輪流從中取出石子,規則如下:
1)每一步應取走至少一枚石子;每一步只能從某一堆中取走部分或全部石子;
2)如果誰取到最後一枚石子就勝。
判斷當前局勢是否為必勝(必敗)局勢:
把所有堆的石子數目用二進位制數表示出來,當全部這些數按位異或結果為0時當前局面為必敗局面,否則為必勝局面;
#include
using
namespace
std;
int temp[ 20 ]; //火柴的堆數
int main()
return
0;
}
有一堆個數為n的石子,遊戲雙方輪流取石子,滿足:
1)先手不能在第一次把所有的石子取完;
2)之後每次可以取的石子數介於1到對手剛取的石子數的2倍之間(包含1和對手剛取的石子數的2倍)。
約定取走最後乙個石子的人為贏家,求必敗態。
這個遊戲叫做斐波那契博弈,肯定和斐波那契數列:f[n]:1,2,3,5,8,13,21,34,55,89,… 有密切的關係。如果試驗一番之後,可以猜測:先手勝當且僅當n不是斐波那契數。換句話說,必敗態構成斐波那契數列。
fib[0]=1;
fib[1]=2;
for(i=2;i<45;i++) //假設有最多有45個人
fib[i]=fib[i-1]+fib[i-2];
while(scanf("%d",&n)&&n)
if(i<45)
printf("second win\n");
else
printf("first win\n");
} return
0;
}
ACM之博弈論總結
現在自己做 博弈論的題目也做了很長時間了,自己把自己做過的題目和感覺常出現的型別總結一下。1.巴十博弈 這個是最基本的博弈型別。公式很簡單,n m 1 0?lost win 變式 最少取p個,最多去q if n p q 0 printf win n else if n p q p printf lo...
acm博弈論基礎
一 bash game 巴什博弈 一堆n個物品,兩個人輪流從中取出1 m個,最後取光者勝 不能繼續取的人輸 1,分析 首先n一定可以表示為 n k m 1 r 0 r m 二 wythoff game 威佐夫博弈 有兩堆各若干物品,兩個人輪流從任意一堆中至少取出乙個或者從兩堆中取出同樣多的物品,規定...
ACM博弈論基礎
博弈論的題目有如下特點 有兩名選手 兩名選手交替操作,每次一步,每步都在有限的合法集合中選取一種進行 在任何情況下,合法操作只取決於情況本身,與選手無關 遊戲敗北的條件為 當某位選手需要進行操作時,當前沒有任何可以執行的合法操作 下面介紹幾個經典的博弈。一堆n個物品,兩個人輪流從中取出1 m個,最後...