详解博弈论的一类问题——Nim游戏

先来一道例题:

甲,乙两个人玩 N i m Nim 取石子游戏。
n i m nim 游戏的规则是这样的:地上有 n n 堆石子,每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这 n n 堆石子的数量,他想知道是否存在先手必胜的策略。

这道题有一个神奇的结论: n n 堆石子的数量异或和等于 0 0 时,先手必胜,否则先手必败

看网上大部分对于这个结论中异或的出现解释的都不是很清楚,这里想结合自己的想法谈一下这类问题的解法。

一、了解定义

我们要知道博弈问题通常有的两种状态:必胜态和必败态。

所谓必胜态,就是在当前的局面下,先手必胜

必败态,就是在当前的局面下,先手必败。

那么,这个游戏的必败态我们显然知道,就是所有石子堆都为 0 0 时。

二、从简单入手

我们可以用一个 n n 元组( a 1 , a 2 , , a n a_1, a_2, …, a_n )来表示每一个局面,

例如, ( 3 , 3 , 1 ) (3,3,1) 表示一共三堆石子,第一二堆有三个,第三堆有一个。

显然 ( 3 , 3 , 1 ) (3,3,1) ( 1 , 3 , 3 ) (1,3,3) 是同一种局面,即交换每堆顺序不影响答案。

如果初始局面只有一堆石子,则甲有必胜策略。

 甲可以一次把这一堆石子全部取完,这样乙就无石子可取了。

如果初始局面有两堆石子,而且这两堆石子的数目相等,则乙有必胜策略。

 因为有两堆石子,所以甲无法一次取完;
 如果甲在一堆中取若干石子,乙便在另一堆中取同样数目的石子;
 根据对称性,在甲取了石子之后,乙总有石子可取;
 石子总数一直在减少,最后必定是甲无石子可取。

对于初始局面(1),甲有必胜策略,而初始局面(3, 3),乙有必胜策略。

局面的加法: ( a 1 , a 2 , , a n ) + ( b 1 , b 2 , , b m ) = ( a 1 , a 2 , , a n , b 1 , b 2 , , b m ) (a_1, a_2, …, a_n) + (b_1, b_2, …, b_m) = (a_1, a_2, …, a_n, b_1, b_2, …, b_m)

所以 ( 3 ) + ( 3 ) + ( 1 ) = ( 3 , 3 ) + ( 1 ) = ( 3 , 3 , 1 ) (3) + (3) + (1) = (3, 3) + (1) = (3, 3, 1)

对于局面 A , B , S A, B, S ,若 S = A + B S=A+B ,则称局面 S S 可以分解为“子局面 A A B B
局面 ( 3 , 3 , 1 ) (3, 3, 1) 可以分解为 ( 3 , 3 ) (3, 3) ( 1 ) (1)

如果初始局面可以分成两个相同的“子局面”,则乙有必胜策略。

 设初始局面 S = A + A S=A+A ,想象有两个桌子,每个桌子上放一个 A A 局面;
 若甲在一个桌子中取石子,则乙在另一个桌子中对称的取石子;
 根据对称性,在甲取了石子之后,乙总有石子可取;
 石子总数一直在减少,最后必定是甲无石子可取。

对于局面S,若先行者有必胜策略,则称“S胜”。
对于局面S,若后行者有必胜策略,则称“S负”。
A = ( 1 ) A=(1) B = ( 3 , 3 ) B=(3, 3) C = ( 2 , 2 , 5 , 5 , 5 , 5 , 7 , 7 ) C=(2, 2, 5, 5, 5, 5, 7, 7) ,则 A A 胜, B B 负, C C 负。
我们要做的,就是如何判断局面的胜负。

 如果局面 S S 胜,则必存在取子的方法 S T S→T ,且 T T 负。
 如果局面 S S 负,则对于任意取子方法 S T S→T ,有 T T 胜。

设初始局面 S S 可以分解成两个子局面 A A B B 分解理论)。

若A和B一胜一负,则S胜。

 不妨设 A A B B 负;
 想象有两个桌子 A A B B ,桌子上分别放着 A A 局面和 B B 局面;
 因为 A A 胜,所以甲可以保证取桌子 A A 上的最后一个石子;
 与此同时,甲还可以保证在桌子 B B 中走第一步的是乙;
 因为 B B 负,所以甲还可以保证取桌子 B B 中的最后一个石子;
 综上,甲可以保证两个桌子上的最后一个石子都由自己取得。

若A负B负,则S负。

 无论甲先从 A A 中取,还是先从 B B 中取,都会变成一胜一负的局面;
 因此,乙面临的局面总是“胜”局面,故甲面临的 S S 是“负”局面。

即:若 B B 负,则 S S 的胜负情况与 A A 的胜负情况相同。

若A胜B胜,则有时S胜,有时S负。

 如果 S = A + C + C S=A+C+C ,则S的胜负情况与A相同。
 令 B = C + C B=C+C ,则 S = A + B S=A+B B B 负,故 S S 的胜负情况与 A A 相同。

初始局面 ( 3 , 3 , 1 ) = ( 3 ) + ( 3 ) + ( 1 ) (3, 3, 1) = (3) + (3) + (1) ,与局面 ( 1 ) (1) 的胜负情况相同。
初始局面 ( 3 , 3 , 1 ) (3, 3, 1) 是“胜”局面,甲有必胜策略。

如果局面 S S 中,存在两堆石子,它们的数目相等,
那么这堆石子可以被拿掉,且新局面与原来局面的胜负相同。

这叫做局面的简化,当一个局面不能被简化后,这个局面就被称做最简局面

最简局面中不会有两堆相同的石子,故可以用一个集合来表示最简局面

如果只关心局面的胜负,则一个局面可以用一个集合来描述,而这正是我们需要的。
如:局面 ( 3 , 3 , 1 ) (3, 3, 1) ,可以用集合 { 1 } \{1\} 来描述。

三、类比与联想

设大写字母 A B AB 表示局面,小写字母 a b ab 表示二进制

A A B B 相同,则 A + B A+B a a b b 相等,则 a + b = 0 a+b=0
A A B B 负,则 A + B A+B a = 1 a=1 b = 0 b=0 ,则 a + b = 1 a+b=1
B B A A 负,则 A + B A+B b = 1 b=1 a = 0 a=0 ,则 a + b = 1 a+b=1
A A B B 负,则 A + B A+B a = 0 a=0 b = 0 b=0 ,则 a + b = 0 a+b=0

有没有发现什么?

a a b b 相等,则 a a ^ b = 0 b=0
a = 1 a=1 b = 0 b=0 ,则 a a ^ b = 1 b=1
b = 1 b=1 a = 0 a=0 ,则 a a ^ b = 1 b=1
a = 0 a=0 b = 0 b=0 ,则 a a ^ b = 0 b=0

局面的加法与异或运算的性质完全相同。

能否用一个二进制数,来表示一个局面呢?

用符号# S S ,表示局面 S S 所对应的二进制数。
如果局面 S S 只有一堆石子,则用这一堆石子数目所对应的二进制数来表示# S S
# ( 5 ) = 5 = 101 (5)=5=101

若局面 S = A + B S=A+B ,则# S = S= # A + A+ # B B
局面 ( 3 , 3 ) = ( 3 ) + ( 3 ) (3, 3)=(3)+(3) ,所以# ( 3 , 3 ) = (3, 3)= # ( 3 ) + (3)+ # ( 3 ) = 11 + 11 = 0 (3)=11+11=0
局面 ( 3 , 3 , 1 ) = ( 3 , 3 ) + ( 1 ) (3, 3, 1)=(3, 3)+(1) ,所以# ( 3 , 3 , 1 ) = (3, 3, 1)= # ( 3 , 3 ) + (3, 3)+ # ( 1 ) = 0 + 1 = 1 (1)=0+1=1

注:如果这里不理解,把‘+’换成‘^’再试一下

四、证明

对于局面S,若#S=0,则S负;若#S≠0,则S胜
证出这个,就相当于我们得到结论了。

如果局面加法(异或和)的最高位为 i i ,则有一堆石子第 i i 位为 1 1
A A 就为那堆石子,其他堆石子局面(异或和)设为 s s ,总局面(异或和)设为 S S
则# A + A+ # s = s= # S S ,如果让# A A 等于# A A +# S S ,那么后手面对的则是# A A +# S S +# s = 0 s=0
或者说 A A ^ s = S s=S ,如果让 A A 等于 A A ^ S S ,那么后手面对的则是 A A ^ S S ^ s = 0 s=0

若#S=0,则无论先行者如何取子S T,都有#T≠0。
若#S≠0,则先行者必然存在一种取子方法S T,且#T=0

想必说到这里,大家应该都懂了,
这句话与若#S=0,则S负;若#S≠0,则S胜。 是等价的。

五、推广

甲乙双方事先约定一个数m,并且每次取石子的数目不能超过m个,其余规则同刚开始的例题。

这两个题目解法其实是非常相近的,
结论是:若所有石子模 m m 的异或和不为 0 0 ,则先手胜,反之则后手胜 (读者自证不难)

其实,这一类问题,都有一个通常的解法,让我们回想一下,我们解决第一个问题是都干了什么

用一个 n n 元组 ( a 1 , a 2 , , a n ) (a_1, a_2, …, a_n) ,来描述游戏过程中的一个局面。
用符号# S S ,表示局面 S S 所对应的二进制数。
定义如果局面 S S 只有一堆石子,则用这一堆石子数目所对应的二进制数来表示# S S
设局面 S = ( a 1 , a 2 , , a n ) S=(a_1, a_2, …, a_n) ,# S = S= # a 1 a_1 +# a 2 a_2 +…+# a n a_n ,采用异或操作。

但是这里的# a i a_i 并不是一直都等于本身的二进制数的,而是应该换作一个函数,这个函数,根据题目的不同而有所不同。

这,就是 S G SG 函数

通常解法:
首先,把原局面分解成多个独立的子局面,则原游戏的 S G SG 函数值是它的所有子局面的 S G SG 函数值的异或和。

S G ( S ) = S G ( s 1 ) SG(S)=SG(s_1) ^ S G ( s 2 ) SG(s_2) ^ … ^ S G ( s n ) SG(s_n)

然后,分别考虑每一个子局面,计算其 S G SG 值。

后手必胜当且仅当SG的异或和为0

文章就到这里,希望能帮到你。

博弈问题其实种类不多,做多了就惯了。


·

·参考文章:博弈,由感性认识到理性认识——张一飞

猜你喜欢

转载自blog.csdn.net/weixin_44023181/article/details/85619512