博弈论(入门,持续更新)
博弈论
本篇只对尼姆博弈和巴什博弈进行介绍(其余博弈遇到了再加进去)
定义 :博弈论,又称为对策论(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函数的题很少),以后遇到再学吧.我还是太菜了(真);