【笔记】博弈论

UPD:你的 SG tmd白学了
当一个局面的下一步能形成若干局面时,这个“若干局面”也是一种局面,其 SG 值等于这些局面的 SG 的异或和;同时,若一个局面能有多种方式形成若干种状态(若干种局面),那么这个局面的 SG 就是这些局面的异或和
例题 LOJ1199

公平组合游戏(ICG)

对于 ICG ,我们有如下定义:

  • 两名选手
  • 两名选手轮流行动,每一次行动可以在有限合法操作集合中选择一个
  • 游戏的任何一种可能的局面(position),合法操作集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、概率或者其它因素;局面的改变称为“移动”(move)
  • 如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负

对于第三条,我们有更进一步的定义Position,我们将Position分为两类:

  • P-position:在当前的局面下,先手必败
  • N-position:在当前的局面下,先手必胜

它们有如下性质:

  • 合法操作集合为空的局面是P-position
  • 可以移动到P-position的局面是N-position
  • 所有移动都只能到N-position的局面是P-position

对于一个 ICG ,游戏的进行可以看作在一个由局面抽象成节点的有向图上轮流行走。

Nim 游戏

Alice 和 Bob 放置了 N 堆不同的石子,编号 1..N ,第 i 堆中有 Ai 个石子。
每一次行动, Alice 和 Bob 可以选择从一堆石子中取出任意数量的石子。至少取 1 颗,至多取出这一堆剩下的所有石子。
Alice 和 Bob 轮流行动,取走最后一个石子的人获得胜利。

是个 ICG 。显然每个局面都是必胜/必败中的一种。
除了套模板解决外,有一个结论:

对于一个局面,当且仅当 A1 xor A2 xor … xor AN = 0 时,该局面为P局面。

证明:

设 A1 xor A2 xor … xor AN = k
我们定义 k = 0 为必败, k != 0 为必胜,要证明其实际与 N/P-position 同构
当 Ai 全为 0 , k = 0 ,必败
当 Ai 不全为 0 且 k != 0 ,必存在一种方法,操作后使 k = 0 :设 k 二进制最高位 1 在第 j 位,找到一个 Ai 满足第 j 位为 1 ,令 Ai 变为 Ai xor k(显然 Ai xor k < Ai)
当 Ai 不全为 0 且 k = 0 ,由异或性质,显然必不存在一种方法,操作后仍使 k = 0

SG 函数

考虑一个游戏:在一个有向无环图上交替移动一枚棋子。
显然这是个 ICG (对于大多 ICG ,只要无环/不出现循环局面,都可以建这么个 DAG) 。
在这个图上定义 SG(Sprague-Garundy) 函数:

mex 运算表示最小的不属于这个集合的非负整数。
图的每个顶点的 SG 函数 sg 如下:sg(x) = mex{ sg(y) | y是x的后继 } 。

从是否为零的角度来看,显然顶点 x 所代表的 postion 是 P-position 当且仅当 sg(x) = 0 。
(我们用 SG 函数来考察 Nim 游戏,发现每个石堆(子游戏)对应的 SG 值即为石子个数,这说明...)

改一下游戏,如果有多个棋子,即有多个局面且可选择其中一个操作(或者说原游戏由多个互不干扰的子游戏组成),那么有结论:

原游戏的 SG 值是所有子游戏的 SG 值的异或和。

这个原游戏的 SG 值的意义,即其是 P-position 当且仅当 sg(x) = 0 。
证明:

如果当前局面,所有 sg 函数的值都是零,认为先手必败。对其分类讨论一下。如果当前局面上的所有棋子都不能走了,显然它们的 sg 函数值都是零,那么先手必败。如果还有棋子能走,我们可以选一个棋子走一步,那么这个棋子的 sg 函数值就会变成非零。非零说明什么,说明当前棋子所在结点的孩子结点一定有一个 sg 函数值为零,那对手只要将棋走到那个结点就行了。然后局面就又变成了原来的。
前面那个其实相当于终止局面,如上进行必然会到达都无法操作的局面。
那普通局面就相当于有 sg 函数的值不为零。还是分类讨论。如果现在对手走,此时各棋子 sg 值异或和为零(而你有办法让对手必败),他会选一个棋子,然后放到它的孩子结点上。这个棋子的 sg 值有可能增加,也有可能减少。只要 sg 值增加,你就把它还原成原来的值(根据 sg 函数的定义显然),那么你能保证 sg 函数值只能下降。那这不是一个 nim 游戏吗?根据 nim 游戏里面的证明,你一定可以找到一个棋子,移动到一个 sg 更小的特定子节点后,各棋子异或和还是零。最终对手就会被逼迫到终止局面上,然后就输了。反之,对手一定能让你输。

由上看来,Nim 游戏像是 SG 的特例,SG 也像是用 mex 处理得到的 Nim 游戏。而不少 ICG 都能用 SG 函数做。

Anti-Nim

如果有 N 堆石子,最后取完者判负呢?
考虑在 Nim 中,最后关头只剩一堆石子了,我们把它全部取走就能赢。条件是异或和不为 0 。
那么在 Anti-Nim 中,我们同样的操作,直到最后只剩一堆石子,取剩下一个就能让对手输。
如果这堆石子就只有一个呢,那怎么玩?我们就得做点调整...
策略:

当至少有两堆的石子数大于 1 时,拿法跟常规的 Nim 一样。当对手走完某一步后只剩一堆石子数大于 1 时,将那一堆石子变成 0 或者 1 ,从而保证有奇数个石子数为 1 的堆。

这个策略需要补充一点:局面肯定会快进到"只剩一堆石子数大于 1 ",这时凭什么轮到你?因为根据 Nim 的走法,你走完后场上异或和必为 0 ,所以这个局面只能是对手留下的。
那么我们就得出了判断方法,先手必胜当且仅当:

a. SG 值不为 0 (即所有堆的石子数异或和不为 0)
b. SG 值为 0 ,且所有堆的石子数均为 1 (即有偶数个堆)

我们还要稍微补充的是为什么 SG 为 0 时只能是 (b) 情况还能赢。
SG 为 0 且有堆的石子数大于 1 ,那至少有两堆大于 1 ,那先手操作完,SG 值变成非 0 且至少有一堆大于 1 ,这对于对手来说是必胜状态。

阶梯博弈

题目:
luogup2575 记搜 + 状压
[SDOI2009]E&D 打表 + 大眼观察法(

引链:
A_Comme_Amour:[学习笔记] (博弈论)Nim游戏和SG函数

posted @ 2021-02-14 22:44  zrkc  阅读(150)  评论(0)    收藏  举报