NIM游戏|博弈论入门,SG函数
先来看一个经典游戏:
地上有
针对这个游戏,我们看看能不能归到先手必胜或者必败的局面.
首先显然每一堆石子都是0的情况下,先手必败,此时可以注意到:
这些石子个数加和为0,且所有石子个数异或和为0.
显然,这是使所有石子异或和为0的石子个数加和最小情况.
那么我们把所有操作情况按照异或和为0或不为0分类.
当石子全部异或和不为0时,假设此时异或和为k,我们将k二进制分解取最高位i.
发现对于这一情况,一定存在奇数个二进制分解包含位i的石子堆.
那么在这个情况下,我们将那一堆石子j取出来,将它变化为
整体异或和为0,此时因为另一个人不能不取东西,下一步整体异或和一定非0.
重复这个过程,加和规模逐步减小,最后变为0,此时一定是后手输.
反之,后手一定赢.
说说SG函数.
先说定义吧,首先有两个概念,一个叫做先手必胜点(N),一个是先手必败点(P).
我们将所有博弈点都归为这两种点,点构成的图为DAG(决策不能回退),可以归出如下性质:
1.没有下一个博弈点的点为P点.
2.N点后面必有至少1个P点.
3.P点之后若有点则全部都是N点.
这个证明不用多说,第一条就是定义.
2.N后有一个P,那么先手让后手进入P,先手赢.
3.P后全为N,先手怎么决策后手都到N,后手绝对赢.
现在来看SG函数:
定义:设当前博弈点为
同时
参考P,N点定义,无出度的P点mex值为0.
P点前接N点(N点后必有P点),
P点后若有点,全为N点,故有出度
这样可以发现
而当我们研究的是独立的多个游戏一起进行而非一个游戏时,要用到SG定理:
定义一局对弈由k个小游戏组成,各个小游戏状态,一个对弈状态为
当
简单证一下:
假设我们的转移没有限制,这时x能到达的点中包含一些节点SG值大于当前值的点.
但是显然第二个人可以通过一步操作将这一步操作抵消(参考SG函数定义).
所以所有向SG函数值增加的转移无效.
那么所有点只能向SG函数缩小的方向进行,也就意味着这游戏就类似于NIM游戏.
假设我们已经有一个状态满足了SG定理,为x',我们现在找到它的前驱为x.
有SG(x)在上面的定义,取每一个状态内的
且至少有一个
在这种情况下又有SG值向减小方向转移,且
所以就有
至于先手必胜,和上面的NIM游戏证明相似,不必赘述.
例题:
板子在luogu上是NIM游戏.
一个锻炼思维的题tr
梳理下后面这个题的思路:
SG函数值的意义是这个点能够到达的转移到下一层的上界(开区间).
因为之前说了SG函数转移到SG值增大的部分是无意义的且SG无法原地tp.
所以观察这个题,它的每一个子树我们看成是单一的游戏.
思考我们以根的角度去看子树时,我们可以直接把链接子树的边删掉,这样子树SG值就为0.
那么明显每个节点(除了叶子之外)都能删边,所以所有节点(除了根节点之外),都应该延伸出去一个边指向SG为0的虚点.
这时无疑所有点SG函数(对父亲来说)都+1,对于这个SG函数+1的实际意义,可以看成每个节点包含了将它父亲边删掉的决策.
具体解释放个链接在这里
之前说所有子树都是一个独立的游戏,所以
这样这个问题就解决了.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!