博弈论与 SG 函数

介绍

玩游戏。

小性质

  • 对于一个状态,如果没有后继状态,该状态必输。
  • 对于一个状态,如果该状态后有一个必输状态,则该状态为必赢状态。
  • 对于一个状态,如果该状态后全为必赢状态,则该状态为必输状态。

Nim 游戏

考虑这样一个游戏,有 \(n\) 石子,每堆有 \(a_{i}\) 个石子,两个人轮流拿石子,不能操作的人输。若两个人都采用最优策略,先手必赢还是必输。

首先可以构造状态图对吧,这样时间复杂度是 \(O(\prod_{i=1}^{n} a_{i})\)

考虑优化。

先给出结论,当所有数异或和为 \(0\) 先手必胜,否则必输。

证明:

对于异或和不为 \(0\) 的一个状态,设它的异或和为 \(k\),可以将一个 \(a_{i}\) 异或 \(k\) 使得下个状态的异或和为 \(0\)。这样的操作总是可行的,设 \(k\) 的最高位是 \(p\),则 \(p\) 在每堆石子的个数中至少出现了一次,那么考虑将他异或 \(k\),这样他的最高位就变成 \(0\) 了对吧,有 \(a_{x} \oplus k < a_{x}\)

考虑异或为 \(0\),那么对于任意一个上述操作都是不合法的。

所以此时异或为 \(0\) 只能转移到异或不为 \(0\),异或不为 \(0\) 都可以直接转移到异或为 \(0\)。而异或为 \(0\) 为必输状态,所以得证。

SG 函数

好用!考虑改一个状态定义它的值,即为 \(SG(x)\)。具体是怎么计算的的呢?\(SG(x)=mex\{SG(后继状态)\}\)\(mex\) 运算为不在集合中的最小非负整数。因为汇点没有后继状态,所以汇点的 \(SG\) 值为 \(0\)。同样可知,任何 \(SG(x)\ne 0\)\(x\) 点因为后继状态有 \(SG(x)=0\) 的,所以为必赢,所有 \(SG(x)=0\) 的都必输,因为所有后继节点都有 \(SG(x) < 0\)。递归的一层一层理解即可。

考虑同时有多个 \(SG\) 状态,如何表示整个游戏的输赢呢?由于每个 \(SG(x)-1\)\(0\) 的值都是 \(x\) 点的后继,当 \(SG(x)=0\) 时必输,所以变成了一个 Nim 游戏,当无法变换 \(SG\) 时算输,每次操作相当于减去 \(SG\) 的一些值。 所以当 \(SG(x)\) 的异或和为 \(0\) 时,先手必败,否则先手必胜。

这便是博弈。

posted @ 2024-08-19 18:42  PM_pro  阅读(68)  评论(0)    收藏  举报