一些概念和约定:
公平游戏:
这里讨论的组合游戏都是公平游戏,也就是说一个游戏者可以把状态A变成B,那么另一个游戏者也可以。比如下棋就不是公平游戏,因为白方可以移动白子而黑方不能。
状态图:
我们可以把游戏的状态用图的形式来组织。一个状态是一个节点,一条边代表通过一次操作将一个状态转移到另一个状态。
xor为二进制的异或运算,n个数的异或和在组合游戏中也称Nim和。
有的资料中把必败状态也叫做奇异状态,但我感觉必败状态这种叫法更直白一些。
假设游戏者双方都足够聪明,所以有这样两条规则:
- 一个状态是必败状态当且仅当它所有的后继都是必胜状态。
- 一个状态是必胜状态当且仅当它至少有一个后继是必败状态。
一、巴什博奕(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)的倍数,就能最后获胜。
二、威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
本以为这是个比较简单的博弈,后来喜欢刨根问底的我发现涉及到的东西还真不少。
主要参考资料:http://scimath.unl.edu/MIM/files/MATExamFiles/Cotton_MATpaper_Final_EDITED.pdf
这个问题还可以描述成这样:
- 有一个棋子在棋盘的(n, m)位置上,有两位个人分别轮流移动这枚棋子。移动的规则是:向左移动若干格子,或者向下移动若干格子,或者向左下移动若干格子。移动到左下角即(0, 0)的人获胜。
先看几个比较简单的状态,如果先手面对的局面是(a, 0)或(0, a)或(a, a),那么直接将所有石子全部拿走即可获胜(或者说是将棋子直接移到左下角)。
如果现在状态是(1, 2)会怎样呢?枚举一下所有可能的情况:
- 拿走第一堆的一个石子,状态变为(0, 2),那么第二个人将第二堆的两个石子全部拿走即可获胜。
- 拿走第二堆的一个石子,状态变为(1, 1),那么第二个人将两堆石子全部拿走即可获胜。
- 拿走第二堆的两个石子,状态变为(1, 0),那么第二个人将第一堆的石子拿走即可获胜。
- 分别拿走第一堆和第二堆的一个石子,状态变为(0, 1),那么第二个人拿走第二堆的一个石子即可获胜。
也就是说无论第一个人怎样拿,第二个人都会获胜。那么称(1, 2)这个状态为必败状态或者奇异状态。
对于状态(1, 3)应该怎样?根据前面的分析,显然先手在第二堆取一个石子,将状态转移为(1, 2)就能获胜。
同样地,对于状态(2, 3),先手分别在两堆中各拿走一个石子,就能把状态转移为(1, 2)。
所以,对于状态(1, p)(p > 2)和状态(p, p+1)(p>1),先手将其转移为(1, 2)即可获胜。
其他奇异状态:
如图A,两个黑色的格点(1, 2)和(2, 1)是已知奇异状态,过这两个格点向右向上向右上作射线,则这些射线上的点都可以转移到黑色的格点上去。所以这些射线上的点对应的状态是必胜状态。然后我们再取没被标记过的横纵坐标最小的格点作为新的奇异状态,也就是(3, 5)和(5, 3)。然后再过这两个点作射线,继而得到新的奇异状态,以此类推。
有了这样一个过程,我们也很容易找到必胜的策略:如果现在的状态是必胜状态,那么必有一条射线经过该点。所以只要顺着这条射线将棋子移动到奇异状态(也就是图中的黑色格点)即可。这样对手在面对奇异状态的时候,不论怎么走,走到的都是有射线的格子(想一想,为什么)。所以你又可以把必胜状态转变为奇异状态给对手,最终获胜。
不妨再多找几个奇异状态试试:
因为两堆石子除了数量以外没有任何区别,所以只考虑(A, B)(A ≤ B)的奇异状态,做成表格如下:
n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
A | 0 | 1 | 3 | 4 | 6 | 8 | 9 | 11 | 12 | 14 | ... |
B | 0 | 2 | 5 | 7 | 10 | 13 | 15 | 18 | 20 | 23 | ... |
容易发现一些规律:
这两个数列还可以按这样的方法得到,An为A、B中前n-1个数中为出现过的最小的正整数,Bn = An + n。比如,A1 = 1, B1 = A1 + 1 = 2;A2为为出现的最小的正整数3,B2 = A2 + 2 = 5;A3为未出现的最小正整数4,B3 = A3 + 3 = 7...
更强悍的通项公式:
知道有人喜欢不服,又懒得自己算,所以这里好心再附上一张表格验证一下:
n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... |
φ⋅n | 0 | 1.618 | 3.236 | 4.854 | 6.472 | 8.090 | 9.708 | 11.326 | 12.944 | ... |
⎣φ⋅n⎦ | 0 | 1 | 3 | 4 | 6 | 8 | 9 | 11 | 12 | ... |
φ2⋅n | 0 | 2.618 | 5.236 | 7.854 | 10.472 | 13.090 | 15.708 | 18.326 | 20.944 | ... |
⎣φ2⋅n⎦ | 0 | 2 | 5 | 7 | 10 | 13 | 15 | 18 | 20 | ... |
最后还有一个事实要告诉大家:
每个正整数只在A或者B中出现,且仅出现一次。换句话说就是,A和B中没有相同的正整数,但是A和B并起来就得到了所有的正整数。
楼主的好奇心已经爆棚得不得了了,=_=||,干脆最后一口气又从维基百科上学了一下这个定理:
Beatty sequence:
那么两个数列{ ⎣α⎦, ⎣2α⎦, ⎣3α⎦... } 和 { ⎣β⎦, ⎣2β⎦, ⎣3β⎦... }是不相交的,而且他们的并集是所有的正整数。
Rayleigh theorem:
感觉第二个证明的反证法比较好懂一些,英语并不是很多,所以就不翻译了。
三、尼姆博弈(Nim Game):有三堆各若干个石子,两个人轮流从某一堆取任意多的石子,规定每次至少取一个,多者不限,最后取光者得胜,或者说最后不能操作的人输。
因为是三堆石子,所以我们用(a, b, c)来表示一个状态。
还是从最简单的状态开始:显然(0, 0, 0)是必败状态,其次(0, x, x)也是必败状态,因为你从某一堆中取k个石子,对手只要和你一样从另一堆中取同样的石子,保持两堆石子数量相同即可,这样最终取完的人将会是对手。
Bouton定理:状态(a, b, c)为必败状态当且仅当a xor b xor c = 0.
1).对于必胜状态,一定有一个后继必败状态。
假设三堆石子的个数的异或和为X(X > 0),X最高位的1在第k位,那么一定有一堆石子的数量第k位为1。
设这堆石子的数量为Y,我们只要把这堆变为X xor Y,就将必胜状态变为了必败状态。
首先说明 X xor Y < Y,因为X的第k位左边全部为0,所以X xor Y后,Y的第k位左边不变,而第k位变为0,所以Y xor X后Y变小。
下面计算Y变为X xor Y后所有数字的异或和:除了Y,所有数字的异或和为X xor Y,因为异或一个数两次相当于没有异或,然后再异或上Y改变以后的值X xor Y,最终答案为X xor Y xor (Y xor X) = 0,所以这是一个必败状态。
2).对于必败状态,所有的后继都是必胜状态。
因为要改变其中一堆火柴,不论哪一位发生变化,最终的xor和都不是0.
另类的Nim游戏:还是和原来一样n堆里面取石子,每次只能从一堆里面取若干个,至少取一个。但取到最后一个石子的人输!
天真地猜想一下,那结论是不是也要反过来呢?Nim为0必胜,不为0必败,很遗憾我误导你们了,=_=||
这个问题变得更复杂了,所以得再引入一些新的概念才能解决。
以下分析转自kuangbin的博客:http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html
可能原文说得比较乱,所以这里把定义的概念统一列出来方便阅读:
- T状态,即Nim和为0的状态
- S状态,Nim和不为0的状态
- 孤单堆,只有一个石子的石子堆,好吧,确实很孤单=_=||
- 充裕堆,和孤单堆相反,至少有两个石子的石子堆。
- 所以,一个石子堆不是孤单堆就是充裕堆
将S、T状态与充裕堆的数量结合就可以得到分类更细致的状态:
- S2,Nim和不为0,至少有两个充裕堆
- S1,Nim和不为0,只有一个充裕堆
- S0,Nim和不为0,没有充裕堆,也就是只有奇数个孤单堆
- T2,Nim和为0,至少有两个充裕堆
- T1,404 Not Found!孤单堆只会影响Nim和的最后一位,而充裕堆必然有一个高位的1,将导致Nim和中对应的高位也是1,所以不存在这样的状态。
- T0,Nim和为0,没有充裕堆,也就是只有偶数个孤单堆
原文中还有更详细的推导:
[定理5]:S0态,即仅有奇数个孤单堆,必败。T0态必胜。
证明:
S0态,其实就是每次只能取一根。每次第奇数根都由己取,第偶数根都由对
方取,所以最后一根必己取。败。同理, T0态必胜#
[定理6]:S1态,只要方法正确,必胜。
证明:
若此时孤单堆堆数为奇数,把充裕堆取完;否则,取成一根。这样,就变成奇数个孤单堆,由对方取。由定理5,对方必输。己必胜。 #
[定理7]:S2态不可转一次变为T0态。
证明:
充裕堆数不可能一次由2变为0。得证。 #[定理8]:S2态可一次转变为T2态。
证明:
由定理1,S态可转变为T态,态可一次转变为T态,又由定理6,S2态不可转一次变为T0态,所以转变的T态为T2态。 #
[定理9]:T2态,只能转变为S2态或S1态。
证明:
由定理2,T态必然变为S态。由于充裕堆数不可能一次由2变为0,所以此时的S态不可能为S0态。命题得证。
[定理10]:S2态,只要方法正确,必胜.
证明:
方法如下:
1) S2态,就把它变为T2态。(由定理8)
2) 对方只能T2转变成S2态或S1态(定理9)
若转变为S2, 转向1)
若转变为S1, 这己必胜。(定理5)
[定理11]:T2态必输。
证明:同10。
综上所述,必输态有: T2,S0
必胜态: S2,S1,T0.
最后说一下
SG函数和SG定理:对于任意状态x,定义SG(x) = mex(S),其中S是x的后继状态的集合。SG(x) = 0当且仅当x为必败状态。
组合游戏的和:假设有k个组合游戏G1,G2...Gk,定义一个新游戏:每个回合当前游戏者选择一个子游戏进行合法的操作,直到不能操作者输。这样和游戏的SG函数值为各个子游戏的SG函数值的Nim和。
因为水平有限,仅仅是刚刚接触博弈论,所以这篇博客可能以后还会继续补充新的内容。