ACM 关于博弈问题,看这里就够了!

一、什么是博弈?

博弈:有若干堆物体(可以是火柴棍或是围棋子等等)两个人轮流从堆中取物体若干,规定最后取光物体者取胜。

  1. 由于博弈双方都能做出最优决策,所以游戏刚开始就意味着结束(好惨,一点游戏体验都没有~),因此博弈能否胜利取决于当前的局面
  2. 局面是博弈里面最最最重要的东西!!!(所谓SG也是指这一局面的SG),因为双方均采取最优策略,故而局面必然会以双方当前对自己最优的路径走下去,所以结局已经确定了,每个局面也是固定的
  3. 因此为了得到最优决策,我们可以从最后已得到胜负的局面逆推而来(也就是从一个已知胜负的局面一步步推导其他的局面,有了这样的思想,SG也就相对好理解,即递推思想)
  4. 必胜点和必败点
    P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败。
    N点:必胜点,处于此情况下,双方操作均正确的情况下必胜。
  5. 必胜点和必败点的性质:
    1、所有终结点是 必败点 P 。(我们以此为基本前提进行推理,换句话说,我们以此为假设)
    2、从任何必胜点N 操作,至少有一种方式可以进入必败点 P。
    3、无论如何操作,必败点P 都只能进入 必胜点 N。

二、Sprague-Grundy定理(SG定理)

1.SG值:一个不等于它的后继点的SG值的且大于等于零的最小整数。
后继点:也就是按照题目要求的走法(比如取石子可以取的数量,方法)能够走一步达到的那个点。挑程里对SG值的解释:除任意一步所能转移到的子局面的SG值以外的最小非负整数。从这可以看出这里对SG的定义是递归定义的。

2.SG的作用。通过递归求出每一个局面为胜态还是败态 若sg[x] = 0,那么x是败态

3.总堆的SG函数值等于各个堆的SG函数值的Nim和(异或和)。Bouton定理就是Sprague-Grundy定理在Nim游戏中的直接应用,因为单堆的Nim游戏 SG函数满足 SG(x) = x。


SG函数

mex(minimal excludant)运算:表示最小的不属于这个集合的非负整数。

例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。里面存放的是该点后继点的SG值的集合。对于任意状态 x , 定义 SG(x) = mex(S),其中 S 是 x 后继状态的SG函数值的集合。如x有三个后继状态分别为SG(a),SG(b),SG( c)

那SG(x) = mex{SG(a),SG(b),SG( c) }。这样 集合S 的终态必然是空集,所以SG函数的终态为 SG(x) = 0,当且仅当 x 为必败点P时。


【实例】取石子问题

1堆n个的石子,每次只能取{ 1, 3, 4 }个石子,先取完石子者胜利,那么各个数的SG值为多少?
SG[0]=0,f[]={1,3,4},
x=1 时,可以取走1 - f{1}个石子,剩余{0}个,所以 SG[1] = mex{ SG[0] }= mex{0} = 1;
x=2 时,可以取走2 - f{1}个石子,剩余{1}个,所以 SG[2] = mex{ SG[1] }= mex{1} = 0;
x=3 时,可以取走3 - f{1,3}个石子,剩余{2,0}个,所以 SG[3] = mex{SG[2],SG[0]} = mex{0,0} =1;
x=4 时,可以取走4- f{1,3,4}个石子,剩余{3,1,0}个,所以 SG[4] = mex{SG[3],SG[1],SG[0]} = mex{1,1,0} = 2;
x=5 时,可以取走5 - f{1,3,4}个石子,剩余{4,2,1}个,所以SG[5] = mex{SG[4],SG[2],SG[1]} =mex{2,0,1} = 3;

以此类推……

x 0 1 2 3 4 5 6 7 8.

SG[x] 0 1 0 1 2 3 2 0 1.

由上述实例我们就可以得到SG函数值求解步骤,那么计算1~n的SG函数值步骤如下:

1、使用 数组f 将 可改变当前状态 的方式记录下来。

2、然后我们使用 另一个数组 将当前状态x 的后继状态标记。

3、最后模拟mex运算,也就是我们在标记值中 搜索 未被标记值 的最小值,将其赋值给SG(x)。

4、我们不断的重复 2 - 3 的步骤,就完成了 计算1~n 的函数值。

三。巴什博奕(Bash Game)(同余理论)

定义:只有 一堆 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)的倍数,就能最后获胜。这个游戏还可以有两种变相的玩法:

  • 1.减法博弈 两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。
  • 2.初始状态下有石子n个,除最后一次外其他每次取物品个数必须在[p,q]之间,最后一次取硬币的人输。(HDU 2897 邂逅明下)这题状态稍微复杂一些,并且胜负条件与之前相反,一般bash博弈里每次取个数可以看作在[1,m]之间,胜负手判断为 n %
    (1+m)。因此我们可以猜想每次取[p,q]的胜负手判断为 n % (p+q),通过验证猜想我们可以发现如下策略:
1.n=k∗(p+q)时,先手第一次取 q 个,随后的回合若后手取 x 个,先手再取 p+q−x个,那么最后就会留给后手 p 个,先手胜**2.n=k∗(p+q)+s时,则要分情况考虑:
若 s 在[1,p]之间,先手取 x,后手可以取 p+q−x,最后留给先手 s 个,后手胜;
若 s 在(p,p+q)之间,先手任取 x 个 (1≤s−x
比如16个硬币 [p,q]=[3,5]
先手取5个,后手无论取多少,先手都能够把硬币数目限制到3.
如果有9(s=1<3)个呢?先手无论取多少个,后手都可以把数目限制到<3;
当然如果有12(s=3)个 先手任取x<s个,都可以转化为s在[1,p]之间,让后手先取的情况。

四.尼姆博弈(Nimm Game)(异或理论)

定义:有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。

以三堆物品为例:我们用(ak, bk, ck)(ak ≤ bk ≤ ck,k=0,1,2,…,n)表示三堆物品的数量并称其为局势,无论谁面对局势(0,0, 0),都已经输了,这种局势我们称为奇异局势。

奇异局势有如下三条性质:

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

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

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

本题(0,n,n)也是一个奇异局势,只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(1,2,3)也是奇异局势,无论对手如何拿,接下来都可以变为(0,n,n)的情形。

计算机算法里面有一种叫做按位模2加,也叫做异或的运算,我们用符号(+)表示这种运算。这种运算和一般加法不同的一点是1+1=0。先看(1,2,3)的按位模2加的结果:

1 =二进制01
2 =二进制10
3 =二进制11 (+)
———————
0 =二进制00 (注意不进位)

对于奇异局势(0,n,n)也一样,结果也是0。

任何奇异局势(a,b,c)都有a(+)b(+)c =0。

如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设 a < b < c,我们只要将c变为 a(+)b,即可,因为有如下的运算结果: a(+)b(+)(a(+)b)=(a(+)a)(+)(b(+)b)=0(+)0=0。要将c 变为a(+)b,只要从 c中减去 c-(a(+)b)即可。

例1。(14,21,39),14(+)21=27,39-27=12,所以从39中拿走12个物体即可达到奇异局势(14,21,27)。

例2。(55,81,121),55(+)81=102,121-102=19,所以从121中拿走19个物品就形成了奇异局势(55,81,102)。

例3。(29,45,58),29(+)45=48,58-48=10,从58中拿走10个,变为(29,45,48)。

例4。我们来实际进行一盘比赛看看:

:(7,8,9)->(1,8,9)奇异局势
乙:(1,8,9)->(1,8,4):(1,8,4)->(1,5,4)奇异局势
乙:(1,5,4)->(1,4,4):(1,4,4)->(0,4,4)奇异局势
乙:(0,4,4)->(0,4,2):(0.4,2)->(0,2,2)奇异局势
乙:(0,2,2)->(0,2,1):(0,2,1)->(0,1,1)奇异局势
乙:(0,1,1)->(0,1,0):(0,1,0)->(0,0,0)奇异局势
甲胜。
  1. 令 s = a1^a2^a3….^an(^符号表示异或运算)
  2. 若 s = 0,则此局面为败态,否则为胜态
  3. 无论是胜态还是败态,当从一个石堆拿走一些石头(即改变一个ai,改变量大于等于1),一定会发生胜态和败态的转变。当他与sg结合, 我们发现sg异或和为0的状态也是败态,否则胜态。

结论就是:把每堆物品数将其转化为二进制形式并全部异或起来,如果得到的值为0,那么先手必败,否则先手必胜。代码模板

五.威佐夫博弈(Wythoff’s Game)(黄金分割)

有两堆各若干的物品,两人轮流从其中一堆取至少一件物品,至多不限,或从两堆中同时取相同件物品,规定最后取完者胜利。

这里的必输局势:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)直接说结论了,若两堆物品的初始值为(x,y),且x < y,则令z=y-x;记w=(int)[((sqrt(5)+1)/2)*z ];若w=x,则先手必败,否则先手必胜。

其中出现了黄金分割数(1+√5)/2 = 1.618…,因此,由ak,bk组成的矩形近似为黄金矩形,由于2/(1+√5)=(√5-1)/2,可以先求出j=[a(√5-1)/2],若a=[j(1+√5)/2],那么a = aj,bj = aj + j,若不等于,那么a = aj+1,bj+1 = aj+1+ j + 1,若都不是,那么就不是奇异局势。然后再按照上述法则进行,一定会遇到奇异局势。代码模板

发布了186 篇原创文章 · 获赞 13 · 访问量 9288

猜你喜欢

转载自blog.csdn.net/csyifanZhang/article/details/105263021
今日推荐