Bash's Game(巴什博弈)
【描述】只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取1个,最多取m个,最后取光者得胜。
【策略】如果 n = (m + 1) * r + s ,(r为任意自然数,s≤m),即n%(m+1) != 0,则先取者肯定获胜。因为,如果n=(m+1)r + s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
【另一种问法】两个人轮流报数,每次至少报1个,最多报m个,谁能报到n者胜。
【策略】只要给对方留下的报数空间是m+1的倍数,就可以保证获胜。
【变形拓展】减法博弈:有一个由n个石子组成的石子堆,两名玩家轮流从中拿走石子,每次拿走石子的个数只能是集合S(比如S = {1, 3, 4})中的数。拿走最后一枚石子的玩家获胜。
【策略】筛选法,对于一个P点x,那么P+Si都是N点(比如x+1,x+3,x+4),这样用筛选法可以计算出一定范围内所有的P点和N点。
Wythoff’s Game (威佐夫博弈)
【描述】所谓威佐夫博弈,是ACM题中常见的组合游戏中的一种,大致上是这样的:
有两堆石子,不妨先认为一堆有 10,另一堆有 15 个,双方轮流取走一些石子,合法的取法有如下两种:
1、在一堆石子中取走任意多颗;
2、在两堆石子中取走相同多的任意颗;
约定取走最后一颗石子的人为赢家,求必胜策略。
【策略】设k为任意正整数,有以下两个函数:
1、m(k) = k * (1 + sqrt(5)) / 2;
2、n(k) = m(k) + k;
点(m(k), n(k))和点(n(k), m(k))都是P点其余都是N点(我并不能证明>_<!)
【P点的性质】
1、所有自然数都会出现在一个必败点中,且仅会出现在一个必败点中。
证明:m(k)是前面没有出现过的最小自然数,自然与前k-1个必败点中的数字都不同;m(k)>m(k-1),否则违背m(k-1)的选择原则;n(k)=m(k)+k>m(k-1)+(k-1)=n(k-1)>m(k-1),因此n(k)比以往出现的任何数都大,即也没有出现过。又由于m(k)的选择原则,所有自然数都会出现在某个必败点中。
2、规则允许的任意操作可将必败点移动到必胜点。
证明:以必败点(m(k),n(k))为例。若只改变两个数中的一个,另一个数出现在另一个状态中,由于性质1,所有的自然数仅会出现在一个必败点中,所以得到的点一定是必胜点;若同时增加两个数,由于不能改变两数之差,每一个必败点的两个数之差是一一对应的,又有n(k)-m(k)=k,故得到的点也一定是必胜点。
3、一定存在规则允许的某种操作可将必胜点移动到必败点。
证明:以某个必胜点(i,j)为例,其中j>i。因为所有自然数都会出现在某个必败点中,故要么i等于m(k),要么j等于n(k)。
若i=m(k),j>n(k),可从j中取走j-n(k)个石子到达必败点;
若i=m(k),j<n(k),可从两堆同时拿走m(k)-m(j-m(k)),注意此时j-m(k) < n(k)-m(k) < k,从而到达必败点( m(j-m(k)),m(j-m(k))+j-m(k));
若i>m(k),j=n(k),可从i中取走i-m(k)个石子到达必败点;
若i<m(k),j=n(k),需要再分两种情况,因为i一定也出现在某个必败点中,若i=m(l),则从j中拿走j-n(l);若i=n(l),则从j中拿走j-m(l),从而到达必败点(n(l),m(l))。
Ferguson博弈(清空/分割游戏)
【描述】在游戏的开始,第一个盒子中有n枚石子,第二个盒子中有m个石子(n, m > 0)。参与游戏的两名玩家轮流执行这样的操作:清空一个盒子中的石子,然后从另一个盒子中拿若干石子到被清空的盒子中,使得最后两个盒子都不空。当两个盒子中都只有一枚石子时,游戏结束。最后成功执行操作的玩家获胜。
【策略】对于一个位置(x, y)来说,如果x, y中有一个偶数,那么(x, y)是N(必胜)位置。如果x和y都是奇数,那么(x, y)是P位置(必败)。
证明(归纳法):
1、当max(x,y)=2时,即(x,y)=(1,2)或(2,1)或(2,2),先手留下一个2分为(1,1),先手获胜,即当max(x,y)=2时结论成立。
2、假设max(x,y)<k时结论都成立,现证max(x,y)=k时结论成立。
若(x,y)中有一个偶数(设为a),先手将另一个清空,把偶数a分为两个奇数b和c,由于b、c<a 小于等于 k,即max(b,c)<k,由假设,在(b,c)位置上后手作为新先手必败,故先手胜
若(x,y)都为奇数,先手只能保留一个奇数并将其分解为一奇a一偶b,由于max(a,b)<max(x,y)=k,由假设,在(a,b)位置上后手作为新先手必胜,故先手败。
Fibonacci’s Game (斐波那契博弈)
【描述】有一堆个数为 n 的石子,游戏双方轮流取石子,满足:
1. 先手不能在第一次把所有的石子取完;
2. 之后每次可以取的石子数介于 1 到对手刚取的石子数的 2 倍之间(包含 1 和对手刚取的石子数的 2 倍)。
约定取走最后一个石子的人为赢家,求必败态。
【策略】必败态构成Fibonacci数列。
证明:去问数学大神吧^_<
尼姆博弈(Nimm's Game)
【描述】有3堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取1个,多者不限,最后取光者得胜。
【拓展】有n堆若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
【策略】状态(x1, x2, x3, …, xn)为P状态当且仅当x1 xor x2 xor x3 xor … xor xn =0。这样的操作也称为Nim和(Nim Sum) 。
如果每一种大小的子堆的个数都是偶数,我们就称Nim博弈是平衡的,而对应位相加是偶数的称为平衡位,否则称为非平衡位。因此,Nim博弈是平衡的,当且仅当:
as +bs + … + ms 是偶数,即as XOR bs XOR … XOR ms = 0
……
a1 +b1 + … + m1 是偶数,即a1 XOR b1 XOR … XOR m1 = 0
a0 +b0 + … + m0是偶数,即a0 XOR b0 XOR … XOR m0 = 0
必胜操作:先手面对非平衡局面时,在个数为x[i]的那一堆里取出x[i] - x[1]^x[1]^…x[i-1]^x[i+1]^…x[n]个物品,让对方面对平衡局面即可。
下面应用此获胜策略来考虑4堆的Nim博弈。其中各堆的大小分别为7,9,12,15枚硬币。用二进制表示各数分别为:0111,1001,1100和1111。于是可得到如下一表:
23 = 8 | 22 = 4 | 21 = 2 | 20 = 1 | |
大小为7的堆 | 0 | 1 | 1 | 1 |
大小为9的堆 | 1 | 0 | 0 | 1 |
大小为12的堆 | 1 | 1 | 0 | 0 |
大小为15的堆 | 1 | 1 | 1 | 1 |
具体做法有多种,先手可以从大小为12的堆中取走11枚硬币,使得游戏达到平衡(如下表)
| 23 = 8 | 22 = 4 | 21 = 2 | 20 = 1 |
大小为7的堆 | 0 | 1 | 1 | 1 |
大小为9的堆 | 1 | 0 | 0 | 1 |
大小为12的堆 | 0 | 0 | 0 | 1 |
大小为15的堆 | 1 | 1 | 1 | 1 |
之后,无论后手如何取子,先手在取子后仍使得游戏达到平衡。
同样的道理,先手也可以选择大小为9的堆并取走5枚硬币而剩下4枚,或者,先手从大小为15的堆中取走13枚而留下2枚。
【再拓展】如果规定最后取光者输,情况是怎样的?
【策略】和上面的一样。
原因:首先按照上面的规则一样的策略进行,直到只有一堆物品的个数大于1,其他堆均为1。在这样的情况下,只需要把堆x中的物品拿得只剩1个物品或者拿完,让对手面临奇数堆物品,这奇数堆物品每堆恰好1个物品。这样的状态显然是必败的。由于你每次操作后需要保证Nim和为0,因此不可能在你操作后首次出现“恰好有一个物品数大于1的堆”。新游戏得到了完美解决。
SG函数与SG定理
【一个一般的游戏】给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移动者判负。
【引例】在一行中有n个木瓶,你和你的朋友轮流用保龄球去打这些木瓶,由于你们都是高手,每一次都可以准确的击倒一个或相邻的两个木瓶,谁击倒最后一个剩余的木瓶谁将获得胜利。如果由你先打,请你分析,你应该采取什么策略来确保赢得胜利?
分析:为了看清楚问题的本质,用另一种方式来描述这个游戏。最开始有一堆石子(n个),每一次你可以进行以下四种操作中的一种:
1. 从中取出一颗石子;
2. 从中取出两颗石子;
3. 从一堆中取出一颗石子,并且将这一堆中余下的石子任意分成两堆(每堆至少一颗);
4. 从一堆中取出两颗石子,并且将这一堆中余下的石子任意分成两堆(每堆至少一颗)。
这四种操作,实际上就依次对应于原来游戏中的以下四种击倒法:
1. 击倒一段连续的木瓶中最靠边的一个;
2. 击倒一段连续的木瓶中最靠边的连续两个;
3. 击倒一段连续的木瓶中不靠边的一个;
4. 击倒一段连续的木瓶中不靠边的连续两个。
【SG函数】任何一个公平组合游戏都可以通过把每个局面看成一个顶点,对每个局面和它的子局面连一条有向边来抽象成这个“有向图游戏”。下面我们就在有向无环图的顶点上定义Sprague-Garundy函数,简称SG函数。
首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如集合N={0,1,2,3,4,5,6},则mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
函数g(x)=mex{ g(y) | y是x的后继 },或者表示为:g (X)= min{n| n∈N, n>=0,n≠ for y, y是x的后继},形象的说就是x的g函数值为x的后继点的SG值中没有出现过的最小值。
以引例为例,如果当前局面被分成了M堆,对某一堆来说:
显然,SG(0)=0。
剩余1个时,只能取到0个,而SG(0)=0,所以SG(1)=1。
剩余2个时,可以取到0或1,其中SG(0)=0,SG(1)=1,所以SG(2)=2(因为mex{0,1}=2)。
【SG函数的性质】
1、所有的终点(先手必败态),也就是没有出边的顶点,其SG值为0,因为它的后继集合是空集;
2、对于一个g(x)=0的顶点x,它的所有后继y都满足g(y)!=0;
3、对于一个g(x)!=0的顶点,必定存在一个后继y满足g(y)=0。
【引理】对于任意的局面x,若g(x)=0则x是P局面(必败态),否则x是N局面(必胜态)。
【复杂一点】有向图上并不是只有一枚棋子,而是有n枚棋子,每次可以任选一颗进行移动,这时,怎样找到必胜策略呢?
【Sprague-Grundy定理】游戏和的SG函数等于各子游戏SG函数的Nim和,即:设gi(x)为Gi的SG函数(1 ≤ i ≤ n),则G = G1+ G2+ … + Gn的SG函数g( x1, x2, …, xn ) = g1(x1)⊕ g2(x2) ⊕ … ⊕ gn(xn)(其中⊕为异或运算)。
例如引例中的一堆石子,剩余3个时,我们可以把局面变成1或2或两堆均为1,其中SG(1)=1,SG(2)=2,SG(1, 1)=SG(1) ⊕ SG(1)=0,所以SG(3)=mex{0,1,2}=3。同理,SG(4)可分解为{SG(2), SG(3),SG(2)⊕SG(1), SG(1)⊕SG(1)} ={2,3,3,0},所以SG(4)=1。
【用途】由Sprague-Grundy定理可知,对于复杂的公平组合博弈,如果我们可以将它们分解成若干个子游戏的联合,就可以通过求解子游戏的SG函数,方便地求得原游戏的SG函数,从而快速判断胜负情况:SG值为0的状态为必败状态(P态),SG值非0的状态为必胜状态(N态)。