从nim游戏到sg函数博弈论类问题进阶之路

来源:互联网 发布:云计算平台 开源 编辑:程序博客网 时间:2024/04/29 10:11

把多校赛之间的文章补一下。
先从sg函数开始吧。
本文打算结合之前已有的文章,将博弈论从nim游戏到sg函数分析,大概系统的学完并会应用要两天吧,如果完全没接触过的话。还有本文会重点从平衡状态分析。
鄙人才疏学浅肯定讲不清。可以看看例题。详细的理论可以看下面的链接的文章:
https://software.intel.com/zh-cn/blogs/2014/03/06/nim-sg,在这就不复杂的介绍了。
但还是重点介绍一下这两个状态。
P-position和N-position
其中P 代表Previous,N 代表Next。 P-position是必败态,N-position是必胜态。
必败(必胜)点属性
(1) 所有终结点是必败点(P点); //容易理解
(2) 从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点); //就是那种我们要走的方法
(3)无论如何操作, 从必败点(P点)都只能进入必胜点(N点). //对手走完又只能把N留给我们

取子游戏算法实现
步骤1:将所有终结位置标记为必败点(P点);
步骤2: 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)
步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ;
步骤4: 如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2
例题
kiki’s game
另终点为P状态,则可画出此图:
这里写图片描述

nim游戏
简单的讲就是从一堆或几堆石子中每次选择一堆,可以从这一堆中取出任意个数,不能不取。直到有人不能取为止。
结合上面的知识,假设现在只有两堆石子,那么:(0,0)—P, (n,0)—N, (n,m)—N, (n,n)—P.
也就是当两堆石子数相同是为P点,那么只要是对方始终在P点取子就行了,因为P只能进入N点,而N点必能进入P点。所以这就完成了一轮博弈。
但如果是三堆石子,就不适用了。
在这介绍另一个重点^(异或xor)运算:
5(101)^11(1011)=12(1110)
12(1110)^5(101)=11(1011)
正如两式所示,异或的逆运算正是异或。只要将两值经过操作变得相等就能使异或值变为0。使异或为零就能达到平衡。
例题
Being a Good Boy in Spring Festival
这道题对理解异或后的值与平衡的建立有帮助。异或知道总异或值s后再分别对每个值a[i]异或找到可通过操作使值s降到0的就加1。
SG函数
如果结合P/N问题可以将石子的数目转换为一个状态值,就是sg值特点是每个sg值都一定可以到达比它小的值,而且一般可以理解为最大连续可到达P点的步数+1。
现在我们已经知道如何将符合数值大小的问题了,如果sg值与大小无关,我们可以通过该点的后继方法来判断。
例题
S-Nim
最简单的sg应用。一个值的sg值可以通过它能到达的值来获得。
Chess
推我入坑的题,先状态压缩用1/0表示棋盘的情况,选出一个空位在让能移动到该值的棋子移动,统计出sg值。因为数是从小到大增加的可以保证它的后继是以赋值的。

0 0