背景
本人长期徘徊于弥补多项式短板/写字符串爽题/码毒瘤数据结构/看数学书这四件奇怪的事情上,因此水平很菜。
以前接触过一点简单的博弈论,但那实在是太简单了,就是对抗搜索(Min-Max)。
近期训练,做到了一道SAMParent-Tree上倍增之后博弈的题目,SAM都码完了,一看那个博弈,越看越慌,发现自己根本不会:何止不会,一分都拿不到。
于是开始恶补博弈论,发现很妙,但是挺好理解的。
本文因为作者被作业抓走了,暂时没有完成纳什均衡的内容。
update:发现那道促使我学习博弈论的题目是道假题,具体可以看我在anti-NIM里的内容
一些资料
oi-wiki 基本可以博弈论入门了
SG函数入门及例题 这篇文章良心
anti-NIM问题入门 很短,anti-NIM建议把SG搞懂之后作为一个应用加深了解
纳什均衡的一个例子 初步演示纳什均衡在OI中的用法
纳什均衡/划线法 这篇文章我弄出来,只是为了说明划线法(哔——)得不得了
纳什均衡/靠谱计算方法 个人认为是比较靠谱的纳什均衡计算方法(疯狂diss划线法)
纳什均衡/混合策略 (FBI Warning)这玩意儿太神仙了,个人计划如果有时间找一本博弈论的书来学习这一块内容,但讲道理OI里面大概是不会出现这种东西的(搞个纳什均衡出来就不错了)。
纳什均衡/生动例子(雾 这可是我太爷爷的太爷爷关注的up主[doge]手动滑稽
相信大家看出来了,我不想写纳什均衡,于是资料收集了很多。
平等组合游戏
一些定义、约定及基本规律
- 平等组合游戏(不严谨)
- 两个人参与,且一胜一负
- 每个人面对所有局面的可能选择都是一样的
- 游戏总能结束,即,可以把所有状态抽象成点,选择抽象成边,游戏会变成\(DAG\)
- 一般而言不能操作者输(不能操作者赢就是anti-NIM问题)
- N-position&P-position
- 对于一个状态,如果当前获得这个状态的人能获胜,则称之为N-position(Now)
- 对于一个状态,如果前一个状态转移过来的人能获胜,则称之为P-position(Pre)
- 如果一个状态是N-position,则他一定可以转移到一个P-position
- 如果一个状态是P-position,则他的所有转移都一定指向N-position
Min-Max搜索
作用及简介
就是搜索平等组合游戏最暴力的方法,你能用这个方法得出几乎所有这类问题的指数级暴力算法
很基础,所以也没什么好讲的。
大致流程
先抽象状态,然后写暴力从题目给定的初始状态出发,用基本事实以及边界条件判断每个状态是N还是P。
因此,记忆化搜索是常用的。
可以结合这样一个问题来理解这个过程:
- Alice和Bob在做游戏,这个游戏是在一个\(n\times n\)棋盘上进行的,棋盘中每个格子都有一定的金币,Alice和Bob轮流操控一枚初始时在棋盘左上角的棋子,每人每次移动一格,并收集目标格子里的金币(重复经过可重复收集),每轮Alice移动一次之后Bob移动一次,共移动\(m\)轮。
- 因为Alice是mhw,所以所有金币全部归她,而Bob会一无所有。自然地,Alice希望最大化收集到的金币数,而Bob则希望最小化这个数值。
- 给出棋盘大小,每个格子里的金币数,进行的轮数,求最终Alice可以获得多少金币。
(原创题,但是也许比较经典,会在什么地方有类似的题目)
NIM问题
简介
这几乎是博弈论里面最经典的问题了。后文的SG函数以及anti-NIM问题的理解基本都要以其作为基础。
描述
现在你有\(n\)堆石子,第\(i\)堆石子有\(a_i\)个。两个人轮流进行游戏,每次可以从任意一堆中拿走任意数量的石子,但不能不拿,不能行动的人就输了。问是先手必胜还是后手。
结论
先手能获胜,当且仅当\(a_1\) ^ \(a_2\) ^ \(a_3\) ^ ... ^ \(a_n\neq0\)
换言之,就是一个状态异或和不为0就是N-position,一个状态异或和为0就是P-position
证明
最终获胜者的最后一步操作,在异或和上的体现,就是从非0变成了0。
接下来,只要证明有这样一种方法,使得非0的异或和减去一个数字之后异或和就能变成0。
- 设当前异或和为\(k\),其二进制下最高位是第\(d\)位,则必有\(a_i\)第\(d\)位是1。我们将这个\(a_i\)变为\(a_i^{\prime}=a_i\) ^ \(k\)
- 考虑到\(k\)与\(a_i\)在第\(d\)位上都为1,因此\(a_i^{\prime}\)在第\(d\)位上为0,因此\(a_i^{\prime}<a_i\),移动合法。
而对方在拿到了一个异或和为0的状态之后,不论怎么移动,移动完异或和必定不为0
我们就给出了一个构造性的证明。
SG函数
定义及约定
- 我们假定这样一种游戏模型:一张\(DAG\)上选择了\(n\)个点\(a_1,a_2,a_3,...,a_n\),每次操作者可以选择一个点,沿着这张\(DAG\)的一条边走一步,不能走的人就输了,问先手胜还是后手胜。
- \(mex(S)=\min\limits_{n\in N,n\notin S}{n}\),就是不在集合\(S\)中的最小非负整数。
- \(sg(x)=mex\left(\left\{sg(y)|x\rightarrow y\right\}\right)\),其中\(x\rightarrow y\)这个表达可能不正规,是状态\(x\)可以转移到状态\(y\)的意思。
- 我们称一个游戏在\(A=\{a_1,a_2,...,a_n\}\)这个初始状态下的\(SG(A)\)为\(sg(a_i)\)的异或和。
定理
一个状态\(A\)是N-position(先手获胜),当且仅当\(SG(A)\neq0\)
证明
我们发现这个东西真的与NIM问题很像。
- 考虑\(DAG\)上没有出边的点,其\(sg\)一定为0,而一个人输了,就是他拿到的状态里所有的点都没有出边。因此此时这个状态\(SG=0\),是P-position。
- 考虑一个点\(a\),如果\(sg(a)=k\),则他能转移到的状态b中,一定有\(sg(b)=0,sg(b)=1,...sg(b)=k-1\)的,这一点与NIM问题很像,因为NIM中,我们也可以把一堆\(k\)个的石子变成\(0,1,2,...,k-1\)个中的任意一个。
- 那么,当我们遇到一个\(SG(A)\neq0\)的状态的时候,我们可以把\(sg\)的值的大小看作这一堆的石子数,借用上面NIM问题的方法,把状态\(a_i|highbit(sg(a))=highbit(SG(A))\),变为一个\(sg\)值为\(sg(a)\) ^ \(SG(A)\)的状态\(a_i^{\prime}\)即可。
- 同样的,一个\(SG(A)=0\)的状态,进行一步改变,\(SG(A^{\prime})\)是一定会不等于0的。
anti-NIM
我下文的讨论是不成熟的,他只针对取石子的NIM问题有效,或者能够证明任何\(sg=0\)的状态要么没有出边,要么有连向\(sg\)值为1的点的出边。
其实我在背景里提到的那个促使我学习博弈论的题目就因为这个东西假了。
证明的问题在写作本文是发现,待完善后更新
描述
其他条件与SG函数中约定的那个问题模型相同,只是我们称一步都不能走的人是赢家。
定理
对于一个状态\(A\):
- 若\(\max a_i\leq 1\),则其为N-position当且仅当\(SG(A)=0\)
- 若\(\max a_i>1\),则其为N-position当且仅当\(SG(A)\neq0\)
证明
- \(\max a_i>1\)。
- 若\(SG(A)\neq0\)
- 当有多个\(a_i>1\)时,与\(SG\)函数里的证明差不多,我们总能将\(SG(A')\)变为0
- 当只有一个\(a_i>1\)时,我们发现修改后会造成\(\max a_i\leq1\),我们应当使得\(SG(A')\)不为0。假设我们沿用原来的方法,求得\(a_i\)应变为\(a_i'\),则我们实际应将之变为\(a_i''=a_i'\) ^ \(1\)。此时易知\(a_i''\in\{0,1\}\),因此我们就成功转移到了一个P-position,并且\(a_i\rightarrow a_i''\)是合法的转移
- 若\(SG(A)=0\)
- 此时一定有超过1个\(a_i>1\),因此\(SG\)函数那里的讨论依然适用。
- 若\(SG(A)\neq0\)
- \(\max a_i\leq1\)
- 若\(SG(A)=0\)
- 完了,证明错了,这怕不是个假结论
- 若\(SG(A)=0\)