【数学】博弈论初步
平等博弈问题的基本模型:一个状态 DAG 上的移动。
解决博弈论的重要方法:打表。
博弈论问题一般有一些方向:
-
观察先手怎么做,后手怎么做。一般是一些显然的贪心策略。
-
结合 SG 函数。
-
结合已有模型。
Ferguson Game
两堆石子,每次可以清空一堆,拆另一堆为两堆,无法操作者输。
分两堆奇偶性画出状态转移,发现两奇必败,其他必胜。
Chomp Game
\(n \times m\) 网格,每次拿走一个点右上的所有数,删除 \((1,1)\) 的人输。
这题有一个非构造性的巧妙判断方法:考虑第一次无论怎么操作都会删掉右上角,所以先手拿掉右上角,如果后手此时必胜,则先手第一步学习后手的必胜策略即可。
所以 \(n = 1,m = 1\) 时后手必胜,否则先手必胜。
Bash Game
\(n\) 个石子,一次拿 \([1,m]\) 个,无法操作的人输。
这题有两种分析方法:
第一种,考虑状态间的转移,考虑最后的必败状态是 \(n = 0\) ,也是 \(n \equiv 0 \mod (m + 1)\) 。考虑如果 \(n \not \equiv 0 \mod (m + 1)\) ,先手一定可以把它变成 \(n \equiv 0\) ,同理,如果一开始 \(n \equiv 0\) ,那么操作过后一定 \(\not \equiv 0\) ,由于石子数一定在减小,所以总有一个时候 \(n \equiv 0\) 时失败。
这样得出先手必胜条件为 \(n \not \equiv 0 \mod (m + 1)\) 。这是一种十分常规的分析方法,考虑用合理的状态刻画先后手之间的互相转化,最后走到终点。
但是感觉这样设计状态有些唐突,我们考虑第二种,从终点开始, \(n = 0\) 是必败态。容易得到 \(n \in[1,m]\) 是必胜态,因为一定可以一步取完。再推,发现 \(n = m + 1\) 是必败态,因为后继状态全部必胜;同理又发现 \(n \in [m + 2,2m + 1]\) 是必胜态,因为可以转化到 \(m + 1\) 。
这里得出了 SG 函数的一个弱化结论(十分显然):如果一个状态的后继状态中存在必败态,那么这个状态就是必胜态;否则为必败态。
这个结论有一个练习题:过河卒(作者省选的遗憾)。
SG 定理
我们定义 DAG 上一个节点的 SG 函数:
其中无出度的点(必败)的 \(SG\) 值为 \(0\) 。
\(SG\) 函数的性质就是先手必胜当且仅当 \(SG\) 函数大于 \(0\) 。
有以下定理:
对于一个由多个不干扰的平行游戏组成的博弈,整体的 SG 函数值为子游戏 SG 值的异或和。
Nim Game
\(n\) 堆石子,第 \(i\) 堆有 \(a_i\) 个,可以选取一堆并且拿走任意个石子(非 \(0\)),无法操作者输。
考虑用 \(SG\) 函数分析,如果列出 \(0,1,\dots,a_i\) 这些点代表石子个数,我们发现这些点构成一张竞赛图,其中大的连向小的。
不难归纳证明 \(SG(i) = i\) 。
根据以上定理,我们发现这个游戏先手必胜当且仅当所有堆的异或和大于 \(0\) 。
如果要具体分析的话,就是先手先操作使得异或和等于 \(0\) ,后手一次操作一定让它变得大于 \(0\) ,先手存在操作将异或和重新变回 \(0\) (取最大的一堆),这样操作最后到 \(0\) 时一定轮到后手。
Lasker’s Nim Game
Nim 游戏,但是可以选择这一步分裂石子堆。
\(SG(x)\) 与新局面取 \(mex\) 就好了,由于是两堆并列,所以新局面是 \(SG(y)\ xor\ SG(x - y)\) 。
打表发现:
\(\forall k \in \mathbb{N^+}\),\(SG(4k) = 4k - 1,SG(4k + 1) = 4k + 1,SG(4k + 2) = 4k + 2,SG(4k + 3) = 4k + 4\) 。
k-nim Game
\(n\) 堆石子,每堆有 \(a_i\) 个,每次可以选 \(k\) 堆拿,无法操作者输。
考虑如果 \(\forall i,a_i = 1\) ,那么就是一个 Bash Game。
考虑定义状态为对于所有堆,每一个二进制位 \(1\) 的个数都是 \(k + 1\) 的倍数。当前操作者一次操作一定会让某些位 \(1\) 的个数不是 \(k + 1\) 的倍数。由简单 nim 游戏我们可以发现,一定可以通过操作一个数改变某一位的值;同样地,操作最大的数可以改变所有位的值。由于每次操作不超过 \(k\) 个数,所以一个二进制位上可以改变不超过 \(k\) 个 \(1\) ,所以如果当前某些位不是 \(k + 1\) 倍数,那么一定可以变成 \(k + 1\) 的倍数。
所以类似地,这个游戏的结论就是先手必胜当且仅当某一位二进制 \(1\) 的个数不是 \(k + 1\) 的倍数。
Anti-nim
nim 游戏,但是不能操作者胜。
考虑如果全部都是 \(1\) ,那么偶数时先手胜,奇数时后手胜。
如果只有 \(1\) 堆 \(>1\) ,那么先手可以决定取不取完,必胜;注意到这种情况所有堆异或和 \(>0\) 。
如果有很多堆 \(>1\) ,且所有堆异或和 \(>0\) ,那么先手可以操作一次使异或和 \(=0\) ,此时一定不会出现上面的情况,后手操作一次后异或和一定重新 \(>0\) ,总有一次会变成上面的情况,先手必胜。
反之,如果有多堆 \(>1\) 且所有堆异或和 \(=0\) ,先手必败。
一些奇妙的转化
棋盘游戏
\(m \times m\) 的棋盘和 \(n\) 个棋子,每次可以操作一个棋子向左下对角线方向,左边,下面移动任意格,一个棋子移到 \((0,0)\) 就获胜。
这个和以往的博弈不同,一个到达就获胜,不能直接 \(SG\) 函数,考虑转化。
容易发现当前行动的这个人不会走到 \((0,y),(x,0),(1,1)\) ,不然直接送掉。所以可以假设 \((1,2),(2,1)\) 是棋子的终点,当所有棋子到达时,对手就被迫走上面三步,你就赢了。
所以把 \((1,2),(2,1)\) 当作终点推 \(SG\) 即可。
Crosses and Crosses
一张 \(1 \times n\) 空纸条,可以涂黑一格,涂黑后连续三个黑就赢。
\(n \leq 5000\) 。
考虑涂黑一格后,左右延伸两格范围内都不能再涂,所以转化为左右两段的子问题,\(SG\) 函数递推即可。
翻硬币游戏
一排 \(n\) 个硬币, \(m\) 个朝上,每次选择区间并将所有硬币翻面,要求右端点的硬币一定朝上,无法操作者输。
\(1 \leq n \leq 10^9,1 \leq m \leq 10^5\) 。
翻硬币游戏的统一结论:这些硬币可以看作很多只有一个硬币的子问题的组合,\(SG\) 函数直接异或。
关于这个的感性证明就是考虑翻完最高位,并且同时将低位的很多硬币都翻转,相当于这些子问题的异或,如果某个低位本来就有朝上的硬币,那么会被抵消,同时异或运算也可以抵消,所以 \(SG\) 函数不被影响。
K 倍动态减法游戏
\(n\) 个石子,第一个人拿 \([1,n - 1]\) 个,后面每个人拿的都不能超过前面一个人的 \(k\) 倍,不能操作者输。
\(k = 1\) :先手必胜当且仅当 \(n \neq 2^i\) ,因为先手每次取 \(lowbit\) ,然后后手必须取更低的,会制造新的 \(1\) ,而只有先手的操作会让 \(1\) 的个数减少,所以最后拿完的一定是先手,必胜。
如果是 \(2^i\) ,那么先手拿完后会变成多个 \(1\) ,后手采用相同策略。
\(k = 2\) :先手必胜当且仅当 \(n \in Fibonacci\) 。考虑一个正整数一定可以拆分成若干个不相邻的 Fibonacci 数的和。有一个特征就是 \(f_{i + 2} > 2f_i\) ,所以我们就可以每次拿 Fibonacci 拆分中最低位,类比二进制计算。
最后通解也就可以构造:我们需要构造数列 \(\{a_n\}\) 使得任意一个正整数可以表示成若干个 \(a_i\) 的和并且这种表示中相邻两项相差至少 \(k\) 倍。
设 \(a_1 = 1\) ,我们记数列 \(\{b_n\}\) 为 \(a_n\) 可以表示出的最大范围,接下来这样构造:
\(a_{n + 1} = b_n + 1,b_{n + 1} = a_{n + 1} + b_j\)。
\(j\) 是满足 \(ka_j < a_{n + 1}\) 的最大的 \(j\) ,由于 \(b_n + 1\) 前面表示不出,所以这一项一定要能表示这个数;\(b_{n + 1}\) 是因为选了 \(a_{n + 1}\) 后下一项需要小于等于 \(\frac {a_{n + 1}}{k}\) 。
这样,策略就是取最小表示中最低的位来获得胜利,如果 \(n\) 是序列中的数的话就必败。