NIM游戏|博弈论入门,SG函数

NIM

先来看一个经典游戏:
地上有 n 堆石子(每堆石子数量小于 104),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。
针对这个游戏,我们看看能不能归到先手必胜或者必败的局面.
首先显然每一堆石子都是0的情况下,先手必败,此时可以注意到:
这些石子个数加和为0,且所有石子个数异或和为0.
显然,这是使所有石子异或和为0的石子个数加和最小情况.
那么我们把所有操作情况按照异或和为0或不为0分类.
当石子全部异或和不为0时,假设此时异或和为k,我们将k二进制分解取最高位i.
发现对于这一情况,一定存在奇数个二进制分解包含位i的石子堆.
那么在这个情况下,我们将那一堆石子j取出来,将它变化为k xor aj
整体异或和为0,此时因为另一个人不能不取东西,下一步整体异或和一定非0.
重复这个过程,加和规模逐步减小,最后变为0,此时一定是后手输.
反之,后手一定赢.

SG

说说SG函数.
先说定义吧,首先有两个概念,一个叫做先手必胜点(N),一个是先手必败点(P).
我们将所有博弈点都归为这两种点,点构成的图为DAG(决策不能回退),可以归出如下性质:
1.没有下一个博弈点的点为P点.
2.N点后面必有至少1个P点.
3.P点之后若有点则全部都是N点.
这个证明不用多说,第一条就是定义.
2.N后有一个P,那么先手让后手进入P,先手赢.
3.P后全为N,先手怎么决策后手都到N,后手绝对赢.
现在来看SG函数:
定义:设当前博弈点为x,它能够到达的博弈点集合为S.

SG(x)=mex(SG(k)|kS),mex(A)=min{x|xA,xN}

同时mex()=0.
参考P,N点定义,无出度的P点mex值为0.
P点前接N点(N点后必有P点),SG(N)>=0.
P点后若有点,全为N点,故有出度SG(P)=0.
这样可以发现SG>=0则该点必胜,反之必败.
而当我们研究的是独立的多个游戏一起进行而非一个游戏时,要用到SG定理:
定义一局对弈由k个小游戏组成,各个小游戏状态,一个对弈状态为x={s1,s2,...,sk},则:

SG(x)=SG(s1) xor SG(s2) xor ... xor SG(sk)

SG(x)不为0,那么x点的先手必胜.同时一个SG(x)到达不了SG(x')使SG(x')=SG(x).
简单证一下:
假设我们的转移没有限制,这时x能到达的点中包含一些节点SG值大于当前值的点.
但是显然第二个人可以通过一步操作将这一步操作抵消(参考SG函数定义).
所以所有向SG函数值增加的转移无效.
那么所有点只能向SG函数缩小的方向进行,也就意味着这游戏就类似于NIM游戏.
假设我们已经有一个状态满足了SG定理,为x',我们现在找到它的前驱为x.
有SG(x)在上面的定义,取每一个状态内的si作为可能转移点,那么任意SG(si)>=SG(si)
且至少有一个SG(si)>SG(si)(至少变化一个小游戏内的状态).
在这种情况下又有SG值向减小方向转移,且SG(si)到达不了它本身另一个SG(si)使之SG值不变.
所以就有SG(x)>SG(x).
至于先手必胜,和上面的NIM游戏证明相似,不必赘述.

例题:

板子在luogu上是NIM游戏.
一个锻炼思维的题tr
梳理下后面这个题的思路:
SG函数值的意义是这个点能够到达的转移到下一层的上界(开区间).
因为之前说了SG函数转移到SG值增大的部分是无意义的且SG无法原地tp.
所以观察这个题,它的每一个子树我们看成是单一的游戏.
思考我们以根的角度去看子树时,我们可以直接把链接子树的边删掉,这样子树SG值就为0.
那么明显每个节点(除了叶子之外)都能删边,所以所有节点(除了根节点之外),都应该延伸出去一个边指向SG为0的虚点.
这时无疑所有点SG函数(对父亲来说)都+1,对于这个SG函数+1的实际意义,可以看成每个节点包含了将它父亲边删掉的决策.
具体解释放个链接在这里
之前说所有子树都是一个独立的游戏,所以SG(fa)=(SG(x)+1)(xson(fa))
这样这个问题就解决了.

posted @   SLS-wwppcc  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示