Loading

【理论】博弈论与 SG 函数

本文讲述的均为双人公平组合游戏。

即满足:

  • 对于同一个状态 \(G\),两个人的可能行动集合是相同的,两个人轮流行动。
  • 两个人都知道这个游戏的所有信息,包括实时的状态,对方的操作等。
  • 每一步操作具有确定性,不包含随机成分。
  • 一定能够分出胜负,即无平局。

同时,一般来说默认两个人都绝顶聪明,一切操作以自己能够胜利为最终目的。

定义函数 \(W(G)\),其值在 \(G\) 状态为先手必胜是为 \(1\),后手必胜时为 \(0\),终止态对应的 \(W(G)=0\)

考虑如何递推 \(W(G)\)

  • \(\exists G\to G',W(G')=0\) 时,\(W(G)=1\)
  • \(\forall G\to G',W(G')=1\) 时,\(W(G)=0\)

\(G\to G'\) 时,原来的先手转化为了现在的后手,而原来的后手此时转化为了先手。所以原来的先手若想获胜,一定要将状态转移到一个先手必败的状态,若这样便能够获胜,如果能够转移到的状态全部为先手必胜,那便无论如何也无法获胜。

由此,我们得到了 \(W\) 的递推式。

上边的这些东西比较显然,仅当做热身,下面进入重点。

定义 \(\operatorname{SG}(G)=\operatorname{mex}\limits_{G\to G'}\operatorname{SG}(G')\),终止态对应的 \(\operatorname{SG}(G)=0\)

对于一个数集 \(S\) 而言, \(\operatorname{mex} S\) 定义为最小的没有在 \(S\) 中出现的自然数,即满足性质:

  • \(\forall x\in[0,\operatorname{mex} S)\cap\mathbb N,x\in S\)

  • \(\operatorname{mex} S\notin S\)

很显然,简单归纳可以得到 \(\operatorname{SG}(G)=0\)\(W(G)=0\)\(\operatorname{SG}(G)>0\)\(W(G)=1\),所以我们同样可以通过 \(\operatorname{SG}\) 函数来判断先手必胜/必败。

但很显然,目前的 \(\operatorname{SG}\) 函数没有体现任何相比 \(W\) 函数的优越性。

接下来进入最为重要的 \(\operatorname{SG}\) 定理。

该定理解决的内容为多个独立的博弈叠加后的胜负判断问题。

如何定义“独立的博弈”?假设两个独立的博弈状态 \(A,B\) 叠加后的状态为 \(A+B=(A,B)\),那么接下来的一次操作只能使 \((A,B)\to (A',B)\operatorname{or}(A,B')\),换言之,独立即你无法同时改变这两个博弈状态,其中一个博弈状态的改变并不会导致另一个博弈状态的改变。

\(\operatorname{SG}\) 定理:\(\operatorname{SG}(A+B)=\operatorname{SG}(A)\operatorname{xor}\operatorname{SG}(B)\)

证明略有些复杂,令 \(y=\operatorname{SG}(A+B)\)\(G=A+B=(A,B)\),我们首先可以根据 \(\operatorname{mex}\) 的定义转化我们需要证明的东西,即证明:

  • \(\forall x\in[0,y)\cap\mathbb N,\exists G\to G',\operatorname{SG}(G')=x\)

  • \(\forall G\to G',\operatorname{SG}(G')\ne y\)

这个证明采用归纳证明的方式,即对于后继状态 \(G'\) 默认了 \(\operatorname{SG}\) 定理的存在。

我们先来证明 \(\forall x\in[0,y)\cap\mathbb N,\exists G\to G',\operatorname{SG}(G')=x\),这个证明非常的人类智慧,至少我是不知是如何考虑到的:

考虑对于每个 \(x\in[0,y)\cap\mathbb N\) 分别考虑,令 \(z=x\operatorname{xor}y\),那么设 \(z\) 的二进制最高位为 \(k\),根据异或的性质,显然 \(x,y\) 在比 \(k\) 更高的位置上是相同的,而它们两者在 \(k\) 位上一个为 \(1\) 一个不为 \(1\),由于有 \(y>x\),所以我们得到 \(y\) 二进制的第 \(k\) 位为 \(1\)

又因为 \(y=\operatorname{SG}(A)\operatorname{xor}\operatorname{SG}(B)\),所以 \(\operatorname{SG}(A)\)\(\operatorname{SG}(B)\) 中必然恰有一个二进制第 \(k\) 位为 \(1\),不妨设 \(\operatorname{SG}(A)\) 的二进制第 \(k\) 位为 \(1\)(常用手法,因为在 \(\operatorname{SG}\) 定理中 \(A,B\) 对称),考虑 \(z\operatorname{xor}\operatorname{SG}(A)\) 相比 \(\operatorname{SG}(A)\) 会将第 \(k\) 位的 \(1\) 变成 \(0\),而由于 \(k\) 位已经是 \(z\) 的二进制最高位所以不会影响 \(\operatorname{SG}(A)\) 高于 \(k\) 位的值,所以我们得到了一个关键的性质,即 \(z\operatorname{xor}\operatorname{SG}(A)<\operatorname{SG}(A)\)

根据 \(\operatorname{SG}\) 函数的定义(所有小于 \(\operatorname{SG}(A)\) 的值都有一个 \(\operatorname{SG}(A\to A')\) 与之对应),必然 \(\exists A\to A',\operatorname{SG}(A')=z\operatorname{xor}\operatorname{SG}(A)=x\operatorname{xor}y\operatorname{xor}\operatorname{SG}(A)=x\operatorname{xor}(\operatorname{SG}(A)\operatorname{xor}\operatorname{SG}(B))\operatorname{xor}\operatorname{SG}(A)=\operatorname{SG}(B)\operatorname{xor}x\)

由于是归纳证明,我们可以对 \(A'+B\) 使用 \(\operatorname{SG}\) 定理,有 \(\operatorname{SG}(A'+B)=\operatorname{SG}(A')\operatorname{xor}\operatorname{SG}(B)\),将 \(\exists A\to A',\operatorname{SG}(A')=\operatorname{SG}(B)\operatorname{xor}x\) 带入得 \(\exists A\to A'\operatorname{SG}(A'+B)=(\operatorname{SG}(B)\operatorname{xor}x)\operatorname{xor}\operatorname{B}=x\)

也即 \(\exists G\to G',\operatorname{SG}(G')=x\),由于我们对于所有 \(x\) 都进行了证明,所以第一条成功得证。

考虑证明 \(\forall G\to G',\operatorname{SG}(G')\ne y\),了解了上一条的证明方法这个就比较显然了,考虑反证,设 \(\exists G\to G',\operatorname{SG}(G')=\operatorname{SG}(A'+B)=\operatorname{SG}(A')\operatorname{xor}\operatorname{SG}(B)=y=\operatorname{SG}(A)\operatorname{xor}\operatorname{SG}(B)\),由此可以得到 \(\operatorname{SG}(A')=\operatorname{SG}(A)\),显然这与 \(\operatorname{SG}(A)\) 的定义相矛盾,那么第二条也得到的证明。

综上,\(\operatorname{SG}\) 定理得证。

可使用 \(\operatorname{SG}\) 定理对 \(\text{Nim}\) 游戏进行胜负的判断。

\(\text{Nim}\) 游戏的规则如下:

\(n\) 堆石子,每一堆有 \(a_i\) 个石子,两个人轮流取石子,每次每个人可以在任意一个未被取完的堆中取任意多颗石子(不能不取),最后无石子可取的人输。

观察到,每一堆实际上都是独立的,这引导我们使用 \(\operatorname{SG}\) 定理解决问题,如果我们把每一堆对应的 \(\operatorname{SG}\) 值求出,问题便迎刃而解。

我们经过简单的分析可以得出结论,当一堆有 \(i\) 颗石子时,其函数值 \(\operatorname{SG}(G)=i\),可以归纳证明,因为可以取任意颗石子,所以所有小于 \(i\) 颗石子的状态都可以被转移到,因此 \([0,i)\) 的所有整数都能被取到,故有 \(\operatorname{SG}(G)=i\),那么根据 \(\operatorname{SG}\) 定理,所有堆加起来的 \(\operatorname{SG}(G)=\operatorname{SG}(G_1)\operatorname{xor}\operatorname{SG}(G_2)\operatorname{xor}\cdots\cdots\operatorname{xor}\operatorname{SG}(G_n)=a_1\operatorname{xor}a_2\operatorname{xor}\cdots\cdots\operatorname{xor} a_n\),由此,该问题得到解决。

接下来我们来考虑一种 \(\text{Anti}\) 规则下的博弈论。

\(\text{Anti}\) 规则是什么意思?即其满足终止态对应的 \(W(G)=1\),对应到 \(\text{Nim}\) 游戏中,就是最后一个取石子的人输。

接下来我们要证明 \(\operatorname{SJ}\) 定理,其表述为在 \(\text{Anti}\) 规则下,各独立的博弈 \(G_1,G_2,\cdots\cdots,G_n\) 叠加后先手必胜当且仅当如下之一成立:

  • \(\operatorname{xor}\limits_{i\leq n}\operatorname{SG}(G_i)=0,\max_{i\leq n}\operatorname{SG}(G_i)\leq1\)

  • \(\operatorname{xor}\limits_{i\leq n}\operatorname{SG}(G_i)\ne0,\max_{i\leq n}\operatorname{SG}(G_i)>1\)

考虑归纳证明:

\(G=G_1+G_2+\cdots\cdots+G_n\),我们可以根据判定将 \(G\) 分为 \(4\) 类:

  • \(1.\) \(\operatorname{xor}\limits_{i\leq n}\operatorname{SG}(G_i)=0,\max_{i\leq n}\operatorname{SG}(G_i)\leq1\)\(W(G)=1\))。

  • \(2.\) \(\operatorname{xor}\limits_{i\leq n}\operatorname{SG}(G_i)=0,\max_{i\leq n}\operatorname{SG}(G_i)>1\)\(W(G)=0\))。

  • \(3.\) \(\operatorname{xor}\limits_{i\leq n}\operatorname{SG}(G_i)\ne0,\max_{i\leq n}\operatorname{SG}(G_i)\leq1\)\(W(G)=0\))。

  • \(4.\) \(\operatorname{xor}\limits_{i\leq n}\operatorname{SG}(G_i)\ne0,\max_{i\leq n}\operatorname{SG}(G_i)>1\)\(W(G)=1\))。

显然终止态属于 \(1\) 类,对应的 \(W(G)=1\),此作为归纳前提。

考虑证明非终止态的 \(1\) 类的 \(W(G)=1\),由 \(W\) 函数的定义,不难发现只需要证明其可转移到 \(3\) 类即可,由于是非终止态,所以必然存在一个 \(\operatorname{SG}(G_i)=1\),令 \(G_i\to G'_i\) 使得 \(\operatorname{SG}(G'_i)=0\),此时总异或和为 \(1\)\(\operatorname{SG}_{\max}\leq1\),转移到了 \(3\) 类。

证明 \(2\) 类的 \(W(G)=0\),即需要证明其只能转移到 \(4\) 类,由于 \(\operatorname{xor}\) 的性质,至少有两个 \(\operatorname{SG}(G_i)>1\)\(G_i\)(因为异或和为 \(0\),值 \(>1\) 就代表了其在二进制上有 \(2^k(k\ge1)\) 的位,所以必然需要同样包含此位的进行抵消,这样个数便必然大于 \(1\) 个),因此将一个 \(G_i\) 转移之后,最大值依然 \(>1\),同时转移后异或和显然非 \(0\),因此只能转移到 \(4\) 类。

证明 \(3\) 类的 \(W(G)=0\),即需要证明其只能转移到 \(1\) 类,由于 \(\operatorname{SG}_{\max}\leq1\),所以一次转移只能将一个位置上的 \(\operatorname{SG}\) 值从 \(0\)\(1\) 或者是从 \(1\)\(0\),而原异或和只能为 \(1\),因此转移后的异或和为 \(0\),转以后的 \(\operatorname{SG}_{\max}\) 也显然 \(\leq1\),因此只能转移到 \(1\) 类。

证明 \(4\) 类的 \(W(G)=1\),即需要证明其可转移到 \(2\operatorname{or}3\) 类即可,分类讨论,若 \(\operatorname{SG}\)\(>1\) 的有 \(1\) 个,则将其改为 \(0\operatorname{or}1\),可转化为 \(3\) 类,若 \(\operatorname{SG}\)\(>1\) 的有 \(>1\) 个,那么依然考虑经典 \(\operatorname{SG}\) 证明的思路,考虑这些 \(\operatorname{SG}\) 值的异或和 \(x\) 的最高位 \(k\),那么选择将二进制位第 \(k\) 位为 \(1\) 的那个 \(\operatorname{SG}\)\(y\) 转移,很显然有 \(x\operatorname{xor}y<y\),因此可以转移的到,再根据 \(1\) 的个数决定二进制第 \(0\) 位的值,所以这样的话一定可以转化为 \(4\) 类。

我们证明了 \(\operatorname{SJ}\) 定理。

\(\text{Anti-Nim}\) 问题:

直接带入 \(\operatorname{SJ}\) 定理即可。

\(\text{Nim}_k\) 问题:

其它条件同经典 \(\text{Nim}\) 问题,不过每次可以同时操作 \(1\sim k\) 堆石子。

结论是将所有 \(\operatorname{SG}\) 值转化为二进制后做 \(k+1\) 进制的不进位加法,和非 \(0\) 则先手必胜,反之后手必胜。

证明后面补。

\(\text{Anti-Nim}_k\) 问题:

结论同 \(\text{Anti-Nim}\) 问题,将异或和替换为转化为二进制后做 \(k+1\) 进制的不进位加法和即可。

证明后面补。

参考博客:

博弈论小记 By command_block

posted @ 2023-01-12 15:22  lstqwq  阅读(121)  评论(0编辑  收藏  举报