博弈

先占个坑 等做了题再慢慢添加东西

先来个干货 大神的博弈小结

做个笔记:

规定: 利己状态定义为T(非奇异局势)

          利他状态定义为S(奇异局势)

重要结论: T可转化为(S,T),S只能转化为(T) 非奇异局势一定可以转化为奇异局势和非奇异局势,而奇异局势只能转化为非奇异局势

 

 博弈类题目小结(HDU,POJ,ZOJ)

 

经典博弈:

1.Bash Game 巴什博弈

有一堆数量为n的石子 2个人轮流取m(m>=1&&m<=n)个石子,取完者获胜

我们可以很容易的找到一个必败态 (下文必胜必败都是针对先手)即n=m+1时

因为无论先手取多少石子,后手都可以取完

然后我们可以假设一个必败态 n=(m+1)*k(k=1,2,3....)

证明:

当k=1时显然成立

当k=2时,无论先手取多少石块,后手都可以使状态达到n=m+1 即k=1的状态

当k=3时,无论先手取多少石块,后手都可以使状态达到n=(m+1)*2 即k=2时的状态

。。。

当k=x时,无论先手取多少石块,后手都可以使状态达到n=(m+1)*(x-1) 即k=x-1的状态

证毕,假设成立

由此我们可以得到一个结论 即 在Bash Game中

n=(m+1)*k(k=1,2,3...)先手必败

n=(m+1)*k+s(k=1,2,3...1=<s<=m) 先手必胜

 

2.Wythoff Game 威佐夫博弈(转自Demon

 

有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取完者得胜。这种情况下是颇为复杂的。

可以用两个数(a[k],b[k])(ps:(a[k]≤b[k])k为一个自然数)表示两堆物品的数量。如果该数量为奇异局势,那么先手输;

 前几个奇异局势如下:(0,0,)、(1,2)、(3,5)、(4,7)、(6,10)······起始值a[0]=b[0]=0;k=0;

可以看出a[k]是在之前未出现过的最小自然数,而b[k] = a[k]+k,k代表出现的第几个奇异局势;

 性质:

 1.任何自然数都包含在一个且仅有一个的奇异局势中。

 证明:若(a[k],b[k])为一个奇异局势,因为b[k]=a[k]+k,a[k]>a[k-1]  =》  b[k] >a[k-1]+k >a[k-1]+k-1 =》 b[k-1] > a[k-1].

 2.任何操作都会将奇异局势变成非奇异局势

 由性质1可知,即使是同时减少,两个数的差值不变,所以不可能成为其他奇异局势的差,因此也是非奇异局势;

 3.可采用适当的方法将非奇异局势变为奇异局势,那么下一个必输;

结论:两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。

那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?

我们有如下公式:a表示第一堆的个数,b表示第二堆的个数,c表示二者之差,当然a必须小于b;

再找规律的话我们会发现,a= c* 1.618 

而1.618 = (sqrt(5)+ 1) /  2 。

大家都知道0.618是黄金分割率。而威佐夫博弈正好是1.618,这就是博弈的奇妙之处!

HDU1527

AC代码 直接用1.618会wa 不知道为什么 还是用 (sqrt(5.0)+1.0)/2.0;

 1 #include "stdio.h"
 2 #include "cmath"
 3 #define min(a,b) a < b ? a : b
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int a,b,c,m;
 9     while(scanf("%d%d",&a,&b)!=EOF)
10     {
11         m=min(a,b);
12         int p=(int)(abs(a-b)*(sqrt(5.0)+1.0)/2.0);
13         printf("%d\n",m==p ? 0 : 1);
14     }
15     return 0;
16 }
View Code

 

 

3.Nimm Game 尼姆博弈

n堆石块 每堆xi块 每次可以取走一堆的任意块 或者同时取走2堆的数量相同的石头

这里可以用异或大家都知道 可是为什么可以用异或 在这里讨论一下

先了解一下异或运算--

异或又称做没有进位的加法 故名思意 例如二进制 1+1 = 10 不进位 则 1+1=(1) 0 == 0 ,1+0=1,0+1=1,0+0=0;

那么在尼姆博弈里异或 的意义是什么呢?

又异或性质可知,一个数异或本身等于0,也就是2个相同的数异或和为0,任意数异或0等于它本身

也就是说,在尼姆博弈里,如果出现了2个相同数量的石堆,那么他们之间异或等于0,也就是可以理解为2堆数量相同的石堆无论数量多少对博弈的结果没有影响 

如果还不太理解我们可以这样理解;

假设有n堆石块,且这n堆石块数量各不同,现在加入2堆数量相同的石块

现在单独讨论这2堆石块,假设在第一堆中 A为先手,且A最终拿完这一堆(无论中间过程怎么拿),然后在另一堆中变成了B为先手,显然在这一堆中B最终能拿完这一堆

现在回到整个博弈,B拿完第二堆的时候A变成了先手,是不是回到了最开始,感觉很神奇?其实不,仔细想一想是可以想明白的

同理出现过偶数堆的都对结果没有影响

posted on 2016-10-31 18:42  lazzzy  阅读(252)  评论(0编辑  收藏  举报

导航