博弈(部分帮助理解的转载内容+部分自我阐述)

首先通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

我们知道对于最普通最一般的NIM取石子来说,所有石子个数异或起来如果为0,那么先手必败,如果不为0那么先手必胜。

具体证明如下:

1、最后的游戏状态必然是所有石子个数为0,也可以看成所有石子异或为0。
2、假如现在所有石子异或起来为J,我们用Ai表示第i堆石子个数,总共n堆。那么就有A1 ^ A2 ^ A3…… ^ An=j,我们把j二进制表示,则A中必有一个数最高位与j的最高位同为1(位数一样),不然j的那个1是哪来的?然后我们令这个数是Am,所以Am ^ j必然小于Am,显然最高位被消掉变小了。我们可以取石子把Am变成Am ^ j,那么对于原式就是A1^ A2^ ……^ An^ j=j^j=0;
3、如果异或起来为0,那么如果任意拿掉石子,新的异或一定不为0,这个证明十分简单,留给读者解决。(偷懒~)

所以当异或不为0的时候,都可以通过操作让它变成0,所以显然就有了上面那个结论。

那么现在我们上重头。

对于一个大的游戏,我们把它看成是多个小的游戏,比如这个取石子,我们把它看成是n个小的游戏。
现在我们单独考虑一个游戏,也就是一堆石子如何解决。
我们规定一个对于集合的操作mex,表示最小的不属于该集合的非负整数。
举几个栗子:mex{0,1,2}=3,mex{1,2,3}=0,mex{0,1,3}=2;

我们再定义SG函数:SG(x)=mex{ SG(y) | y是x的后继 }。
什么叫y是x的后继?我们用普通的NIM游戏举个栗子。假如有一堆石子个数为x,普通的NIM游戏可以取任意个,但不能一个不取,所以x的后继就是0~x-1,所以y取值0 ~x-1。
有一个结论就是普通的取石子SG(x)=x。

我们考虑SG函数的性质,我们把游戏看成一个图,那么其实就是一个点在这张图上面跑,当这个点走到0的时候它就走不动了。SG值为0时,表示当前点为必败点,因为它下面的SG值都大于0。SG值大于0,当前点是必胜点,因为它可以走到一个点的SG值为0。
所以得到结论SG值为0就是必败,SG大于0就是必胜。
————————————————
原文链接:https://blog.csdn.net/Kamisama123/article/details/776491189118

三、游戏状态的组合
  有些读者可能已经发现了,在第一节提出的三种游戏中,有许多状态是等价的。例如在Flip Game中,两个加号(“++”)和三个加号(“+++”)就是等价的状态,因为它们都是走一步之后就无路可走;在抢票游戏中,一个2x3的矩形和一个3x2的矩形也是等价的状态。状态的等价有许多种原因,其中一种是因为两个状态都是同样一些相互独立的子状态的组合。这里,“相互独立”的意思是指玩家的任意一步行动都只能影响一个子状态。例如,在Flip Game中,“+++±+±-”和“-+±-++++”就是等价的状态,因为它们都是“2个加号”和“4个加号”这两个子状态的组合。而Nim游戏的状态天然就是一些子状态的组合,其中每堆石子是一个子状态。如果能够通过子状态的胜负推断出它们的组合(下文称为“母状态”)的胜负,那么就可以大幅减少记忆化搜索过程中需要考虑的状态数,提高搜索效率。

在讨论由子状态胜负推断母状态胜负的方法之前,我想先指出第一节中三个游戏的另外三个共同特征。它们正是Sprague-Grundy定理成立的条件,也是下文所有讨论的前提。

满足上面两个条件的游戏称为impartial game,反之则称为partisan game。impartial game的状态中只需包含棋盘信息,partisan game的状态则还需包括“下面轮到谁”。正因为如此,partisan game的状态无法拆分成“相互独立”的子状态,因为玩家的每一步行动会影响到所有子状态中“下面轮到谁”的信息。
双方的胜利目标具体来说,是自己亲手达成终局状态,或者说走最后一步者为胜(术语称为normal play)。第一节中的三个游戏也都可以稍微修改规则,改成走最后一步者为负(术语称为misère play),但下文的讨论仅适用于normal play的情况。
  下面讨论状态的组合对胜负的影响。请温习一下胜态和败态的关键性质:经过一步行动,败态只能变成胜态,胜态可以(但不一定)变成败态。

先看两个败态的组合。两个败态的组合还是败态。从后手玩家的角度来看,先手玩家的行动只能将两个败态中的一个改变为胜态,于是后手玩家可以再将这个胜态变成败态,从而将两个败态的组合抛回给先手玩家。由于终局状态为败态,最终先手玩家必将面对两个终局状态组成的败态,故后手必胜。

再看一胜一败两个状态的组合。胜态与败态的组合还是胜态——先手玩家只要把胜态变成败态,就可以把两个败态组合成的败态抛给后手玩家了。

最后看两个胜态的组合。这种组合就比较复杂了:先手玩家不应把其中一个胜态变成败态,因为这样会把一胜一败两个状态组合成的胜态留给对方。因此,先手玩家应当把其中一个胜态变成一个新的胜态。后手玩家面对新的胜态+胜态的组合,应当采取相同的策略。然而,由于游戏是有限的,早晚会有一个玩家只能把一个胜态变成败态,从而输掉游戏,但我们并不知道这会在哪一步发生。也就是说,仅仅知道两个子状态都是胜态,不足以推出母状态的胜负;我们需要挖掘胜态的更多性质。

四、Sprague-Grundy数的提出
  我们以Flip Game为例,研究一下胜态还有什么更深入的性质。

状态“++”是最简单的胜态,它只有一种走法,结果是败态。状态“+++”跟“++”在这一点上是一样的,因此它们其实是等价状态。状态“++++”就有两种不同的走法(对称的走法算同一种):一是把中间两个加号变成减号,这样得到的次态“±-+”是个败态;二是把某一端的两个加号变成减号,这样得到的次态“–++”或“+±-”(等价于“++”)是个胜态。

于是我们发现了两种不同的胜态。像“++”、“+++”这样,只能变成败态的胜态,我们称之为“一级胜态”。像“++++”这样,可以变成败态,也可以变成一级胜态的胜态,我们称之为“二级胜态”。类似地,如果一个胜态可以变成败态,也可以变成1至n-1级的所有胜态,则我们称之为“n级胜态”。而败态可以称为“零级”。

我们看一下胜态的组合是否与级数有关。两个一级胜态的组合是败态,因为先手玩家的任意一步行动都会将其中一个胜态变为败态,留给后手玩家的就是胜态与败态组合成的胜态。一个一级胜态与一个二级胜态的组合是胜态,因为先手玩家可以将二级胜态变为一级胜态,留给后手玩家的就是两个一级胜态组合成的败态。两个二级胜态组合成的胜态也是败态,因为先手玩家无论将其中一个二级胜态变成败态还是一级胜态,留给对方的组合都是胜态。

我们似乎发现了一个规律:两个同级胜态的组合是败态,两个不同级胜态的组合是胜态。没错!考察两个同级胜态的组合,无论先手玩家如何降低其中一个胜态的级数(甚至将其变成零级的败态),后手玩家总可以将另一个胜态降到同一级,最终先手玩家将面对两个败态组合成的败态。而若先手玩家面对的是两个不同级的胜态,他就总可以将其中较高级的胜态降至与较低级的胜态同级,这样留给后手玩家的就是败态。

上面对于胜态等级的定义有一个漏洞:如果一个胜态A可以变成败态或二级胜态,但不能变成一级胜态,那么它应该算一级还是三级呢?规律的证明过程同样也有一个漏洞:我们默认了一步行动只能让胜态的级数降低,那么能不能让胜态的级数升高呢?注意到规律证明过程的关键,在于如果要降低一个胜态的级数,则可以降低到任一级。于是我们就知道,上面的状态A应当定义为一级胜态。这导致胜态的级数可以升高,不过没关系,可以这样弥补规律证明的漏洞:在两个同级胜态的组合下,若先手玩家升高了其中一个胜态的级数,则后手玩家可以将它降回原级,这样两个同级胜态的组合仍是败态。

通过定义胜态的级数,我们解决了两个胜态组合而成的母状态的胜负判定问题。事实上,我们定义的“级数”,就是传说中的Sprague-Grundy数(简称SG数)。SG数是一个从状态映射到非负整数的函数,它的形式化定义如下:

★SG(x)=mex{ SG(y) | y是x的后继 }。

式中A、B代表状态,[公式]代表B是A的一个次态。mex是一个定义在集合上的函数,表示不属于集合的最小非负整数,它是minimum excludant的缩写。这个定义用通俗的语言表达,就是说一个状态的SG数,等于它的次态取不到的最小SG数。
转自https://zhuanlan.zhihu.com/p/20611132
——————————————————————————————

自我阐述

已知一般的nim游戏,对于其它的双人博弈问题大部分可以转化为nim游戏的形式。
1、一个游戏的输赢状态可以由其子状态得出。我们将多堆的问题,拆分成子问题。
对于SG值:假设一堆石头n个,在取法规则固定的情况下,取不同的n,SG值不同。SG【n】值为0代表为n个石头时先手必败,是必败点。对于其它值来说代表可胜点,必然存在策略使下一步失败或胜利。
SG(x)=mex{ SG(y) | y是x的后继 }。

在这里插入图片描述借助以上图对SG的进行深入理解,1,2,3其实就是一级,二级,三级胜态,图中箭头指向的就是后继,也可以看成这一层对应的三种情况,所以图中不是在一个箭头指出的1,2,3都没有什么实在联系。图上代表的是“一堆石头”的SG值情况。如果SG值为0,它的后继状态可能是1,2,3的情况,或者说是对应级数的胜态。SG为0先手必败,因为后手必然处在胜态(对应了经过一步行动,败态只能变成胜态,胜态必然存在策略使下一步变成败态或胜态。),后手然后选择0的这种情况转化为败态给先手,先手就始终败。同理,一开始SG非0的话,先手可必胜,必然可以转为0的败态丢给后手。当一堆的SG值为0时,这一堆的胜负状态就已知了。
经过一步行动,败态只能变成胜态,胜态必然存在策略使下一步变成败态或胜态。0是败态,非0是对应级数胜态,所以我们通过mex{ }函数来通过后继状态得出现在的状态,这是一个倒推的过程。0的必败状态后继必然是大于0的级数胜态(败态只能变成胜态),2的状态后继会有是0,1的状态(胜态必然存在策略使下一步变成败态或胜态),注意也许会有3存在。但后继代表的只不过是几种情况,状态。
一个级数胜态可以变成低阶,也可能会变成高阶。但如果出现后手取高阶情况,比如这里2->3,先手可以再把3->2,对结果没有影响。而我们这里的SG状态都是根据当前石子数推出的,不可能一直2->3->2循环下去,必然最后会没法2->3,变回正常情况。
以上处理了后继状态变为高阶的情况,可以忽略。还说明了当SG为0时也可以看做这“一堆石头”已经取完,因为后手再取,你就再取成SG为0,他这不在一堆不取,先手也不对这堆石头采取行动,可以将这堆SG为0的石头堆,看成0个石子的石头堆。
此时我们可以认为SG值在处理了以上两种情况后,可以看做SG值是可以在不断变小的,从n变成0~n-1,就像是可以是nim游戏中的其中一堆石头一样,稍有不同的是SG值的石头数的变化更多的是胜负情况的变化,好在SG值在处理了以上两种情况后,可以看做不断变少的石头数,符合nim游戏的定义。
SG[n]值代表的是“一堆石头”的石子数n对应在博弈规则已定的情况下对应的胜负状态。
在理解了nim游戏正确性的情况下(比如为什么要用mex)与SG值与nim游戏如何转化的情况下,基本就没有问题了。

发布了52 篇原创文章 · 获赞 2 · 访问量 889

猜你喜欢

转载自blog.csdn.net/qq_44714572/article/details/99684853
今日推荐