NIM数字游戏 SG函数 有向图博弈 学习记录

写在前面:很早之前我就想写一写博弈论的学习记录了。本篇文章记录了我在学习博弈论初步时的顺序,现在网络上的博弈论资料大多都是从SG函数开始讲解,而我谜一样的学习方法让我对博弈论初步有了不同的理解过程,所以我是从NIM游戏这个例子开始的。

Nim游戏

Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下为ICG)。

条件

满足以下条件的游戏是ICG(可能不太严谨):1、有两名选手;2、两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动;3、对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么因素; 4、如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。根据这个定义,很多日常的游戏并非ICG。例如象棋就不满足条件3,因为红方只能移动红子,黑方只能移动黑子,合法的移动集合取决于轮到哪名选手操作。

                                                                                                                                                                                         以上内容来自百度百科

简单的一个Nim游戏的例子:

现在共有N堆石子,每堆石子分别有a1,a2,a3...an个,现在两名玩家轮流取石子,一次可以取一堆石子当中的任意数量(可以取完,但不能不取),无法取走石子时,当前玩家判负。

比方说:

现在有:   1 2 3这三堆石子,甲 乙 两名玩家,甲先手

甲可以直接取完第一堆石子,乙取完第二堆,然后甲再取完第三堆。乙不能取,判负。

甲可以直接取完第一堆,但乙只取第二堆中的一个,甲再取第三堆中的两个,乙这是只能取走两堆当中的任意一个,甲取走最后一个。乙不能取,判负。

解决办法:

扫描二维码关注公众号,回复: 3312419 查看本文章

将每堆石子用二进制表示:如3 7 5 6表示为 0011 0111 0101 0110四个数字

然后将它们异或起来:

0011^0111^0101^0110=0111

假设所有石子都取完了,那么他们异或起来为:

0000^0000^0000^0000=0000

对于0011^0111^0101^0110=0111这种情况,如果能够通过一种取法,使得剩下的所有数异或起来等于零,而且对于所有数异或起来不为零这种情况,只要取,就一定会变成异或起来不为零的情况,那么我就是必胜的。

                   你在说什么?

意思就是:我的回合,在当前局面下,我可以留给你一个异或起来等于零的局面,而你不能给我留一个异或起来等于零的局面,那么在值逐步减小的回合当中,留给你的只能是每堆石子都为0的局面。

接下来就是怎么去证明对吧:

设当前局面为a1,a2,a3...an。且a1^a2^...^an=x(异或起来不为0的情况),其中最大值为ai

那么原式可表示为ai^y=x。此时,x和ai的最高位肯定都为1,那么ai^x肯定小于ai,那么我们一定可以用一种取法,使得ai变成ai^x,则取走石子之后,当前局面异或和为0。

若a1^a2^a3^...^an=0

那么无论取走任意一堆的任意数量,都会带来当前这堆石子数量二进制的位的改变,从而导致全局异或起来不为0

那么久满足了我们之前所说的条件,从而得到结论:

对于任意一个局面A{a1,a2,a3,a4,...,an}若a1^a2^a3^...^an的值不为零,则先手必胜

若a1^a2^a3^..^an的值为零,则先手必败。

我们再在这个简单粗暴的结论上衍生一下:

SG函数(Sprague-Grundy

我们定义一个对于集合的操作mex,这个操作要找到最小的不属于该集合的非负整数。 
如:mex{0,1,2}=3,mex{1,2,3}=0,mex{0,1,3}=2;

那么定义SG(x)=mex(S),其中S是x的后继状态的集合。

对于NIM游戏的任意一堆,把它视作一个独立的游戏,那么对于一个数量为10的石子堆来说,它的后继状态有{0,1,2,...,9}共10种(不能不取石子),那么SG(a10)=10,

SG定理

 游戏和的SG函数等于各个游戏SG函数的Nim和。

证明:同NIM游戏相同,当每个单独游戏的函数值为0时,当前局面为必败局面,所以SG函数的异或和为0

因为S是当前游戏的后继状态集合,那么小于SG函数的任意值都可以通过一种方式去得到。

如:NIM游戏当中,对于10这个单独游戏来说,后继状态为从0到9,都可以通过一种取法得到。

SG函数和NIM游戏可以具有相同的失败或胜利条件,就可以用NIM游戏相同的办法去证明SG定理。

SG定理的应用

有向图博弈:

在一个有向图中,有n枚棋子,两名玩家轮流移动棋子一次,一次能移动任意一个棋子的一步,无法移动的人判负。

看起来在有向图当中,SG函数不是那么好定义了

设有向图终点的状态为0,那么倒着来处理获得每个点的后继状态集合(这难道是。。。拓扑排序!!!)

也就是用拓扑排序从终点开始,逆着有向边进行拓扑排序,当前结点出队时,便可计算这个结点的SG函数值了。

对于一个有向图博弈的局面,只需要用拓扑排序求出当前局面所有棋子的SG函数,再根据SG定理,就可以知道这个局面是必败还是必胜了。

猜你喜欢

转载自blog.csdn.net/u014085852/article/details/82765426