博弈論入門

2021-10-08 21:00:30 字數 3620 閱讀 6476

斐波那契博弈(fibonacci's game)

威佐夫博弈(wythoff game)

尼姆博弈(nimm game)

畫p/n分析

簡單學了博弈論,推導難度大。先了解了幾個經典的博弈論和p/n分析法。sg函式,打算後面再學。

博弈論:是二人或多人在平等的對局中各自利用對方的策略變換自己的對抗策略,達到取勝目標的理論。博弈論是研究互動決策的理論。博弈論可以分析自己與對手的利弊關係,從而確立自己在博弈中的優勢,因此有不少博弈理論,可以幫助對奕者分析局勢,從而採取相應策略,最終達到取勝的目的。

在演算法競賽中博弈論往往有以下特徵:

1.有兩名選手

2.兩名選手交替操作,每次一步,每步都是在有限的合法集合中選擇一種進行

3.在任何情況下,合法操作只取決於情況本身,與選手無關

4.遊戲選手敗北條件:當某位選手進行操作時,當前沒有任何可以執行的合法操作

一堆n個物品,兩個人從輪流中取出(1~m)個,最後取光者勝(不能繼續取的人輸)

思路:同餘定理n=k*(m+1)+r,先取者首先拿走r,那麼後者無論拿走(1~m)多少,先者只需要拿和後者拿走的總數為m+1即可,那麼先手必贏;否則先手必輸。

hdu1846

#include

using

namespace std;

int t;

intmain()

else

printf

("first\n");

}}

hdu 2188

#include

using

namespace std;

intmain()

}

傳送門

#include

using

namespace std;

intmain()

else

}}

參考

一堆n(n>=2)的石子,遊戲雙方輪流取石子,規則如下:

先手不能在第一次把石頭取完,至少取1個

之後每一次取石頭至少為1,至多為剛剛對手的二倍

取走最後乙個石頭的人為贏家,求必敗態

當n等於fibonacci時必敗.我們把一堆石子看成k堆和k-1堆,後手取完k-1堆後,先手不能一下子取完k堆,後手仍可以取得最後一顆。

當n不等於fibonacci時必勝.

齊肯多夫定理:任何正整數可以表示為若干個不連續的fibonacci數之和

n=f[a1]+f[a2]+…+f[ap],a1>a2>…>ap,f[a(p-1)]>2*f[ap].我們令先手取完f[ap],後手只能選擇f[a(p-1)],且不能取完。對於以後的每一堆,先手都可以取這一堆的最後一顆石子,從而獲得遊戲的勝利

hdu 2516

#include

using

namespace std;

const

int maxn=50;

int f[maxn+10]

;void

init()

intmain()

}if(flag)

printf

("second win\n");

else

printf

("first win\n");

}}

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

參考

奇異局勢:當甲面對奇異局勢時,甲會輸掉比賽。

所以面對非奇異局勢,先手必勝;否則,後手勝

前幾個奇異局勢是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)…

可以看出ak是前面沒有出現的最小自然數,bk=ak+k。具體求解公式:a[k]=k*(1+√5)/2,b[k]=k*(3+√5)/2

奇異局勢的性質:

1.任何自然數都包含在乙個且僅有的乙個奇異局勢中

2.任何操作都可以將奇異局勢變為非奇異局勢

3.採用適當操作可以將非奇異局勢變為奇異局勢

由betty理論…

最後得出a=[øi],b=[(ø+1)i],其中ø=(sqrt(5)+1)/2為**分割比

poj1067

#include

#include

#include

#include

using

namespace std;

intmain()

}

n堆物品,兩人輪流取,每次取某堆取任意,至少乙個,最後取完者勝。

結論:將n堆物品數量全部異或後結果為0則必敗,否則必勝。

顯然(0,0,0)、(0,n,n),(1,2,3)是奇異局勢。

任何奇異局勢a ^ b ^ c=0。

非奇異局勢如何轉化為奇異局勢:c - a ^ b

hdu1850

若有三堆物品a b c ,a ^ b = ans ,如果c >= ans , 我們在c中抽出x個個物品使得a ^ b ^ (c -x ) = 0 ,就是一種方法。推廣到n。

#include

using

namespace std;

const

int maxn=

200;

int a[maxn]

;int

main()

printf

("%d\n"

,sum);}

return0;

}

hdu 2147

參考

題意:乙個n*m的方格,一枚硬幣在(1,m),誰將硬幣移動到(n,1)誰就贏。每次移動只能走左、下、左下。

思路:畫出p/n分析圖,也就是當前對手如果在(x,y),你是否可以保證贏,從(n,1)一點一點往上推即可

#include

using

namespace std;

intmain()

else

printf

("wonderful!\n");

}}

hdu 1847

通過畫p/n分析得,

1 2 3 4 5 6 7

n n p n n p n

#include

using

namespace std;

intmain()

return0;

}

博弈論入門

博弈論 是二人或多人在平等的對局中各自利用對方的策略變換自己的對抗策略,達到取勝目標的理論。博弈論是研究互動決策的理論。博弈可以分析自己與對手的利弊關係,從而確立自己在博弈中的優勢,因此有不少博弈理論,可以幫助對弈者分析局勢,從而採取相應策略,最終達到取勝的目的。一.bash博弈 問題 只有一堆n個...

博弈論入門

參考 三個簡單的博弈論問題 博弈 1066 bash遊戲 原題傳送 有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次最少拿1顆,最多拿k顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n和k,問最後誰能贏得比賽。例如n 3,k 2。無論a如何拿,b都可以拿到最...

博弈論入門

什麼是博弈 通俗地講,博弈就是指遊戲中的一種選擇策略的研究。博弈的英文為 game 我們一般將它翻譯成 遊戲 而在英語中,game 的意義不同於漢語中的遊戲,它是人們遵循一定規則的活動,進行活動的人的目的是讓自己 贏 我們在和對手競賽或遊戲的時候怎樣使自己贏呢?這不但要考慮自己的策略,還要考慮其他人...