[专题总结]博弈论
东西有好多,还有一些模型没学,但是可能不太重要,碰到了在来学吧。
upd;这篇博客大部分是复习前写的,所以可能大量摘抄 cmd 博客,意义不大,仅供自我复习。
套路一:见到一个游戏先从各种角度思考能不能拆成若干个独立的游戏。
套路二:模拟一下过程,思考一些比较简单的策略,比如说后手模仿先手操作
Ex套路二:模拟一下过程,思考一些比较简单的情况,只有一堆,只有一个,等等。
套路三:特殊的游戏把SG函数的表打出来观察规律。
公平组合游戏
- 玩家交替行动
- 任意时刻,决策集合与玩家无关
- 一个状态不能被到达多次
- 不能行动的玩家判负
公平游戏只存在先手必败和先手必胜的局面,不存在平局。
可以把博弈的过程抽象成一个有向图,每次决策相当与走一步。
先手必胜状态的判定法则(挺重要的,是模型的基础)
- 无后继的状态(出度为0)是必败状态
- 必胜状态肯定可以走到必败状态
- 必败状态只能走到必胜状态
有了这个,我们就可以拓扑遍历有向图,得到每个节点是必胜态还是必败态,复杂度一般都是指数的。
SG函数
SG函数是公平组合游戏的重要的 节点评估函数 , 也是把游戏抽象出来的重要工具。
若一个点没有后继状态,则他的SG函数值是0。
否则,一个函数的SG函数值按如下规则计算。
Mex 的定义是一个集合内为出现的最小非负整数。
一个节点是必败点等价于他的SG函数值是0,必胜点等价于SG函数不为0。
来证明SG函数的正确性,我们只需要证明他满足判定法则就可以了。
1 : 无后继状态的点是必败状态 : 根据SG函数定义,无后继状态SG=0,是必败态。
2 : 必胜态可以走到必败态 : 若 \(SG(x) \not= 0\) ,则根据 Mex 定义,他的出边指向的点必定有 \(SG=0\) 的。
3 : 必败态只能走向必胜态 : 若他可以走向一个必败态,那么他的 SG 函数至少为1,不满足他是必败态的定义。
定义了一个SG函数,如果还是只能求每个点是不是必胜态,那还是完全没用的,重要的是SG定理
游戏的和及相关定理与扩展
定义游戏 \(G_1, G_2, G_3 ... G_n\) 的和 \(G\) ,他的规则是每一步选择一个 \(G_i\) ,在上面行动一步, 前提是各个 \(G_i\) 之间是独立的。
再来定义一个游戏的 \(SG\) 函数值为这个游戏起点的SG值,之后,知道一个游戏的 \(SG\) 值,它先手必胜/必败就已知了,如果两个游戏的 \(SG\) 值相同,那么不管这两个游戏规则有多大差别,他们都是等价的。
\(SG\) 定理 : \(SG(G) = XorSum_{i=1}^n \{SG(G_i)\}\)
为了理解这个定理,先来看一个 NIM 游戏。
NIM 游戏
\(n\) 堆石子,每堆 \(a_i\) 个,每次选择一堆石子,取任意个,拿走最后一颗石子一方获胜,给定 \(n\) 和 \(a_i\), 判断先手必胜/必败。
直接记录当前所有石子数量,遍历整张图得到起点的SG函数,当然是可行的,复杂度 \(\prod a_i\) 。
观察到, \(n\) 堆石子之间是独立的, 拆成 \(n\) 个游戏,每个游戏定义为有一堆石子,拿走最后一颗石子的玩家获胜,对于拆开的每个游戏,根据SG函数定义易得它如果有 \(n\) 个石子,他的 \(SG\) 值就是 \(n\) (每个点向所有小于他的点连边)。
那么,根据SG定理,NIM游戏的SG值就是 \(Xorsum \{a_i\}\) , 这个数为0时先手必败,也就是NIM游戏经典结论,这样,我们把大问题拆成了许多小问题,时间复杂度就下降了。
SG定理证明
还是证明判定法则。
1 : 在 \(G\) 中如果没有后继状态,那么必定是每个子游戏 \(G_i\) 都没有后继状态,也就是 \(SG(G_i)\) 都是0, \(SG(G)\) 就是0,满足他是必败状态,符合第一条。
2 : 一个必胜态 \(SG(G) \not= 0\) 必定可以走到 必败态 \(SG(G)=0\) , 设 \(k=SG(G)\), 考虑 \(k\) 的最高位,选出一个 \(k\) 的最高位为1的 \(SG(G_i)\) , 可知 \(SG(G_i) \oplus < SG(G_i)\) , 让 \(SG(G_i)\) 减小到 \(SG(G_i) \oplus k\)就可以了 , 因为一个状态肯定可以走到任何 \(SG\) 值小于他的状态。
3 : 一个必败态 \(SG(G) = 0\) 只能走到必胜态,都走了一步,必定存在一个 \(SG\) 值改变(一个点不可能和他能到达的点SG值相同)
这也同时证明了 NIM 游戏的结论, 这几乎是最重要的结论了。
一些经典模型
带权博弈
先手/某人 要在必胜/必败的前提下 最小/大化 得分/时间等等,但是要以必胜/败为前提,叫做带权博弈。
对于这种问题,一般的套路是先求出每个点是必胜/必败,最后分情况去转移,把必胜必败当作限制。
阶梯博弈
每个人可以通过一次操作把一堆石子推到下一层,第0层是虚无,没有操作的人失败。
思考简单的策略;你推一下,我也推一下,这样,你的推不会改变这堆石子的奇偶性。
先手在所有奇数堆石子可以胜利的前提下,对手奇数我做对应策略,对手偶数就复刻他的操作,这样该赢还是赢,该输还是输,所以直接把所有奇数堆的石子拿出来博弈即可。
分成独立的博弈
P3185 [HNOI2007]分裂游戏
最重要的思考;把每个石子看作一个独立的博弈,唯一标识是他的位置,最后的SG是所有石子的异或和。
对一个石子来说,他在位置 \(i\) 就让他有 \(m-i\) 的权值,那么每次就是把他分成两个比他小的数,利用 SG 的定理取递推每一堆的权值即可。
一维翻硬币问题
\(n\) 个硬币排成一行,有正有反,从左向右按 \(1\sim n\) 编号。
按照某种规则选取硬币集合翻转,但是受到操作的最右侧的硬币必须从正面翻到反面(否则转移可能成环)。
我们以每次最多选择两个硬币为例子,探索最重要的性质:把它们独立,例如,一个状态 00010010101
等价于 0001
0000001
000000001
00000000001
这些状态的和。
简单证明一下;把一个位置上有 \(1\) 看作有一个石子,一个操作就是把这个石子移动到一些位置上,显然这些石子是独立的,所以两个就会抵消掉,故状态可以异或。
Anti-SG
改成谁不能操作谁赢,还是原来的 SG 函数,那么,怎么把一个游戏拆分成独立的若干个游戏呢?
SG 函数等的应用离不开那三个性质:无后继的状态,以及归纳这些状态。
结论:若存在 \(SG > 1\),则 \(Xorsum\not ={0}\) 先手胜利,否则不存在, \(Xorsum=0\) 先手胜利。
基于一个简单的观察,每堆都是一,一次必定拿完且仅拿完一堆,其他都和SG的证明类似
Nim-k
每次可以同时操作 \(1,2,..,k\) 个石头堆,这样,每堆石子之间不是独立的。
结论:把每堆石子写成二进制数,再把二进制的表示直接看做 \(k+1\) 进制,然后做不进位加法,结果是 \(0\) 先手必败。
感性理解就是这么多堆石子加起来,每个位有 \([0,k]\) 的调整空间,所以不为 \(0\) 就可以一直用 SG 的经典压制保持这个状态。
正确的证明,没啥兴趣了。
二分图博弈
基本模型
给定一个点, \(\rm alice\) 先手,每次操作者移动一步并且删掉之前的点,无路可走者输,问谁胜。
这种问题就是要考虑类似 SG 函数的过程去让两个人一直归纳的去操作,得到先手/后手必胜。
结论:先手必胜当且仅当起点在所有的最大匹配中。
如果不是,先手处于非匹配点中,必须走到一个匹配点(否则形成新匹配),然后后手的策略就是走匹配边。
后手操作完之后先手在一个匹配点上,并且没有匹配边可以走,但是他肯定会走到一个匹配点,否则我们可以调整最大匹配。
那么,后手删一个匹配点,先手删一个匹配点,先没有匹配点可走的先手,他必败。
简单的扩展-1
规则:先手选择一个点,然后后手开始和上面一样的规则开始走。
结论是先手必败当且仅当存在完美匹配。 (否则先手可以选择一个不在所有最大匹配内的点让后手作为先手必败。
简单的扩展-2
给定一棵树,所有的祖孙关系都连边,问有没有完美匹配
\(f_x\) 代表 \(x\) 子树内至少需要几个祖先才有完美匹配,儿子的 dp 值加和按是否等于 0 分类转移。
`