Nim游戏,Grundy函数介绍

来源:互联网 发布:mac转音频格式 编辑:程序博客网 时间:2024/06/17 22:40

Nim游戏,Grundy函数介绍

部分翻译自:http://www.cut-the-knot.org/ctk/May2001.shtml

Nim是一种很古老又很迷人的双人参与的数学游戏。这个游戏的名字和相关理论是在100多年前由哈佛大学的C.L.Bouton发明的。
玩家轮流从堆中(堆叠,格子,或盒子等)中移走物品(数字,硬币,或卡片等),但是一次只能选择一堆。一般的问题中是移走最后的物品的玩家获胜,反问题中是移走最后物品的玩家失败。
Bouton的理论基于整数的二进制表示。Plainim是用来演示Bouton理论的最好的nim游戏。
Nim游戏是公平游戏(Impartial game)的一种,在所有公平游戏中,如果两位玩家都选择最优操作,有些状态是必胜的,有些状态则是必败的。称必胜的状态为N状态,表示下一位(next)将要操作的玩家必胜;称必败的状态为P状态,表示上一位(previous)已经操作过的玩家必胜,即下一位玩家必败。
一个经典的Nim游戏的例子就是有三堆石头,第一堆有a块,第二堆有b块,第三堆有c块,用(a,b,c)来表示这个状态。有一些推论可以给出一些特定情况的判断,例如若n是奇数,(1,n,n+1)是个N(必胜)状态;若(a,b,c)是P状态,那么(2a,2b,2c)和(2a+1,2b+1,2c)也是P(必败)状态。
20世纪30年代的时候,R.P.Sprague和P.M.Grundy发明了一套关于平衡游戏的理论。Nim游戏是平衡游戏中很经典的一种。根据Sprague-Grundy的理论,公平游戏中的每一个状态都可以为其分配一个Grundy数,这个数等价于Nim游戏中某一堆物品的数量。
假设在一个公平游戏中,从一个状态S可以通过某个合法的操作到达状态S1,S2,,SN,而这些下一步的状态的Grundy数g(Si)已经得到了,那么状态S的Grundy数可以通过Mex规则得到,Mex会作用于一个元素都是非负整数的集合,结果是没有在这个集合中出现的最小的非负整数,如Mex{1,2,3} = 0, Mex{0,1,3,4}=2。状态S的Grundy数就为:

g(S)=Mex{g(S1),g(S2),...,g(Sn)}

很明显如果g(Si)<g(S) , 那么一定可以从S到达Si
Kayles游戏提供了一个很好的例子。这个游戏是由Dudeney和Loyd发明的。两个玩家轮流推倒排成一排的小柱子。每次可以任意推倒一根或者推倒相邻的两根,推倒最后的柱子的玩家获胜,也就是没有柱子可以推倒的玩家会失败。
最开始有n根排成一排且相邻的柱子,这时的游戏状态表示为Kn,经过一步操作后,可到达的状态为:
- K(n1) (推导边上的一根),
- K(n2) (推倒边上相邻的两根),
- {K1,K(n2)} (推倒一根后形成两个子游戏,一个只有一根,另一个有n-2根相邻),
- {K1,K(n3)}(推倒两根后形成两个子游戏,一个只有一根,另一个有n-3根相邻),
- {K2,K(n3)}(推倒一根后形成两个子游戏,一个有2根相邻,另一个有n-3根相邻),
- {K2,K(n4)} (推倒两根后形成两个子游戏,一个有2根相邻,另一个有n-4根相邻),
-
-

一个游戏如果有n个独立的子游戏组成的话,这个游戏的Grundy函数为这n个子游戏Grundy函数的异或。独立的游戏可以定义为一个已经得到Grundy函数的游戏,或者说本身符合平衡游戏要求的所有特点的游戏可以看成一个独立游戏。这样的定义是在强调独立游戏也可以由几个子游戏组成。例如一个游戏的状态T是由{T0,T1,,Tn}几个子游戏组成的,那么有:

g(T)=g(T0)g(T1)g(Tn)

T0 也可能由{T00,T01,,T0m}组成。
所以对于Kayles游戏,相应的Grundy函数的值如下:
g(K0)g(K1)g(K2)g(K3)g(K4)=Mex{}=0,=Mex{g(K0)}=1,=Mex{g(K1),g(K0)}=2,=Mex{g(K2),g(K1),g({K1,K1}}=Mex{g(K2),g(K1),g(K1)g(K1)}=3=Mex{g(K3),g(K2),g({K1,K2}),g({K1,K1})}=Mex{g(K2),g(K1),g(K1)g(K1),g(K1)g(K1)}=Mex{2,3,0,3}=1

有了Grundy函数后,就很容易判断是N状态还是P状态了,g(K)=0表示K是P状态,g(K)>0表示K是N状态。
关于平衡游戏还有许多更深入的话题,但是一般知道Grundy函数的计算规则就可以解决许多问题了。

0 0