博弈论小记
\(\rm NOIP\) 模拟赛考了 \(\rm SG\) 函数,于是来贺一发 oi-wiki
Part 1:公平组合游戏 \(\rm ICG\)
若一个游戏满足:
-
由两名玩家交替行动
-
在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关
-
不能行动的玩家判负
则称该游戏为一个公平组合游戏
经典的公平组合游戏有很多,包括取数游戏,\(\rm 31\) 点,以及 \(\rm NIM\) 游戏等。
博弈图和状态
如果将每个状态视为一个节点,再从每个状态向它的后继状态连边,我们就可以得到一个博弈状态图。
定义必胜状态为先手必胜的状态,必败状态为先手必败的状态。
通过推理,我们可以得出下面三条定理:
- 没有后继状态的状态是必败状态。
- 一个状态是必胜状态当且仅当存在至少一个必败状态为它的后继状态。
- 一个状态是必败状态当且仅当它的所有后继状态均为必胜状态。
如果博弈图是一个有向无环图,则通过这三个定理,我们可以在绘出博弈图的情况下用 \(O(n+m)\) 的时间(其中 \(n\) 为状态种数,\(m\) 为边数)得出每个状态是必胜状态还是必败状态。
\(\rm NIM\) 游戏
地上有 \(n\) 堆石子,第 \(i\) 堆石子有 \(a_i\) 个。两名玩家轮流行动,每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。问先手能否必胜
定理
\(\rm NIM\) 游戏先手必胜,当且仅当 \(a_1⊕a_2⊕\dots⊕a_n\ne 0\)
证明:为了证明该定理,只需要证明下面三个定理:
- 定理 1:没有后继状态的状态是必败状态。
- 定理 2:对于 \(a_1 \oplus a_2 \oplus \ldots \oplus a_n \neq 0\) 的局面,一定存在某种移动使得 \(a_1 \oplus a_2 \oplus \ldots \oplus a_n = 0\)。
- 定理 3:对于 \(a_1 \oplus a_2 \oplus \ldots \oplus a_n = 0\) 的局面,一定不存在某种移动使得 \(a_1 \oplus a_2 \oplus \ldots \oplus a_n = 0\)。
对于定理 1,没有后继状态的状态只有一个,即全 \(0\) 局面。此时 \(a_1 \oplus a_2 \oplus \ldots \oplus a_n = 0\)。
对于定理 2,不妨假设 \(a_1 \oplus a_2 \oplus \ldots a_n = k \neq 0\)。如果我们要将 \(a_i\) 改为 \(a_i'\),则 \(a_i'=a_i \oplus k\)。容易证明存在这样的 \(a_i\) 使得 \(a_i'<a_i\)
对于定理 3,如果我们要将 \(a_i\) 改为 \(a_i'\),则根据异或运算律可以得出
\(a_i=a_i'\),因而这不是个合法的移动。
Part 2:有向图游戏与 \(\rm SG\) 函数
在一个有向无环图中,只有一个起点,上面有一个棋子,两个玩家轮流沿着有向边推动棋子,不能走的玩家判负。该游戏被称为有向图游戏
大部分的公平组合游戏都可以转换为有向图游戏。具体方法是,把每个局面看成图中的一个节点,并且从每个局面沿着合法行动能够到达的下一个局面连有向边
\(\rm Mex\) 运算
设 \(S\) 表示一个非负整数集合。定义 \(\operatorname{mex}(S)\) 函数的值为不属于集合 \(S\) 中的最小非负整数,即:
\(\rm SG\) 函数
在有向图游戏中,对于每个节点 \(x\),设从 \(x\) 出发共有 \(k\) 条有向边,分别到达节点 \(y_1,y_2,\dots,y_k\),定义 \(\text{SG}(x)\) 为 \(x\) 的后继节点 \(y_1,y_2,\dots,y_k\) 的 \(\rm SG\) 函数值构成的集合再执行 \(\rm mex\) 运算的结果,即:
特别地,整个有向图游戏 \(G\) 的 \(\rm SG\) 函数值被定义为有向图游戏起点 \(s\) 的 \(\rm SG\) 函数值,即 \(\text{SG}(G)=\text{SG}(s)\)
有向图游戏的和
设 \(G_1,G_2,\dots,G_m\) 是 \(m\) 个有向图游戏。定义组合游戏 \(G\),它的行动规则是任选某个有向图游戏 \(G_i\),并在 \(G_i\) 上行动一步。\(G\) 被称为有向图游戏 \(G_1,G_2,\dots,G_m\) 的和。
有向图游戏的和的 \(\rm SG\) 函数值等于包含它的各个子游戏的 \(\rm SG\) 函数值的异或和,即:
定理
-
有向图游戏的某个局面必胜,当且仅当该局面对应节点的 \(\rm SG\) 函数值大于 \(0\)
-
有向图游戏的某个局面必败,当且仅当该局面对应节点的 \(\rm SG\) 函数值等于 \(0\)
还是看回 \(\rm NIM\) 游戏,记 \([k]\) 表示一堆石子的状态。
初始时 \(\text{SG}([0])=0\),\([k]\) 可以转移到 \([0]\dots[k-1]\),归纳可证 \(\text{SG}([k])=k\).
用此定理再证 \(\rm NIM\) 游戏结论不难。
除了 \(\rm NIM\) 以外,还有些其它的模型——
常见模型
1、\(\rm Take\) \(\rm Away\)
有 \(m\) 个石堆,包含 \(n\) 个石子,每一轮可以取走 \(1\sim k\) 个石子,不能操作者负。
先对单堆考虑,当 \(n\leq k\) 时,\(\text{SG}(n)=k\),而当 \(n=k+1\) 时,\(\text{SG}(k+1)=0\),于是可以证明 \(\text{SG}(n)=n\bmod (k+1)\)。
多堆只需求 \(\rm SG\) 和即可。
2、\(\rm Hungergame\)
有 \(m\) 个箱子,每个箱子中都有若干石子,每一轮可以采取下列操作之一
- 打开若干个箱子。
- 将某个箱子中的石子取出若干。
发现各个箱子不独立,无法套用 \(\rm SG\) 和。
考虑先手打开什么,当先手打开的箱子的石子异或和不为 \(0\),相当于给对方送了个必胜态。那之后先手只能继续开箱子,如果开出来的石子异或和一直不为 \(0\),先手必败。
但如果一开始就开出了异或和为 \(0\) 的箱子,那就可以逼后手开箱子了。
所以只需第一步开出一个极大的异或和为 \(0\) 的集合,后手就会沦为上述情况。
3、\(\rm Staircase\)
有 \(n\) 层阶梯,编号 \(1\sim n\),每层阶梯上有一些石子。
每次操作可以将 \(j\) 层阶梯上的若干石子移到 \(j-1\) 层上,\(0\) 号阶梯即为地板。
将最后一颗石子移到地板的人获胜。
先说结论:先手必胜当且仅当奇数阶梯上的石子数量异或和不为 \(0\)。
为什么是这样?你发现若一方尝试将偶数阶梯上的石子移到奇数阶梯上,令一方只需跟着把那堆石子移到再下一层的偶数阶梯上即可。这个过程先后手不会转换。所以偶数阶梯相当于垃圾桶。
对于奇数阶梯,一步就可以把任意多的石子丢进垃圾桶。因此阶梯博弈本质上就是奇数阶梯上的 \(\rm NIM\) 游戏。
4、\(\rm Take\) \(\rm and\) \(\rm Break\)
有 \(n\) 堆硬币,编号 \(0\sim n-1\)。
每名玩家轮流取硬币,每一轮中选取三堆硬币 \(i,j,k\,(i<j\leq k)\),从 \(i\) 中 取出一枚,并向 \(j,k\) 中各放入一枚。不能操作的人输。
考虑什么时候不能操作,即所有硬币都在 \(n-1\) 堆里时。若我们按 \(n-1\sim 0\) 编号,则 \(\text{SG}(0)=0\)。
博弈论的题总是需要思考有没有“模仿”这一操作,这题同样如此,所以可以直接将每堆硬币 \(\bmod 2\) 处理。
往 \(\rm SG\) 方面思考,发现把每堆硬币看成子游戏那它们是会互相影响的。但如果把每个硬币看成子游戏,那就是相互独立的。
这样可以把操作 \((i,j,k)\) 看成是 \(i\) 给 \(j,k\) 分别增加了一个子游戏。设 \(\text{SG}(x)\) 表示 \(x\) 堆只有一个硬币时的 \(\rm SG\) 值,则 \(\text{SG}(i)=\text{mex}\{\text{SG}(j)\oplus \text{SG}(k)\}\)。其他的再做不难。
Part 3:一些例题
1、P1857 质数取石子
带权博弈入门题。记 \([k]\) 为一堆石子的状态
设 \(f_k\) 表示状态 \([k]\) 是必胜/必败状态,可以递推得出。
因为决策取决于必败or必胜,所以两人的决策其实是统一的。设 \(g_k\) 表示从 \([k]\) 开始的最后得分。
若 \(f_k=1\),则 \(g_k\) 在所有 \(f_{k'}=0\) 的状态中寻找一个 \(g_{k'}\) 最小的。若 \(f_k=0\),则 \(g_k=\max\{g_{k'}\}\)。
2、P4363 [九省联考 2018] 一双木棋 chess
用轮廓线维护落子状态。
3、[ABC297G] Constrained Nim 2
结论:\(\text{SG}(X)=\left\lfloor\dfrac{X\bmod (L+R)}{L}\right\rfloor\)。
4、P5363 [SDOI2019] 移动金币
怎么我连第一步转化都想不到呢?
每次向左移动一枚金币,可以看作把金币前面的格子移动给后面的金币,这其实就相当于 \(\rm Staircase\)(阶梯博弈)。
设 \(b_i\) 表示第 \(i\) 枚金币与 \(i-1\) 枚金币之间格子数量,特别地,令 \(b_{m+1}\) 为 \(n\) 减去第 \(m\) 枚金币的位置,那我们就有 \(\sum b_i=n-m\),索性令 \(n\leftarrow n-m\)。
根据结论,先手取胜的充要条件是奇数位上的格子异或和不为 \(0\)。于是我们只需求有多少方案满足 \(b\) 数组奇数位置异或和不为 \(0\),且 \(\sum b_i=n\)。但我们发现不为 \(0\) 很难处理,于是转化为求异或和为 \(0\) 的方案。
我们一个个二进制位考虑,设 \(f_{i,j}\) 表示已经考虑完前 \(i-1\) 位,\(b\) 奇数位的和为 \(j\) 且异或和为 \(0\) 的方案数。转移即考虑在第 \(i\) 位放几个 \(1\),假设放 \(k\) 个,则 \(2\mid k\),\(f_{i,j}\times \dbinom{(m+1)/2}{k}\rightarrow f_{i+1,j+2^i\times k}\)。
记 \(t=\lceil\log _2n\rceil\),最后答案即 \(\dbinom{n+m}{m}-\sum\limits_{i=0}^n{f_{t,i}\times \dbinom{m/2}{n-i+m/2}}\),时间复杂度 \(\mathcal{O}(nm\log n)\),可以通过。
dp 可优化成 \(\mathcal{O}(m^2\log m)\),用 FFT 可以优化到 \(\mathcal{O}(m\log m\log n)\)。但我不会。
5、P3507 [POI2010] GRA-The Minima Game
本来想找 GRA 模型的,但是找到了这个简单题……
显然从大到小取最优。之后只需根据博弈论 dp 的基本套路,设 \(f_{i,0/1}\) 表示还剩下 \(i\) 个数没取,轮到先手/后手的得分差,转移不表。

浙公网安备 33010602011771号