【博弈论】SG函数应用总结

这两天用比较少的学习时间(真的,自己不能再懒了,马上要国赛了!!!)学习了博弈论,其中主要是对于SG函数的应用,是解题的关键。这里用自己的语言算是对SG做一个小结吧。

小结来源:这两天写的几篇博弈论博文


初识SG——Nim堆游戏:

尼姆堆游戏(两人轮流从任一堆里拿任意数量,最后没东西可拿者输)中神奇的结论:”若每一堆数量的异或和==0,则先手必输”让我觉得很奇妙,也不知道为什么会有这样的结论产生。但是在了解SG函数之后,原来NIM堆针对每一堆来说,因为根据“SG==0则先手必输”结合题意可知数量x==0则先手必输,所以每一堆的SG就是数量x。可以把每一堆看成一个子游戏,根据定理“总游戏SG=子游戏SG异或和”,得到之前说的神奇的结论。


观摩SG——巴什博弈和威佐夫博弈:

巴什博弈:只有一堆物品,数量为n,两人轮流从中取,一次最少取1个最多取m个,最后没东西可取者输。

SG=n%(m+1) 就一堆物品不需要异或和

威佐夫博弈:有两堆物品,两人轮流从中要么在一堆里取,要么在两堆里同时取相同数量,最少取1个,最后没东西可取者输。

这个是需要记公式

(a,b)成为奇异局势,即“先手必输”的局势。

令k=b-a (a,b是两堆物品数量,前提b>a,不然先交换),令参数wzf=(1+根号5)/2

a1=wzf*k ;  b1=wzf*wzf*k ;

看看是否a==a1&&b==b1,若是,则是奇异局势,先手必输。


了解SG——有向无环图 下棋游戏

根据SG函数的定义:SG(x)=mex{SG(y)| y为x的后续} ,这个后续很有意思,是需要题意来看,当前x按题意操作之后,能变成的数即为后续Y。所以,根据下棋游戏规则(这个点没有出度了就无路可走,输了),可以知道对于每个点来说,SG==出度。也符合SG==0先手必输。那么是不是觉得很像NIM堆游戏呢?ABSOLUTELY RIGHT!可以类比:每个点相当于每一堆,那么看看初始的时候棋都放在哪些点上,然后把这些点的SG值求异或和就得到总游戏的SG值了。总SG==0则先手必输。


应用SG方法

打表或递归 (见https://blog.csdn.net/m0_38033475/article/details/80272171)


灵活地用SG解题 

我觉得其实只要:记住SG==0先手必输,SG(x)=mex{SG(y)| y为x的后续} ,结合题意即可!

一般来说,如果这个游戏是可以拆分成子游戏的,那么我们就拆分,主要是先对子游戏进行分析(最后求异或和即可)。首先是要结合题意找到让SG==0的这种情况,由此知道SG可以由什么值代替或哪个值和哪个值呈什么关系的时候SG==0。然后再根据SG(x)=mex{SG(y)| y为x的后续} 来根据后续情况倒推之前情况的SG值!然后可以找找规律,用打表或者递归就把SG值求出来,最后求异或和就知道了。


比如说这道题(https://blog.csdn.net/m0_38033475/article/details/80281556),就是根据列写每个情况的SG值,找了一下规律就把题做出来了。注意这道题只有一个游戏(无法拆分),所以也没有求异或和的最后步骤,所以也不需要sg值数组或者返回sg值了,getsg函数返回值完全就可以只返回布尔值(sg==0则false)。

而蒜头君的新游戏这道题,也是列写每个情况的SG值,而其中的关键在于,你在找“后续操作”是要牢牢结合题意所给操作的!一般来说找到sg值==0的所有情况,就能根据性质求出所有情况的sg值啦!


猜你喜欢

转载自blog.csdn.net/m0_38033475/article/details/80292465