博弈論(入門,持續更新)
博弈論(入門,持續更新)
博弈論
本篇只對尼姆博弈和巴什博弈進行介紹(其餘博弈遇到了再加進去)
定義 :博弈論,又稱為對策論(Game Theory)、賽局理論等,既是現代數學的一個新分
支,也是運籌學的一個重要學科。博弈論 是二人在平等的對局中各自利用對方的策略變換自己的
對抗策略,達到取勝的目的。
1,巴什博弈
巴什博弈:只有一堆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)%(m+1)==0則後手勝利
先手會重新決定策略,所以不是簡單的相反行的
例如n=15,m=3
後手 先手 剩餘
0 2 13
1 3 9
2 2 5
3 1 1
1 0 0
先手勝利 輸的人最後必定只抓走一個,如果>1個,則必定會留一個給對手
上面是百度百科的解釋,先手勝利的條件比較顯然,後手勝利的本質便是先手取任意數把原本(n)%
(m+1)==0的形式轉化為n=(m+1)r+s的形式,也就是把先手轉化為後手;原本後手變為先手;
例題:洛谷好像沒有巴什博弈的例題
從別的佬部落格裡搬運了幾道
2,尼姆博奕
有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取一個,多者不限,
最後取光者得勝。
這種情況最有意思,它與二進位制有密切關係,我們用(a,b,c)表示某種局勢,首先(0,0,
0)顯然是奇異局勢,無論誰面對奇異局勢,都必然失敗。第二種奇異局勢是(0,n,n),只要
與對手拿走一樣多的物品,最後都將導致(0,0,0)。仔細分析一下,(1,2,3)也是奇異局
勢,無論自己如何拿,接下來對手都可以將其變為(0,n,n)的情形。
計算機演算法裡面有一種叫做按位模2加,也叫做異或的運算,我們用符號⊕表示這種運算,先看
(1,2,3)的按位模2加的結果:
1 =二進位制01
2 =二進位制10
3 =二進位制11 ⊕
———————
0 =二進位制00 (注意不進位)
對於奇異局勢(0,n,n)也一樣,結果也是0。
任何奇異局勢(a,b,c)都有a⊕b⊕c =0。
注意到異或運算的交換律和結合律,及a⊕a=0,:
a⊕b⊕(a⊕b)=(a⊕a)⊕(b⊕b)=0⊕0=0。
所以從一個非奇異局勢向一個奇異局勢轉換的方式可以是:
1)使 a = c⊕b
2)使 b = a⊕c
3)使 c = a⊕b
證明可以看一下下面這位佬的部落格 連結
Anti-Nimm game (尼姆博弈的變形,反尼姆博弈)
以這道題為例洛谷 P4279 SHOI2008小約翰的遊戲
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int t;
int a[1000];
int ans;
int n;
int sum;
int main(){
cin>>t;
while(t){
t--;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ans=0;
sum=0;
for(int i=1;i<=n;i++){
ans^=a[i];
sum+=a[i];
}
if(sum==n){
puts(sum&1?"Brother":"John");
// cout<<endl; 注意puts自帶換行
}
else{
puts(ans?"John":"Brother");
// cout<<endl;
}
}
return 0;
}
我們考慮證明
分類討論再將相同情況合併
1 當每一堆的石子數都為1時,當堆數為奇數時先手輸,否則後手輸
2 當有且有一堆石子的個數>=2其餘均為單個石子時,我們可以通過調整使下一狀態下的全為單個石
子且數量可為奇數可為偶數,故,無論是誰,遇到這個狀態其必將勝利
3 當有至少2堆的石子數>=2
顯然石子必然要在減少的過程中由3狀態變為2狀態,
因為2狀態下存在大於等於2的那堆石子,所以可知2狀態下異或和一定大於0(存在較高位)
假設我們3狀態下異或和大於0,則我們可將下一狀態的異或和變為0或者仍然大於0(證明過程和尼姆
博弈的過程相同)
假設我們3狀態下異或和等於0,我們通過取石子,只能使下一狀態的異或和大於0,
我們已知2狀態下異或和大於0,所以當我們處於狀態3且異或和大於0時,我們可以通過調整使
下一狀態的異或和等於0,但下一狀態只能讓下下狀態的異或和大於0,所以當處於第三種情況時,
若異或和大於0,那麼先手一定勝利,等於0則先手失敗。
我們進行一下總結,由於第一種情況與後兩種情況無法進行合併,所以對第一種情況進行特判定
對2.3種情況進行合併,即大於0先手一定勝利。
證明完畢
完結撒花。
其實這只是博弈論很少一部分,本題好像由sj定理可以直接做?(但我不會)
sg函式也不會(sg函式的題很少),以後遇到再學吧.我還是太菜了(真);