先来一道例题:
甲,乙两个人玩
取石子游戏。
游戏的规则是这样的:地上有
堆石子,每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这
堆石子的数量,他想知道是否存在先手必胜的策略。
这道题有一个神奇的结论:当 堆石子的数量异或和等于 时,先手必胜,否则先手必败。
看网上大部分对于这个结论中异或的出现解释的都不是很清楚,这里想结合自己的想法谈一下这类问题的解法。
一、了解定义
我们要知道博弈问题通常有的两种状态:必胜态和必败态。
所谓必胜态,就是在当前的局面下,先手必胜
必败态,就是在当前的局面下,先手必败。
那么,这个游戏的必败态我们显然知道,就是所有石子堆都为 时。
二、从简单入手
我们可以用一个 元组( )来表示每一个局面,
例如, 表示一共三堆石子,第一二堆有三个,第三堆有一个。
显然 和 是同一种局面,即交换每堆顺序不影响答案。
如果初始局面只有一堆石子,则甲有必胜策略。
甲可以一次把这一堆石子全部取完,这样乙就无石子可取了。
如果初始局面有两堆石子,而且这两堆石子的数目相等,则乙有必胜策略。
因为有两堆石子,所以甲无法一次取完;
如果甲在一堆中取若干石子,乙便在另一堆中取同样数目的石子;
根据对称性,在甲取了石子之后,乙总有石子可取;
石子总数一直在减少,最后必定是甲无石子可取。
对于初始局面(1),甲有必胜策略,而初始局面(3, 3),乙有必胜策略。
局面的加法:
所以 。
对于局面
,若
,则称局面
可以分解为“子局面”
和
。
局面
可以分解为
和
。
如果初始局面可以分成两个相同的“子局面”,则乙有必胜策略。
设初始局面
,想象有两个桌子,每个桌子上放一个
局面;
若甲在一个桌子中取石子,则乙在另一个桌子中对称的取石子;
根据对称性,在甲取了石子之后,乙总有石子可取;
石子总数一直在减少,最后必定是甲无石子可取。
对于局面S,若先行者有必胜策略,则称“S胜”。
对于局面S,若后行者有必胜策略,则称“S负”。
若
,
,
,则
胜,
负,
负。
我们要做的,就是如何判断局面的胜负。
如果局面
胜,则必存在取子的方法
,且
负。
如果局面
负,则对于任意取子方法
,有
胜。
设初始局面 可以分解成两个子局面 和 (分解理论)。
若A和B一胜一负,则S胜。
不妨设
胜
负;
想象有两个桌子
和
,桌子上分别放着
局面和
局面;
因为
胜,所以甲可以保证取桌子
上的最后一个石子;
与此同时,甲还可以保证在桌子
中走第一步的是乙;
因为
负,所以甲还可以保证取桌子
中的最后一个石子;
综上,甲可以保证两个桌子上的最后一个石子都由自己取得。
若A负B负,则S负。
无论甲先从
中取,还是先从
中取,都会变成一胜一负的局面;
因此,乙面临的局面总是“胜”局面,故甲面临的
是“负”局面。
即:若 负,则 的胜负情况与 的胜负情况相同。
若A胜B胜,则有时S胜,有时S负。
如果
,则S的胜负情况与A相同。
令
,则
且
负,故
的胜负情况与
相同。
初始局面
,与局面
的胜负情况相同。
初始局面
是“胜”局面,甲有必胜策略。
如果局面
中,存在两堆石子,它们的数目相等,
那么这堆石子可以被拿掉,且新局面与原来局面的胜负相同。
这叫做局面的简化,当一个局面不能被简化后,这个局面就被称做最简局面。
最简局面中不会有两堆相同的石子,故可以用一个集合来表示最简局面
如果只关心局面的胜负,则一个局面可以用一个集合来描述,而这正是我们需要的。
如:局面
,可以用集合
来描述。
三、类比与联想
设大写字母 表示局面,小写字母 表示二进制
若
和
相同,则
负
若
和
相等,则
若
胜
负,则
胜
若
且
,则
若
胜
负,则
胜
若
且
,则
若
负
负,则
负
若
且
,则
有没有发现什么?
若
和
相等,则
^
若
且
,则
^
若
且
,则
^
若
且
,则
^
局面的加法与异或运算的性质完全相同。
能否用一个二进制数,来表示一个局面呢?
用符号#
,表示局面
所对应的二进制数。
如果局面
只有一堆石子,则用这一堆石子数目所对应的二进制数来表示#
。
#
。
若局面
,则#
#
#
。
局面
,所以#
#
#
。
局面
,所以#
#
#
。
注:如果这里不理解,把‘+’换成‘^’再试一下
四、证明
对于局面S,若#S=0,则S负;若#S≠0,则S胜。
证出这个,就相当于我们得到结论了。
如果局面加法(异或和)的最高位为
,则有一堆石子第
位为
设
就为那堆石子,其他堆石子局面(异或和)设为
,总局面(异或和)设为
,
则#
#
#
,如果让#
等于#
+#
,那么后手面对的则是#
+#
+#
,
或者说
^
,如果让
等于
^
,那么后手面对的则是
^
^
,
若#S=0,则无论先行者如何取子S
T,都有#T≠0。
若#S≠0,则先行者必然存在一种取子方法S
T,且#T=0
想必说到这里,大家应该都懂了,
这句话与若#S=0,则S负;若#S≠0,则S胜。 是等价的。
五、推广
甲乙双方事先约定一个数m,并且每次取石子的数目不能超过m个,其余规则同刚开始的例题。
这两个题目解法其实是非常相近的,
结论是:若所有石子模
的异或和不为
,则先手胜,反之则后手胜 (读者自证不难)
其实,这一类问题,都有一个通常的解法,让我们回想一下,我们解决第一个问题是都干了什么
用一个
元组
,来描述游戏过程中的一个局面。
用符号#
,表示局面
所对应的二进制数。
定义如果局面
只有一堆石子,则用这一堆石子数目所对应的二进制数来表示#
设局面
,#
#
+#
+…+#
,采用异或操作。
但是这里的# 并不是一直都等于本身的二进制数的,而是应该换作一个函数,这个函数,根据题目的不同而有所不同。
这,就是 函数
通常解法:
首先,把原局面分解成多个独立的子局面,则原游戏的
函数值是它的所有子局面的
函数值的异或和。
即 ^ ^ … ^ 。
然后,分别考虑每一个子局面,计算其 值。
后手必胜当且仅当SG的异或和为0
文章就到这里,希望能帮到你。
博弈问题其实种类不多,做多了就惯了。
·
·参考文章:博弈,由感性认识到理性认识——张一飞