博弈论
博弈论
博弈论一般是询问有无必胜策略,有些还会附带一些计数性的问题。
定义后继状态为当前状态经过决策后的下一个状态。
状态的判定:
-
如果当前状态的后继状态中有一个是必败状态,那么当前状态必胜。
-
如果当前状态的后继状态中全是必胜状态,那么当前状态必败。
下面从几个经典的题来介绍博弈论。
一. Nim 游戏
给定 \(n\) 堆石子,每堆有 \(a_i\) 个石子,每次可以从某一堆内拿任意正整数个石子,谁不能取谁就输了。
首先,我们先从简单情况考虑:
-
一堆石子:先手必胜
-
两堆石子:如果两堆石子个数相同,则先手必败,否则先手必胜。原因是先手可以先取一些石子使得两堆石子的数量相同,然后接下来复制对手的操作,即对手取 \(x\) 个,我就在另一堆也取 \(x\) 个。
然后,考虑怎么推广结论:
根据两堆石子的情况,大致一个思路就是:
如果无论对方怎么操作,我方都可以进行一次操作使得局面回到一种特定的局面(且这种局面进行到底我方能够胜利),那么我方必胜。
那么这能怎么抽象一下呢?
结论:
如果各堆石子数量的异或和为 \(0\) ,则先手必败,否则先手必胜。
证明:
首先,石子数量全为 \(0\) 时异或和为 \(0\) ,先手必败符合要求。
然后我们需要证明:
-
对于每一个必胜态(异或和为 \(0\) ),后继状态中存在必败态(异或和不为 \(0\))
-
对于每一个必败态,后继状态一定全为必胜态。
证明一:对于每一个必胜态,后继状态中存在必败态
由于当前异或和不为 \(0\) ,假设取异或和的最高位为 \(x\) :
那么取二进制位下第 \(x\) 位不为 \(0\) 的某个 \(a_i\):
调整 \(a_i\) 二进制位下的值使得异或和变为 \(0\) 。
设调整过后的数为 \(b_i\) 。
那么肯定有 \(b_i<a_i\) ,因为高于 \(x\) 的位 \(a_i,b_i\) 相等,而第 \(x\) 位 \(a_{i,x}=1\),\(b_{i,x}=0\) 。
证明二:对于每一个必败态,后继状态中一定是必胜态
显然操作一个数时,会造成至少一位的值改变,所以改变后的异或和不为 \(0\) 。
证毕。
二. 阶梯 Nim
有 \(n\) 堆石子,编号 \(1...n\) ,每堆有 \(a_i\) 个,每次操作可以把第 \(i\) 堆的任意正整数个石子移动到 \(i-1\) 堆上, 第 \(0\) 堆不能移动。
遇到移动的这类题目要去想黑白染色,本题也一样。
结论:
如果奇数位置石子个数的异或值为 \(0\) 则先手必败,否则必胜。
证明:
证明一:对于每一个必胜态,后继状态中存在必败态
若上一轮对手将奇数格的石子移到偶数格,那么相当于奇数格的石子变少了,也就是普通 \(Nim\) 游戏。
若上一轮对手将偶数格的石子移到奇数格,那么本轮只需要将上一轮移到奇数格的石子全部移到下一个偶数格就行了。
证明二:对于每一个必败态,后继状态一定是必胜态
无论是将奇数格的石子移到偶数格,还是将偶数格的棋子移到奇数格,奇数格的异或和必定变为非 \(0\) 。
三. K-Nim
有 \(n\) 堆石子,每堆石子有 \(a_i\) 个。两人轮流取走任意不超过 \(k\) 堆的正整数个石子,无法操作者负。
普通 \(Nim\) 中 \(k=1\) ,而异或的本质是把每堆写成二进制,看每一位上 1 的个数。异或为 0,等价于:每一位上 1 的个数都是偶数,也就是模 \(2\) 为 0。
那就可以联想到,此处会不会是每一位上要使 \(1\) 的个数模 \(k+1\) 等于 \(0\) 。
而事实正是如此。
证明:
首先,终局所有堆都是 \(0\) ,每一位模 \(k+1\) 也自然是 \(0\) 。
证明一:对于每一个必胜态,后继状态中存在必败态
当前某一位模 \(k+1\) 不为 \(0\) ,那么这一位的余数一定在 \(1-k\) 之间,那么我一定可以把不超过 \(k\) 堆的数减少一些使得这些位都变为 \(0\) 。
具体和普通 \(Nim\) 差不多。
证明二:对于每一个必败态,后继状态中一定是必胜态
你一次最多动 \(k\) 堆。
对于你动过的这些堆,考虑它们中最高的发生变化的那一位。
在这一位上,原来 \(1\) 的个数是 k+1 的倍数。
你最多改变 \(k\) 堆,所以这一位上 \(1\) 的个数变化量最多是 \(k\),不可能仍然是 \(k+1\) 的倍数。
因此,走完一步后,至少有一位上 \(1\) 的个数不再是 \(k+1\) 的倍数。
四. 反 Nim
有 \(n\) 堆石子,每堆石子有 \(a_i\) 个。两个人轮流取走任意一堆的正整数个石子,取不了的人赢。
还是从最基础的情况开始讨论:
-
当 \(a_i\le 1\) 时:
此时显然如果有奇数个 \(1\) ,则先手输,否则先手赢。 -
当只有一个 \(a_i\ge2\) ,其他都 \(\le2\) 时:
显然先手必胜,因为先手可以将 \(a_i\) 变成 \(1/0\) 来调控 \(1\) 的个数。
下面讨论当有至少两个 \(a_i\ge 2\) 的情况:
结论:和普通 \(Nim\) 完全一样,异或和为 \(0\) 则先手必败,否则必胜。
下面给出证明:
证明:
证明一:对于每一个必胜态,后继状态中存在必败态
和 \(Nim\) 游戏一样,可以变成异或和为 \(0\) 的状态。由于异或和为 \(0\) 的状态下,不会出现只有一个 \(a_i\ge2\) 的情况,又由于只会改动一堆石子,所以仍然会有至少两个 \(a_i\ge2\) ,所以说可以转变为必败态。
证明二:对于每一个必败态,后继状态中一定是必胜态
已知改变后的异或和不为 \(0\) ,若只有一个 \(a_i\ge2\) ,那就变为了必胜态。
如果有至少两个 \(a_i\ge 2\) ,那也是必胜态。
所以得证。
五. Fibonacci Nim
有 \(n\) 个石子两人轮流操作。先手取任意多个石子,之后每一次取得石子数都不能超过前一次取的两倍。
问先手第一次最少要取多少。
子问题一:什么时候先手必须要取完?
答案是当 \(n\) 是斐波那契数列的时候。
要证明这个,首先我们需要知道斐波那契数列的一些性质:
-
\(f_{i+1}>2f_{i-1}\)
-
\(f_i<2f_{i-1}\)
证明:
使用归纳法:首先发现 \(f_1\) 和 \(f_2\) 都需要一次取完。
假设现在证明出了 \(f_{1...t-1}\) 都满足要求,现在要证明 \(f_{t}\) 必须要一次性取完。
假设第一次取了 \(x\) 。
-
\(x\in[f_{t-2},f_{t})\) : 此时由于 \(f_y<2x\) ,所以对面直接取完了,所以做不了。
-
\(x\in[f_{t-4},f_{t-2})\) : 此时后手直接取 \(y=f_{t-2}-x\) 个石子,那么 \(y\in(0,f_{t-3}]\) ,所以易知 \(y<2x\),那么还剩下 \(f_t-f_{t-2}\) 个石子,也就是说变为了 \(f_{t-1}\) 的问题。而又由于 \(y\in(f_{t-4},f_{t-3}]\) ,所以 \(2y<f_{t-1}\) ,所以就不能够一次取完 \(f_{t-1}\) ,根据假设,这种情况必然不成立。
-
\(x\in[f_{t-6},f_{t-4})\) :此时后手取 \(y=f_{t-4}-x\) 个石子,那么 \(y\in(f_{t-6},f_{t-5}]\) ,所以仍然有 \(y<2x\) 。
此时还剩下 \(f_t-f_{t-4}\) 个石子,即还剩下 \(f_{t-1}+f_{t-3}\) 个石子,那么由于 \(2y<f_{t-3}\) 且 \(4y>f_{t-3}\) ,所以后手一定能取完 \(f_{t-3}\) 的最后一个石子,这样继续下去也一定能取完 \(f_{t-1}\) 的最后一个石子,也就是说这种情况也不成立。 -
......
所以 \(f_i\) 必须一次取完。
子问题二:对于某一个自然数,是否可以像刚刚证明一样划分为几个独立的问题?
结论: 对于每一个自然数,都可以被唯一的分解为若干不相邻斐波那契数之和。
如:\(29=21+8\)
证明略,但较容易理解。
那么设 \(n=f_{k_1}+f_{k_2}+f_{k_3}+...\) 那么答案就是 \(f_{k1}\) 。
原因是当你选了 \(f_{k_1}\) 后,对手就会面对一个 \(f_{k_2}\) 的局面,由于 \(2f_{k_1}<f_{k_2}\) ,所以就一定无法取完,那么由子问题一得:你一定可以取完这 \(f_{k_2}\) 的最后一个棋子,以此类推就可以赢下比赛。
威佐夫博弈
有两堆石子,分别有 \(a,b\) 个,每次可以在一堆中取走任意个,也可以在两堆中同时取走相同个数个,无法取得人输。\(a,b\le 10^9\)
首先,我们只关心两个堆的数量而不关心编号。所以可以设当前状态为 \((x,y)\) ,其中 \(x\le y\) 。
然后我们要考虑那些状态是必胜态,哪些是必败态。
打表观察一下必败态有什么规律:
| \(k\) | \(a_k\) | \(b_k\) | 差 \(b_k-a_k\) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 2 | 1 |
| 2 | 3 | 5 | 2 |
| 3 | 4 | 7 | 3 |
| 4 | 6 | 10 | 4 |
| 5 | 8 | 13 | 5 |
| 6 | 9 | 15 | 6 |
| 7 | 11 | 18 | 7 |
| 8 | 12 | 20 | 8 |
似乎很容易就发现了 \(b_k-a_k=k\) 。
但还需要找到 \(a\) 的规律才能确定 \((a,b)\) 。
观察一下表,注意到除了 \(0\) 其他元素都只出现了一次,然后 \(a_k=mex(a_{0...k-1}\cup b_{0...k-1})\)。
下面证明满足上述性质的状态时必败态。
证明:
引理:每个元素会且只会出现一次
首先,\(a,b\) 序列都是严格递增的,这个似乎比较显而易见。
其次,\(b_i\) 应该是严格大于之前集合中的所有数,所以 \(b_i\) 是全新的,这个也显而易见。
而 \(a_i\) 是 \(mex\) 所以本身也是全新的,不会有重叠。
证明所有非负整数都出现了:
假设存在某个非负整数 \(N\) 从未出现在任何 \(a_k\) 或 \(b_k\) 中。因为 \(a_k\) 严格递增且趋于无穷,所以一定存在某个 \(m\) 使得
\(a_m\)>\(N\)
取最小的这样的 \(m\)。那么 \(a_m\) 是第一个大于 \(N\) 的 \(a\)。
由于 \(a_m=mex(S)\),所有小于 \(a_m\) 的非负整数都必须在 \(S_m\) 中。而 \(N<a_m\),所以 \(N\) 必须在 \(S\) 中。也就是说,\(N\) 已经出现在某个 \(a_i\) 或 \(b_i\) 中 \((i<m)\),矛盾。
因此,不存在这样的 \(N\) 。所有非负整数都出现了。
证明一:对于每一个必胜态,后继状态中存在必败态
现在假设当前状态 \((x,y)\) 不是必败态,且
\(x\le y,d=y−x\)
我们要证明:总能一步走到某个必败态。
假设差值为 \(d\) 的那个必败态是
\((a_d,b_d)=(a_d,a_d+d)\)
-
\(x>a_d\):那么只需要同时取走 \(x-a_d\) 就行了。
-
\(x<a_d\):因为每个元素会且只会出现一次,所以 \(x\) 一定出现在某个必败态中。
-
若 \(x\) 出现在 \(a\) 中:设这个必败态为 \((a_m,b_m)=(x,x+m)\) ,那么由于 \(a\) 数组单调递增,所以 \(m<d\) ,那么只需要将 \(b\) 减少 \(d-m\) 就行了。
-
若 \(x\) 出现在 \(b\) 中: 设这个必败态为 \((a_m,b_m)=(x-m,x)\) ,所以 \(y>x>a_m\) ,那么只需要将 \(y\) 减少到 \(a_m\) 就行了。
-
证明二:对于每一个必败态,后继状态中一定是必胜态
对于某个 \((a_k,b_k)\):
-
减小某一个数:由于每个元素只会出现一次,如果新的状态时必败态,那么有一个元素必定是 \(a_k\) 或 \(b_k\) ,但由于 \(b_k=a_k+k\) ,所以不可能出现。所以那么新状态必然是必胜态。
-
同时减小两个数:差值不变,而一个插值 \(k\) 唯一对应一个状态 \((a_k,b_k)\) ,所以新状态为必胜态。
SG 函数:
什么是 \(SG\) 函数?
对于任意一个一个公平的组合游戏而言,我们可以把它看成是一个有向无环图:
-
每个状态是图的一个点;
-
从状态 \(u\) 能一步到达状态 \(v\),就连一条有向边 \(u→v\);
-
没有出边的状态是终止状态。
那么:
规定终止节点的 \(sg\) 函数值为 \(0\) 。
单个游戏:
对单个公平组合游戏:
为什么?
由 \(SG\) 定义:
- 若 \(g(v) = 0\),说明 \(0\) 不在后继的 \(SG\) 值集合中,所以所有后继的 \(SG\) 值都非 \(0\)。也就是说,从必败态只能走到必胜态。
- 若 \(g(v) > 0\),说明 \(0\) 一定出现在后继的 \(SG\) 值集合中,因为 \(g(v)\) 是最小的没出现过的非负整数。因此存在某个后继 \(u\),使得 \(g(u) = 0\)。也就是说,从必胜态可以走到必败态。
因此单游戏胜负完全由 \(SG\) 值是否为 \(0\) 决定。
多个子游戏:\(SG\) 定理
实际博弈常常是多个独立子游戏的和:每一回合只能选择其中一个子游戏操作,其他子游戏不变。
设一个和游戏由 \(k\) 个子游戏组成,当前状态分别为 \(x_1, x_2, \dots, x_k\)。若各子游戏的 \(SG\) 值为:
则整个和游戏的 SG 值为:
其中 \(\oplus\) 表示按位异或。
因此:
则当前玩家必败;否则必胜。
为什么 \(SG\) 定理正确?
设当前和游戏的异或和为:
我们证明:整个和游戏的 \(SG\) 值恰好就是 \(s\)。
第一步:不能一步走到异或和仍为 \(s\) 的状态
假设一步只改变第 \(i\) 个子游戏,从 \(x_i\) 走到 \(x_i'\)。设:
因为 \(g_i = \operatorname{mex}\{g(x_i) \text{ 的后继 SG 值}\}\),所以 \(g_i\) 本身不会出现在 \(x_i\) 的后继 \(SG\) 值集合中。因此:
新的异或和为:
由于 \(g_i' \neq g_i\),有:
所以从异或和为 \(s\) 的状态出发,不可能一步到达异或和仍为 \(s\) 的状态。
特别地,异或和为 \(0\) 的状态不能一步走到异或和仍为 \(0\) 的状态。
第二步:若 \(s \neq 0\),总能一步走到异或和为 \(0\) :
设当前异或和:
取 \(s\) 的最高二进制位,记为第 \(k\) 位。因为异或和该位为 \(1\),所以一定存在某个 \(g_i\),它的第 \(k\) 位也是 \(1\)。
令:
因为 \(s\) 的最高位是第 \(k\) 位,而 \(g_i\) 的第 \(k\) 位为 \(1\),所以异或后第 \(k\) 位变成 \(0\),更高位不变,因此:
又因为 \(g_i\) 是 \(mex\) 值,所有小于 \(g_i\) 的非负整数都必须在 \(x_i\) 的后继 \(SG\) 值中出现。所以存在 \(x_i\) 的某个后继 \(x_i'\),使得:
于是把第 \(i\) 个子游戏从 \(x_i\) 走到 \(x_i'\),新的异或和变成:
所以只要当前异或和非 \(0\),就一定存在一步走到异或和为 \(0\) 的状态。
第三步:结论
结合前两步:
- 异或和为 \(0\) 的状态,所有后继异或和非 \(0\);
- 异或和非 \(0\) 的状态,存在后继异或和为 \(0\);
- 终止状态所有子游戏都终止,\(SG\) 值全为 \(0\),异或和为 \(0\)。
这正好符合必败态/必胜态的递归定义:
- 必败态:所有后继都是必胜态;
- 必胜态:存在后继是必败态。
所以:
是必败态;
是必胜态。
更完整地说,整个和游戏的 \(SG\) 值就是异或和。这就是 \(SG\) 定理为什么正确。
直观理解:
\(SG\) 函数的核心思想是:
任何公平组合游戏都可以等价成一堆 \(Nim\) 石子。
一个 \(SG\) 值为 \(k\) 的状态,具有类似“大小为 \(k\) 的 \(Nim\) 堆”的性质:
- 它可以走到所有 \(SG\) 值小于 \(k\) 的后继;
- 它不能走到 \(SG\) 值仍为 \(k\) 的后继。
而 \(Nim\) 游戏中,大小为 \(k\) 的堆可以取成任意大小小于 \(k\) 的堆,但不能保持 \(k\) 不变。因此 \(SG\) 值就是该游戏在“加法组合”意义下的 \(Nim\) 堆大小。
多个子游戏的 \(SG\) 值异或,正是 \(Nim\) 的胜负判定方式:
所以 \(SG\) 定理本质上把任意公平组合游戏化归为 \(Nim\)。

浙公网安备 33010602011771号