博弈论

博弈论

一般情况下有以下特点:

1.两人轮流进行决策,并且两人都使用最优策略来获得胜利

2.有限的。无论两个人怎样决策,都有胜负之分

3.遵循的游戏规则相同,公平性

p.s.博弈大概就是双方绞尽脑汁想营造出一种能让自己赢的局面的鬼畜玩意,反正不是什么善良的东西(战术耸肩)

巴什博弈

题干:

一堆石子有n个,两个人轮流从这堆石子中取1~m个石子,最后取完的人获胜。

分析:

1.当 n <= m 的时候,先手必胜,因为一次就可以取完

2.当n == m + 1 的时候,由于先手最多一次拿走m个,所以无论先手拿走多少个,后手都可以一次性拿走剩下的所有石子,所以后手胜。推而广之,当n % (m + 1) == 0 的时候,先手必败

3.可以将n写成 n == (m + 1) * r + s的形式。对于先手玩家,我们可以先取走s个,给对方造成剩下(m + 1)的整数倍的形式。此时假设对手取走k个,那我们就一定可以做到取走(m + 1 - k)个,此时剩下的是(m + 1)*(r - 1)个,那么给对方剩下的就又是(m + 1) 的整数倍个,以此类推,我们就可以保证先手取胜

结论:

当n % ( m + 1) == 0时,后手必胜;当n % ( m + 1) != 0 时,先手必胜。

核心代码:

if (n % (m + 1))  
    return false ;
else  
    return true ;

威佐夫博弈

题干:

有两堆各若干个石子,两个人轮流从某一堆或者两堆中取同样多的物品,规定每次至少取1个,多了不限,我们规定取走最后一个石子的人为胜者。

分析:

令两堆石子的个数分别是A,B,并且A <= B。

先手必败局势:

1.(0,0): 先手必败,这个不做解释

2.(1,2):先手必败,具体分析一下有几种取法

​ · 先手取第一堆中的1个,后手取第二堆中的2个

​ · 先手从第一堆第二堆中各取1个,后手拿走剩下的1个

​ · 和第一种情况相反

​ · 和第二种情况相反

and so on.

还有其他的先手必败的局势,例如(3,5),(4,7)等等,最后都能转化成(0,0)或者(1,2)的局势

我们将先手必败的局势的集合,称为奇异局势。

奇异局势有如下性质:

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

2.任意操作都可以将奇异局势变为非奇异局势

3.采用适当的方法也可以将非奇异局势变为奇异局势

进而通过仔细分析,由肉眼观察可得结论

(Betty定理的证明可自行了解 https://blog.csdn.net/g21glf/article/details/87888285

结论:

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

人话说法:若两堆物品的初始值为(x,y),且x < y ,则令z = y - x。令k = (int)[((sqrt(5) + 1) / 2) * z] .若k = x , 那么先手必败,否则先手必胜。

核心代码:

double r = (sqrt(5) + 1) / 2;
int d = abs(a - b) * r;
if (d != min(a, b))  //也可以先用if判断a,b的大小
    return true ;
else  
    return false ;

p.s.要是a,b非常大的话,需要利用高精度来计算double类型的r(但是这种题型应该不好碰知道就行了23333)

斐波那契博弈

题干:

有一堆个数为n的石子,游戏双方轮流取石子,满足:

1.先手不能再第一次把所有石子取完

2.之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间,包括1和对手取的石子数的2倍。
约定取走最后石子的人为胜者。

分析:

需要前置条件——齐肯多夫定理:任何正整数可以表示为若干个不连续的斐波那契数之和,ex,n = 4 = 1 + 3

即,假如先手取1个,那么后手能取的石子数在1-2之间,这个时候无论后手取1或者2个石子,剩下的石子数目只有1或者2两种情况,也就是会造成先手必胜的局势。

先手必败的话以5为例就可,不多赘述自行理解。

更详细的戳这里

https://blog.csdn.net/dgq8211/article/details/7602807

结论:

当且仅当n不是斐波那契数的时候,先手必胜;若n是斐波那契数,先手必败

核心代码:

f[0] = f[1] = 1;
for (int i = 0 ; f[i - 1] < n; ++i)
{
    f[i] = f[i - 1] + f[i - 2];
    if (f[i] == n)  
        return true ;
}
return false ;

尼姆博弈

题干:
有n堆若干个石子,每堆有若干个,两人轮流从某一堆中取任意个石子,最少1个多了不限,我们约定取走最后一个石子的人为胜者。

分析:

所有的石子被取走是一个必败局面,此时存在A1 XOR A2 XOR A3 XOR ... XOR An == 0

对于任意的局面,如果A1 XOR A2 XOR A3 XOR ... XOR An == x != 0,设x的二进制表示下的最高位1在第k位,那么至少存在一堆石子Ai,他的第k位是1。显然Ai XOR x < Ai,我们从第Ai堆取走若干石子,使其变为Ai XOR x , 就得到了一个每个堆石子数量异或起来等于0的局面。

对于任意一个局面,如果A1 XOR A2 XOR A3 XOR ... XOR An == 0,那么无论如何取石子,得到的局面下的各堆石子异或起来都不等于0。

以上都基于Bouton定理先手能够在非平衡尼姆博弈中取胜,而后手能够在平衡的尼姆博弈中取胜。

接下来是鬼扯:

当每堆石子的个数都是0的时候,必然是先手必败。如果只有1堆,先手必胜(这当然是废话)

现在我们假设只有2堆石子,这两堆石子的个数相同,这个时候先手必败,不多赘述自行理解

现在假设3堆石子,2堆石子个数一样,剩下的1堆个数不一样,例如(1,1,3),这个时候先手必胜(因为先手可以拿走数目与其他两堆不一样的那堆,这个时候后手转化为先手)

(1,1,1)的话也是先手必胜

接下来和二进制结合到一起

假设两堆石子的数量分别是7和5,那么他们的二进制是111和101,现在我们进行二进制拆分,111 = 100 + 10 + 1, 101 = 100 + 1,现在我们把它当做5堆石子,其中有2堆石子的数目为1,2堆为4,1堆为2。所以在数目为4和1的各2堆中先手必输。所以我们可以将他们直接进行归零。

现在我们看异或,7 XOR 5 = 2 ,这个2是去除了所有二进制拆分后数量相等的石子堆之后还剩余的石子,这个时候先手必胜

接下来无论多少堆石子我们都可以简化为2堆石子来看,所以不多赘述

结论:

尼姆博弈在当且仅当A1 XOR A2 XOR A3 XOR ... XOR An != 0的条件下,先手必胜。

核心代码:

int res = 0;
for (int i = 1 ; i <= n ; ++ i)
    res ^= arr[i] ;
if (res)  
    return true ;
else  
    return false ;

SG函数

先了解这么几个概念:

有向图游戏:

给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替讲这枚棋子沿着有向边进行移动,无法移动者判败

mex运算(https://en.wikipedia.org/wiki/Mex_(mathematics)):

简单来说,就是给一个非负整数集合S,mex(S)为求出不属于集合S的最小非负整数的运算,例如mex(0,1,2,4,5) = 3

SG函数:

在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1,y2,y3...定义SG(x)为x的后继节点y1,y2,...yk的SG函数值构成的集合再执行mex运算的结果。特别的,整个有向图游戏G的SG函数值被定义为有向图游戏起点s是的SG函数值,即SG(G) = SG(s)

有向图游戏的和:

设G1,G2,...Gm是m个有向图游戏。定义有向图游戏G,它的行动规则是任选某个有向图游戏Gi,并在Gi上行动一步。G被称为有向图游戏G1,G2...Gm的和。有向图游戏的和的SG函数值等于她包含的各个子游戏SG函数的异或值,即个个游戏SG函数的尼姆和。

安利博客,详细戳此:https://www.cnblogs.com/ECJTUACM-873284962/p/6921829.html#undefined?tdsourcetag=s_pcqq_aiomsg

结论

有向图游戏的某个局面必胜,当且仅当该局面对应的节点的SG函数值大于0;有向图游戏的某个局面必败,当且仅当该局面对应节点的SG函数值大于0

可以这样理解:

· 在一个没有出边的节点上,棋子不能移动,她的SG值为0,必败局面

· 在一个节点的某个后继节点SG值为0,在mex运算之后,该节点的SG值大于0,这等价于,若一个局面的后继局面中存在必败局面,则当前的局面为必胜局面

· 若一个节点的后继节点的SG值均不为0,在mex运算之后,该节点的SG值等于0,若一个局面的后继局面全部为必胜局面,则当前局面为必败局面

对于若干个有向图游戏的和,其证明方法与尼姆博弈类似

上一篇:Codeforces Round #167 (Div. 1) E. Dima and Game


下一篇:[ACW]893集合-Nim游戏