博弈论学习札记
博弈论,既是现代数学的一个新分支,也是运筹学的一个重要学科。
博弈论是二人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜的目的。
无偏博弈是博弈的一种,在 \(\text{OI}\) 中最为常见,一般是研究两个人玩游戏,要你判断输赢。
为了使游戏绝对公平,我们要求其必须满足如下条件:
-
两个人轮流操作
-
两个人知道的信息是相同的
-
所有可行的操作与当前最优的操作只与当前状态相关,与玩家无关
满足上述条件的游戏称为无偏博弈或有向图博弈。一般来说,无法操作的人判负。
无偏,很好理解,就是绝对公平,游戏不会偏向哪一方,换句话说两个人除了先后手以外毫无区别。
至于有向图在哪里呢?我们把所有可能的游戏状态抽象成节点,如果一个玩家可以通过操作将 \(A\) 状态转化为 \(B\) 状态,那么 \(A\) 向 \(B\) 连一条有向边,称 \(B\) 是 \(A\) 的后继状态。不妨设 \(A\) 的后继状态为 \(\operatorname{nxt}(A)\)。
那么,所有的无偏博弈便可抽象为一张有向图,有一颗棋子在某个节点上,两人轮流移动棋子,不能移动的判负。
当然,有向图不一定是 \(\mathrm{DAG}\),所以可能会出现两个人不厌其烦地走环的情况,如果有些题目出现了,那么你还要判断是否是平局。
显而易见地,因为博弈双方都绝顶聪明,当前最优的操作一定是确定的,只与棋子在哪个节点有关,与玩家无关。
所以,五子棋是无偏博弈吗?不是,因为一方只能下黑子,另一方只能下白子,可行的操作与玩家有关,不符合第三个条件。
斗地主是无偏博弈吗?不是,因为有三个玩家,而且一方不知道其他人的牌,两个人知道的信息不同,不符合第一、二个条件。
如果你还不太懂,结合几个无偏博弈来看一下。
\(\text{Bash}\) 博弈
有一堆 \(n\) 个石子。
两名玩家轮流在石子堆中拿石子,每次至少取 \(1\) 个,至多取 \(m\) 个。
无法取石子的玩家判负。
一个状态可以用一个自然数 \(n\) 来表示,即石子数为 \(n\)。
则 \(\operatorname{nxt}(n)\) 为 \(\{n-1,n-2,\cdots,n-\min(n,m)\}\)。
\(\text{Wythoff}\) 博弈
有两堆石子,石子数可以不同。
两人轮流取石子,每次可以在一堆中取,或者从两堆中取走相同个数的石子。
数量不限,无法取石子的玩家判负。
一个状态可以用数对 \((a,b)\) 来表示,即第一堆有 \(a\) 个石子,第二堆有 \(b\) 个石子。
则 \(\operatorname{nxt}(a,b)\) 为 \(\{(a-1,b),(a-2,b),\cdots,(0,b),(a,b-1),(a,b-2),\cdots,(a,0),(a-1,b-1),(a-2,b-2),\cdots,(a-\min(a,b),b-\min(a,b))\}\)。
\(\text{Nim}\) 博弈
有 \(n\) 堆石子,数量分别为 \(x_1,x_2,x_3,\cdots,x_n\)。
两人轮流取,每次可以从任意一堆石子中取走至少一个石子。
数量不限,无法取石子的玩家判负。
可以直观地看到,以上几个博弈模型都有一些共同的特点:
一个状态可以用集合 \(\{x_1,x_2,x_3,\cdots,x_n\}\) 来表示 \(n\) 堆石子的个数。
则 \(\operatorname{nxt}(\{x_1,x_2,x_3,\cdots,x_n\})\) 为 \(\{\{x_1-1,x_2,x_3,\cdots,x_n\},\{x_1-2,x_2,x_3,\cdots,x_n\},\cdots,\{0,x_2,x_3,\cdots,x_n\},\{x_1,x_2-1,x_3,\cdots,x_n\},\{x_1,x_2-2,x_3,\cdots,x_n\},\cdots,\{x_1,0,x_3,\cdots,x_n\},\cdots,\{x_1,x_2,x_3,\cdots,1\},\{x_1,x_2,x_3,\cdots,0\}\}\)。
如果你懂了状态、后继状态、操作的概念,那么我们可以尝试判断输赢了。
先手必败态指的是在这个状态时先手必败,例如 \(\text{Bash}\) 博弈时 \(0\) 个石子的状态就是一个先手必败态,因为假设 \(\text{Alice}\) 先手,那么 \(\text{Alice}\) 无法拿石子(没有石子了)。
先手必胜态指的是在这个状态时先手必胜,例如 \(\text{Bash}\) 博弈时 \(1\) 个石子的状态就是一个先手必胜态,因为假设 \(\text{Alice}\) 先手,\(\text{Bob}\) 后手,\(\text{Alice}\) 可以把石子拿光,变成 \(0\) 的先手必败态留给 \(\text{Bob}\),这时 \(\text{Bob}\) 必败,即 \(\text{Alice}\) 必胜。
所以,如果双方都绝顶聪明,如果我面对的状态的后继状态中有一个必败态,我就可以操作成那个必败态丢给你而取胜;如果后继状态全是必胜态,我就不得不把必胜态给你,我就输了。
即先手必败态的充要条件是其后继状态全是先手必胜态,先手必胜态的充要条件是其后继状态存在先手必败态。
这可以说是一个由实际经验得到的推断,后文的胜负判断,\(\operatorname{SG}\) 定理等都是依赖于此的。
定义 \(\operatorname{mex}(\{x_1,x_2,\cdots,x_n\})\) 为集合 \(\{x_1,x_2,\cdots,x_n\}\) 中最小的未出现的自然数,例如 \(\operatorname{mex}(\{0,1,2,5,8\})=3\),\(\operatorname{mex}(\{1,3,6,9\})=0\)。
特别的,定义 \(\operatorname{mex}(\varnothing)=0\)。
这样,我们可以得到一些很显然,但有用的性质:
-
\(\operatorname{mex}(S)\notin S\);
-
对于 \(0\le i<\operatorname{mex}(S)\),有 \(i\in S\);反之,若 \(i\notin S\),有 \(\operatorname{mex}(S)\le i\)。
大名鼎鼎的 \(\operatorname{SG}\) 函数,以一个状态为输入:
其中 \(B\in\operatorname{nxt}(A)\)。同样的,我们也可以得到一些性质:
-
对于任意 \(B\in\operatorname{nxt}(A)\),有 \(\operatorname{SG}(B)\neq\operatorname{SG}(A)\);
-
对于任意 \(0\le i<\operatorname{SG}(A)\),存在一个 \(B\in\operatorname{nxt}(A)\),使得 \(\operatorname{SG}(B)=i\);反之,若不存在一个 \(B\in\operatorname{nxt}(A)\),使得 \(\operatorname{SG}(B)=i\),那么 \(\operatorname{SG}(A)\le i\)。
然后可以用 \(\operatorname{SG}\) 来判断胜负。如果对于状态 \(X\),\(\operatorname{SG}(X)=0\),则 \(X\) 是先手必败态,否则 \(X\) 是先手必胜态。
为什么呢?
想想必胜态和必败态之间的关系:
当一个状态没有后继状态时,先手无法操作,为必败态;
如果后继状态全都是必胜态时,这个状态就是必败态;
如果后继状态至少有一个必败态,那么这个状态就是必胜态。
在 \(\operatorname{SG}\) 函数中这也得到了很好的体现:
当 \(\operatorname{nxt}(X)=\varnothing\) 时,\(\operatorname{SG}(X)=\operatorname{mex}(\varnothing)=0\);
如果不存在 \(B\in\operatorname{nxt}(A)\) 使得 \(\operatorname{SG}(B)=0\),由性质二,这个状态的 \(\operatorname{SG}\) 函数值肯定为 \(0\);
如果存在一个 \(B\in\operatorname{nxt}(A)\) 使得 \(\operatorname{SG}(B)=0\),由性质一,这个状态的 \(\operatorname{SG}\) 函数值肯定不为 \(0\)。
\(\operatorname{SG}\) 函数一般先靠打表找规律,然后直接用。
好,那么有人就问了,假如我定义一个函数 \(\operatorname{BG}\),满足:
其中 \(B\in\operatorname{nxt}(A)\),\(\bigvee\) 表示逻辑或运算,\(\neg\) 表示逻辑非运算,若 \(A\) 没有后继状态则 \(\operatorname{BG}(A)=0\)。
同样有对于状态 \(X\),\(\operatorname{BG}(X)=0\),则 \(X\) 是先手必败态,否则 \(X\) 是先手必胜态,这样还简单清晰。
好,你说的对,但是 \(\operatorname{SG}\) 函数有一个很有用的定理,即 \(\operatorname{SG}\) 定理:
假设一个状态 \(X\) 是由 \(X_1,X_2,\cdots,X_n\) 组成的,每一轮玩家可以选择其中一个状态操作一步,当所有状态都无法操作时判负,那么:
其中 \(\oplus\) 为二进制按位异或运算符。
很神奇对吧?我们先举个例子来理解。
你或许听说过 \(\text{Nim}\) 博弈的先手必胜条件是 \(n\) 堆石子 \(x_1,x_2,\cdots,x_n\) 个数的异或和非 \(0\),让我们计算一下:
\(n\) 堆石子的状态可以看作是由 \(n\) 个一堆石子的状态组合而成,每一轮玩家可以选择其中一堆石子操作一步,当所有石子堆都无法操作时判负。
即:\(\operatorname{SG}(\{x_1,x_2,\cdots,x_n\})=\bigoplus\limits_{i=1}^n\operatorname{SG}(x_i)\)
再来算一下 \(\operatorname{SG}(x)\):
一个含 \(x\) 个石子的石堆可以一次性拿 \(1\sim x-1\) 个石子,所以 \(\operatorname{SG}(x)=\operatorname{mex}(\{\operatorname{SG}(0),\operatorname{SG}(1),\operatorname{SG}(2),\cdots,\operatorname{SG}(x-1)\})\):
\(\operatorname{SG}(0)=0\),\(\operatorname{SG}(1)=\operatorname{mex}(\{\operatorname{SG}(0)\})=1\),\(\operatorname{SG}(2)=\operatorname{mex}(\{\operatorname{SG}(0),\operatorname{SG}(1)\})=2\),\(\operatorname{SG}(3)=\operatorname{mex}(\{\operatorname{SG}(0),\operatorname{SG}(1),\operatorname{SG}(2)\})=3\cdots\)
不难发现 \(\operatorname{SG}(x)=x\)(数学归纳法易证)。
所以 \(\operatorname{SG}(\{x_1,x_2,\cdots,x_n\})=\bigoplus\limits_{i=1}^n\operatorname{SG}(x_i)=\bigoplus\limits_{i=1}^nx_i\)
即先手必胜条件是 \(n\) 堆石子 \(x_1,x_2,\cdots,x_n\) 个数的异或和非 \(0\)。
为什么?
下面来尝试证明一下 \(\operatorname{SG}\) 定理:
假设状态 \(X\) 是由 \(X_1,X_2,\cdots,X_n\) 组成的,即 \(X=\{X_1,X_2,\cdots,X_n\}\)。
根据结构归纳法,为了证明 \(\operatorname{SG}\) 定理,需要证明以下两点:
-
对于任意无后继状态的 \(X\),有 \(\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)=0\);
-
若对于任意 \(Y\in\operatorname{nxt}(X)\) 有 \(\operatorname{SG}(Y)=\bigoplus\limits_{i=1}^n\operatorname{SG}(Y_i)\),则 \(\operatorname{SG}(X)=\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\)。
第一条是显然的,因为如果 \(X\) 无后继状态,那么 \(X_i\) 也必定没有后继状态,故 \(\operatorname{SG}(X_i)=0\),故 \(\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)=0\)。
第二条,由 \(\operatorname{SG}\) 函数的定义,我们可以再把第二条拆成两部分:
-
对于任意 \(0\le t<\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\),均存在一个 \(Y\in\operatorname{nxt}(X)\) 使得 \(\operatorname{SG}(Y)=t\);
-
不存在一个 \(Y\in\operatorname{nxt}(X)\) 使得 \(\operatorname{SG}(Y)=\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\)。
上述两部分共同构成了 \(\operatorname{mex}(\{\operatorname{SG}(Y)\})=\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\)。
先来证第一部分:
假设 \(0\le t<\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\),由于 \(t<\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\),那么总能找到一个 \(k\),使得 \(t\) 二进制表示下第 \(k\) 位为 \(0\),\(\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\) 的第 \(k\) 位为 \(1\),\(t\) 和 \(\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\) 在比第 \(k\) 位更高的那些位上都相等。
那么考虑 \(t\oplus\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\),它高于第 \(k\) 位的那些位抵消掉了,第 \(k\) 位为 \(0\oplus1=1\),即它的最高位为第 \(k\) 位。
由于一定存在一个 \(X_i\) 使得 \(\operatorname{SG}(X_i)\) 第 \(k\) 位为 \(1\)(要不然 \(\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\) 的第 \(k\) 位就为 \(0\) 了),不妨假设是 \(X_p\),则 \(t\oplus\operatorname{SG}(X_p)\oplus\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\) 的第 \(k\) 位为 \(0\),高于 \(k\) 位的那些位与 \(\operatorname{SG}(X_p)\) 相等,故 \(t\oplus\operatorname{SG}(X_p)\oplus\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)<\operatorname{SG}(X_p)\)。
由性质二,一定存在一个 \(X_p'\in\operatorname{nxt}(X_p)\) 使得 \(\operatorname{SG}(X_p')=t\oplus\operatorname{SG}(X_p)\oplus\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\)。
那么,我将 \(X_p\) 操作成 \(X_p'\),相应的 \(X\) 变成 \(Y\),此时
\(\operatorname{SG}(Y)=\bigoplus\limits_{i=1}^n\operatorname{SG}(Y_i)\)(此处使用了大前提)
\(=\operatorname{SG}(X_p)\oplus\operatorname{SG}(X_p')\oplus\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\)(每次只能选一个状态操作一次)
\(=\operatorname{SG}(X_p)\oplus t\oplus\operatorname{SG}(X_p)\oplus\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\oplus\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\)
\(=t\)
第一部分得证。
再证第二部分:
反证法。假设你操作了 \(X_p\) 使它变成了 \(X_p'\),而导致 \(\operatorname{SG}(Y)=\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\),那么我们可以推推式子:
\(\operatorname{SG}(Y)=\bigoplus\limits_{i=1}^n\operatorname{SG}(Y_i)\)(此处使用了大前提)
\(=\operatorname{SG}(X_p)\oplus\operatorname{SG}(X_p')\oplus\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\)(每次只能选一个状态操作一次)
\(=\bigoplus\limits_{i=1}^n\operatorname{SG}(X_i)\)(由假设的前提)
得出 \(\operatorname{SG}(X_p)\oplus\operatorname{SG}(X_p')=0\),即 \(\operatorname{SG}(X_p)=\operatorname{SG}(X_p')\)。
与性质一矛盾,故假设错误,故第二部分得证。
综上所述,\(\operatorname{SG}\) 定理得证。
浙公网安备 33010602011771号