博弈論入門

2022-01-10 11:52:48 字數 3677 閱讀 7805

古語有云,「笑人情似紙,世事如棋」。生活中每個人如同棋手,其每乙個行為如同在一張看不見的棋盤 上布子,精明慎重的棋手們相互揣摩、牽制、爭贏,下出諸多精彩紛呈、變化多端的棋局。而什麼是博 弈論?就是研究棋手們 的「出棋」 過程,從中抽象出可邏輯化的部分,並將其系統化的一門科學,也是運 籌學的乙個重要學科。

2:博弈是有限的。即無論兩人如何決策,都會在有限步決出勝負。

3:博弈是公平的。即兩人進行決策的規則相同。

1:bash博弈;2:nim博弈;3:威佐夫博弈;5:fibonacci博弈;6:sg函式;

例題:

#includeusing namespace std;

int c, m, n;//總捐款數,每次最多m

int main()

return 0;

}

hdu_1846

hdu_1847

證明1): 考慮極端情況, 當\(a1,a3,…,an\)全為0時, \(res=0\), 此時先手只能將偶數級台階往下搬, 後手只需要將先手從偶數級台階上搬下來的石子全部搬到下一級偶數級台階, 先手必敗。

2): 當\(res=x≠0\)時, 通過經典\(nim\)遊戲的證明, 我們知道一定有一種方法搬一定的石子到下一級讓後手面對res為0的局面。

3):當\(res=x=0\)且\(a\)不全為\(0\)時, 我們無法通過任何操作讓下乙個狀態的\(res\)也為\(0\)。

即對於\(res\)不為\(0\)的情況, 先手總能通過一定的操作讓後手面對\(res\)為\(0\)的情況,。

然而\(res\)為\(0\)時, 先手無論做什麼操作都無法讓後手面對\(res\)為\(0\)的情況。

那麼此刻我們就將題目轉化為在奇數台階上的經典nim遊戲。

思考題:

為什麼不用\(res=a_2∧a_4∧a_6∧,…,∧a_n=0\)(n為偶數)來判定勝負?

例題:

#includeusing namespace std;

const int maxn = 100 + 10;

int n, a[maxn], res;

int main()

if (res == 0) puts("0");

else

} return 0;

}

#includeusing namespace std;

int main()

if (res == 0) puts("bad luck!");

else puts("i win!");

} return 0;

}

#include#include#includeusing namespace std;

const int n = 1000 + 10;

int a[n];

int main()

else for (int i = 2; i <= n; i += 2)

ans ^= (a[i] - a[i - 1] - 1);

if (ans) printf("georgia will win\n");

else printf("bob will win\n");

} return 0;

}

#includeusing namespace std;

const int maxn = 1e3 + 10;

int a[maxn];

int n, k;

int main()

else

if(res) puts("alice");

else puts("bob");}}

return 0;

}

證明•首先考慮最(zhao)極(gui)端(lv)的情況, (0, 0), (1, 2), (3, 5)局面為先手必敗局面。而且這樣的數字對被稱為奇異局勢。

奇異局勢的定義如下:

接下來我們看奇異局勢的幾個性質:

例題

#includeusing namespace std;

int n, m;

bool check(int n, int m)

void work()

//第二個模組 我們求出當前n的奇異局勢, 如果m比他大 拿走就行 //如果m比他小我們求出(x, n) 然後拿走m

}}

int main()

}return 0;

}

證明:

例題:

#includeusing namespace std;

typedef long long ll;

unordered_mapmp;

ll f[50];

void fib()

}

int main()

sg函式:

結論:

例題

#include#define ms(a,b) memset(a,b,sizeof a)

using namespace std;

const int maxn = 1e3 + 100;

int n, num;

int sg[maxn];

int head[maxn], ver[maxn], nxt[maxn], tot;

void add(int u, int v)

int getsg(int x) ;

for (int i = head[x]; i; i = nxt[i])

for (int i = 0; i < n; ++i)

if (!vis[i]) return sg[x] = i;// mex運算

return 0;

}void init()

int main()

} while (cin >> num && num)

if (res) puts("win");

else puts("lose");

} }}

#includeusing namespace std;

const int maxn = 1e4 + 10;

int s[maxn], sg[maxn];

int k;

void init()

int getsg(int x)

for(int i = 0; ; i++)

if(!vis[i]) return sg[x] = i;

return 0;

}

int main()

if(res) cout << "w";

else cout << "l";

}cout << endl;

}return 0;

}

【博弈論】關於三姬分金(五海盜分贓)的博弈論問題分析

acm集訓隊講解

博弈論入門

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

博弈論入門

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

博弈論入門

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