SG函数

SG函数的坑弃了很久了……高一的大佬已经开始D我了……

什么是SG函数

首先我们需要知道,有限状态博弈问题可以表示为一个DAG,每个节点表示一个局面,而每个选择就相当于一条边。
例如取石子问题。一共5个石子,玩家可以取两个或者取一个,先取完者胜。那么这个图是长成这样的:
59eb6654682d2.png (230×230)
点上的数表示“在这个局面下,还有多少个点没有被取”。
这个图上有“P点”和“N点”。P点表示必败点,N点表示必不败点(在这个图中,就是必胜点)。关于P点和N点,我们作如下约定:
无路可走的点称为“终点”(Terminal)。终点是P点。
如果一个点能走向P点,那么它是N点。因为可以让对手输。
如果一个点只能走向N点,那么它是P点。因为只能让对手赢。
那么根据这几个约定,上面的博弈图可以画成下面这样。橙色表示P点,绿色表示N点。
59eb6654682d2.png (230×230)
上图的意思是,遇到30局面的玩家必败,否则必胜。由于5是N点,所以这个游戏是先手必胜的。(先手取两个石子,使对手面临3的局面,即可获胜)
那么什么是SG函数呢?SG函数就是判断了上面的三个约定,并把结果用数值表示出来。
我们首先定义mex运算,它是作用于集合上的运算。设S是一个整数集合,则mex(S)表示没有在S中出现的最小非负整数。
例如,{0,1,2,4}mex值是3{1,2,3}mex值是0{}mex值是0
在之前的图上,每个点表示一个状态。
SG函数给了每个点一个值:sg(x)=mex{sg(p)|px}。终点的sg值是0。
如果sg(x)0,那么xP点;否则xN点
SG函数有一个神奇的特性:如果一个游戏可以分成几个同时进行的子游戏,那么整个局面的sg值,就是所有子游戏的当前节点sg值的异或和

Nim游戏

我们借助Nim游戏来理解SG函数。
Nim游戏的规则是:有n堆石子,第i堆石子有ai个。每次可以从一堆石子里面取走任意个(至少取一个;允许一次取完)。
我们先分析某一堆石子的SG函数。由于p号节点可以走到0,1,2p1,所以sg(0)=0,sg(1)=1,sg(2)=2,所以sg(p)=p
因此,每一堆石子的sg函数都已经知道。在初始的时候,第i堆石子当前局面的sg值为ai。(还没有石子被取)
我们的博弈是个大游戏,每一堆石子都是一个小游戏。因此整个局面的sg值就是每一堆石子的sg值的异或和。也就是说:
sg(begin)=a1a2a3an
如果sg(begin)的函数值为0,说明整个游戏的最初局面是P点,先手必败。否则整个游戏先手必胜。

评论

此博客中的热门博文

将博客部署到星际文件系统(IPFS)

高中地理必修一知识点总结

一场CF的台前幕后(下)