我要是再不好好学博弈!就当场!把!这个!电脑屏幕!吃掉!
主要参考资料:lca 学长的组合博弈论课件。
组合游戏
具有以下几个性质的游戏是组合游戏:
- 两名玩家
- 轮流操作
- 每个玩家掌握游戏的所有信息,例如游戏的当前局面、自己和对手之前的操作等
- 操作是确定的,没有随机
为了简化问题,OI 中的组合游戏通常还具有以下性质:
- 没有平局,双方互为胜负
- 游戏一定能在有限步内结束
- 两个玩家的操作规则相同
- 玩家的操作规则仅由当前的游戏状态(或者说游戏局面)决定,与其他因素(如之前的操作)无关
- 双方都以最优策略操作
例如,中国象棋是组合游戏,但不是 OI 中的组合游戏,因为两个玩家操作规则不同(一个只能动红子,一个只能动黑子)。
飞行棋不是组合游戏,因为有随机性(掷骰子)。
石头剪刀布不是组合游戏,因为不是轮流操作。
取石子(有若干堆石子,两个人轮流从一堆中取任意多个,取完者胜)是组合游戏。这个游戏也是组合游戏的一个经典模型。
CS: GO 不是组合游戏,上面那一堆性质除了两名玩家勉强满足外全部不符合。比如沙鹰抽奖具有随机性,除了透视以外的玩家不知道对方在哪(游戏信息不完整),双方能起的枪和胜利条件不一样(规则不同),国服官匹可以平局,玩家的操作规则不仅与游戏状态有关还与有没有开挂有关等。
以下讨论的组合游戏都是 OI 中的组合游戏,默认无法操作(转移)时算输。
先手必胜和先手必败
既然游戏一定能决出胜负,且操作规则仅仅与当前状态有关,那么就可以把状态分为先手必胜和先手必败(后手必胜),简称必胜和必败。如果 面对 某个状态的玩家(他还没有操作,称为先手)一定能获胜,那么它就是先手必胜否则先手必败。
以取石子游戏为例,如果一个玩家面对的是没有石子的状态,那么他就失败了,也就是说「没有石子」是先手必败的状态。如果一个状态能转移到一个先手必败的状态,那么当前的先手一定会转移到先手必败的状态,让对方(也就是下一步的先手)面对这个必败的状态。因此,如果一个状态能转移到至少一个先手必败的状态,那么这个状态就是先手必胜的。否则,转移到的所有状态都是先手必胜,那么这个状态就是先手必败的。
根据定义,状态和转移组成了一个 DAG 。如果状态数和转移数很少,就可以直接做一遍递推就能得出每个状态是必胜还是必败。
SG 函数
说到 SG ,你有没有想到 ……
(图片来自萌娘百科)
对于一个游戏状态 (s) 定义 SG 函数:
其中 (t) 是 (s) 可以直接转移到的状态(称为「后继」),(mathrm{mex}(S)) 表示最小的不在集合 (S) 中的非负整数。
如果 (SG(s)=0) ,那么 (s) 是必败状态,否则是必胜状态,归纳证明如下:
根据定义,没有出边的状态(必败)的 SG 函数值是 0 ,满足这个性质。当 (s) 能到达的所有状态都满足这个性质(因为是 DAG 所以不存在循环归纳),如果存在 (s) 的后继 (t) 满足 (SG(t)=0) (必败),那么此时根据 mex 的定义, (SG(s)>0) ,是必胜的,否则是必败的。
当然现在看来这个 SG 函数好像并没有什么用 ,只是把必胜必败状态用 0 和非 0 表示了一下 ……
不要尝试找出 SG 函数的不同非 0 值有什么实际意义,至少我至今不知道(谁知道给我说一下谢谢)。这只是一个巧妙的构造罢了。下面会说它巧妙在哪以及有什么用。
SG 定理
说到 SG …… 啪!再扯 CS: GO 打死你
定义两个集合的 笛卡尔积 为从这两个集合中各选出一个元素组成的有序二元组的集合。即 (A) 和 (B) 的笛卡尔积 (A imes B) 为:
定义两个组合游戏的 和 为把这两个组合游戏放在一起,游戏之间互不影响。每个人任选一个游戏进行操作,如果所有游戏都无法操作就输了。例如,把 一堆 石子看作一个组合游戏,取石子游戏就是若干个这种组合游戏的和。
现在讨论 (n) 个小游戏的和,方便起见称这个和为「大游戏」。显然,大游戏的状态集合就是 (n) 个小游戏的状态集合的笛卡尔积。设大游戏的状态 (s=(s_1,s_2,dots,s_n)) ,其中 (s_i) 是第 (i) 个小游戏的状态。
SG 定理(其中 (oplus) 表示异或):
证明如下:
设等号右边那一堆的值为 (x) 。现在要证明两件事:
- (s) 的后继 (t) 中不存在 (SG(t)=x)
- 对于所有 (0leq y<x) ,都存在一个 (s) 的后继 (t) 满足 (SG(t)=y)
根据 mex 的定义, (SG(s)=x) 当且仅当这两个命题成立。
接下来口胡一番证明,我也不知道对不对 qwq。
对于所有小游戏都无法操作的状态 (p),所有 (SG(p_i)=0) 。由于这是无法操作的必败状态,(SG(p)=0) ,这种状态下满足这个性质。
依然是归纳证明。假设现在所有 (s) 能到达的状态都满足这个性质。设从 (s) 到后继 (t) 操作的游戏为 (i) ,由 mex 的定义显然 (SG(s_i) eq SG(t_i)) 。其余的小游戏是不变的,即 (SG(s_j)=SG(t_j),jin[1,i)cup(i,n]) 。因此, (SG(t)=SG(s)oplus SG(s_i)oplus SG(t_i)) 。
假设 (SG(t)=SG(s)=x) ,则给两边同时异或 (x) 得到 (SG(s_i)oplus SG(t_i)=0) 即 (SG(s_i)=SG(t_i)) ,矛盾。因此 (SG(t) eq x) 。第一个命题得证。
现在,对于 (0leq y<x) ,要找到一个 (t) 使得 (SG(t)=y) 。
因为
所以
设 (SG(s)oplus y) 的最高二进制位(即 (SG(s)) 和 (y) 最高的不一样的位)是第 (k) 位。由于 (y<SG(s)) ,所以一定存在这样的位,且 (SG(s)) 的第 (k) 位一定是 1 ,由此可得至少存在一个 (SG(s_i)) 的第 (k) 位是 1 。
把这样的 (i) 作为这一步操作的游戏。它需要变成的数 (SG(t_i)=SG(s_i)oplus SG(s)oplus y) 。由于第 (k) 位也是 (SG(s_i)) 和 (SG(t_i)) 最高的不一样的位,且 (SG(s_i)) 这一位为 1 ,所以 (SG(t_i)<SG(s_i)) 。
根据 mex 的定义,(SG(s_i)) 可以转移到任意一个比它小的 (SG(t_i)) ,因此这样的后继状态 (t) 一定存在。第二个命题得证。