首先,咱们介绍一下组合游戏。组合游戏是一种两我的参与的游戏,参与者拥有完整的(有关游戏的)信息,没有任何意外产生的操做(即保证无心外性),而且游戏拥有一个输赢的结果。这样的游戏是由一系列的位置,包括一个起始位置,和哪一个参与者进行下一步所组成、决定的。游戏在参与者的选择中从一步移向下一步,最终达到某个终点位置。这样的一个终点位置意味着没有任何下一步移动存在的可能。以后,其中一名游戏者被断定为胜利,另外一名则为失败。
这个理论能够被分为两个部分:公平游戏,游戏中对于两名参与者所被给定的任意一个位置,都可以到达其余全部的位置(强调两名参与者相同机会)。非公平游戏,则是被给定的不一样位置对于两名参与者有着不一样的机会,例如国际象棋。
在第一部分咱们将只讨论有关于公平游戏的部分,下面讲一个简单的例子。html
咱们来分析这样一个游戏,下面介绍下游戏规则:数组
如今知道游戏规则了,咱们就尝试着来分析这个游戏。想想,其中一名参与者必定可以在游戏中胜利吗?咱们要先手仍是要后手?有什么很好的策略吗?less
下面,咱们将从后往前分析这个游戏,即从游戏即将结束的部分开始。这种方法被称为倒退概括。ide
如今咱们将组合游戏的概念定义得更准确一些。函数
组合游戏是一个知足下列状况的游戏:ui
回到刚刚说的取走游戏中,咱们发现 $0,4,8,12,16... $ 是一个对于前一个操做的参与者胜利的位置(Previous Player),而 \(1,2,3,5,6,7,9,10,11\) 是对如今或者说是下一个操做的参与者胜利的位置(Next Player or Now Player). 前者则称为P位置,后者称为N位置。(做者注:在下文中,P位置也会被称为先手必败状态,N位置也会被称为先手必胜状态)。在一个公平游戏中,咱们能够找到规律,哪个是先手必胜状态,哪个是先手必败状态,只要从结束状态开始经过下列的操做进行倒推便可。this
而这样分析以后,很明显,任意一个处于P位置的人确定会输,由于他只能转移到N位置。而处于N位置的人,只要转移到P位置就能够赢了。
从上面的推导,显然地,咱们会发现对于N位置和P位置有一些性质,这些性质的前提是,这是公平游戏,且有终点。spa
如今咱们把上面所提到的简单取走游戏通常化。设 \(S\) 表示一个正整数的集合,那么以S为减法集的减法游戏就是像这么玩的:有一堆 \(n\) 根火柴,每次像简单取走游戏同样拿去火柴,可是拿去的火柴数必须在减法集中。其余规则同减法游戏。
那么,简单的取走游戏就是一个 \(S=\{1,2,3\}\) 的减法游戏。如今为了更好地说明,咱们来讨论一个 \(S=\{1,3,4\}\) 的减法游戏。首先,(个数)0是终点,为 \(P\) 位置。而 \(1,3,4\) 则为 \(N\) 位置,由于能够转移到0这个 \(P\) 位置。2是 \(P\) 位置,由于2只能转移到1,而1为 \(N\) 位置。5,6是 \(N\) 位置,由于能够转移到2。7是P位置,由于7能转移到的是3,4,6,都是N位置。
按着这样子递推下去,咱们会发现.net
咱们会发现,\(PNPNNNN\) 是一个长度为7的循环节。如今,若是是 \(100\) 根火柴,先手赢仍是后手赢?咱们发现,\(100\ mod\ 7 = 2\),对应循环节,\(2\) 是 \(P\) 位置,因此 \(100\) 根火柴是先手必败状态,后手确定赢。翻译
如今,请你尝试着分析一个\(S=\{1,2,3,4,5,6\}\) 的减法游戏,并搞清楚 \(10000\) 根火柴的话,先手赢仍是后手赢?
《Game Theory》中有对应练习,请读者自行查找
Nim游戏是最有名的取走游戏。有三堆火柴,分别有 \(x_1,x_2,x_3\) 根火柴(好比 \(5,7,9\) )。两我的轮流进行操做,每次只能取走一堆火柴中任意数量的火柴,不能同时对多堆进行操做。和取走游戏同样,拿走剩下全部火柴的人获胜。
咱们用(\(x_1,x_2,x_3\))表示对应三堆分别有 \(x_1,x_2,x_3\) 根火柴的状态。
首先,只有一个终点,(\(0,0,0\)),为 \(P\) 位置。由于能够拿走一堆中任意根数的火柴,因此 \((x,0,0),(0,x,0),(0,0,x) (x>0)\) 为 \(N\) 位置。可是推广到 \((x,y,0)\) ,也就是有 \(2\) 堆火柴不为空的时候,还勉强能够计算,但到了\((x,y,z)\) ,咱们会发现推导起来无比纠结。因此,咱们这里要引入另一个东西。
首先,咱们定义 Nim和
为两个数或多个数在二进制下的异或和(异或和部分不做展开介绍,请不懂的读者自行找资料)。咱们定义 “\(⊕\)” 为Nim和的运算符号。例如,若是 \(x\) 与 \(y\) 的 Nim和 是z,那么咱们表示为 \(x⊕y=z\) 。
而后,引入波顿定理。
波顿定理:对 \(n\) 堆火柴 (\(x_1,x_2,x_3,...,x_n\) ),若 \(x_1⊕x_2⊕...⊕x_n = 0\) ,则这个状态为 \(P\) 位置,不然为 \(N\) 位置。
举个例子,对于 \((x_1,x_2,x_3)=(13,12,8)\),计算它的 Nim和:
Nim和不是0,根据波顿定理,这是一个N位置。那存在能找到移动到P位置的方法吗?
根据Nim和的定义,咱们发现,只要把每一列的 \(1\) 改成偶数个数就能够了。那么咱们把第一堆火柴拿掉 \(9\) 根,这样子状态变为 \((4,12,8)\) ,而它的 Nim和:
根据波顿定理,这是一个P位置。咱们还能够找到另外一种方法,也就是从第二对堆的 \(12\) 根火柴中拿掉 \(7\) 根,剩下 \(5\) 根,一样能够获得Nim和为0。
波顿定理的证实参考于:Here
简单证实:
- 当 \(a\) 不全为 \(0\) 时, 任意一个 \(res!=0\) 的局面, 先手能够经过必定的操做让后手面对 \(res=0\) 的局面。
- 对于任意一个 \(res=0\) 的局面, 先手没法经过任何操做让后手面对 \(res=0\) 的局面。
- 得出结论, 当 \(res=0\) 时先手必败, 反之必胜。
详细证实:
假设如今分析 \(S(x_1,x_2,x_3,...,x_n)\) 这个状态
对于终点 \((0,0,0,...,0)\),显然 \(0⊕0⊕0⊕...⊕0=0\) ,而终点为 \(P\) 位置,成立。
$x_1⊕x_2⊕...⊕x_n ≠0 $
由 \(N、P\) 位置的定义,咱们知道每一个 \(N\) 位置都能移动到至少一个 \(P\) 位置。下面咱们来研究如何构造这样一个移动。相似上面两图的计算,咱们将 Nim和当作一个竖的加法。咱们找到第一列有奇数个“1”的那一列,并把任意在这一列上的“1”换成0,而后在这个数后面继续找,发现某一列的“1”的个数为奇数时,咱们只要把这一列的数取反就好,即“1”变“0”,“0”变“1”。这样得出来的这个数,就是你要拿掉火柴后剩下的数。显然的,这样的一个数是确定找获得的。也就是说,能够从该位置找到至少一个达到Nim和为0的方法,符合N位置的性质。
$x_1⊕x_2⊕...⊕x_n =0 \( 由\)N、P$位置的定义,咱们知道每一个 \(P\) 位置所能移动到的都是 \(N\) 位置。假设咱们这时候把 \(x_1\) 上拿掉火柴,使它变成\(x_1’\) 根(\(x_1’<x_1\))。由于 \(x_1⊕x_2⊕...⊕x_n =0\) ,因此 \(x_1’⊕x_2⊕...⊕x_n ≠0\) ,也就是所能获得的都是 \(N\) 位置,符合 \(P\) 位置的性质。
反Nim游戏是在逆规则下进行的Nim游戏,也就是最后操做的人失败。
在逆规则下,还能找到对于任意状态的必胜解法吗?一开始想以为好像有点麻烦,但仔细想一想,实际上是能够比较简单地解决的。
先手胜当且仅当
证实:
若全部堆石子数都为1且SG值为0,则共有偶数堆石子,故先手胜。
1)只有一堆石子数大于1时,咱们总能够对该堆石子操做,使操做后石子堆数为奇数且全部堆得石子数均为1。 II
2)有超过一堆石子数大于1时,先手将SG值变为0便可,且总还存在某堆石子数大于1。
(摘自: http://hzwer.com/1950.html)
对于反Nim游戏,其实还算比较简单的。但,是否是对于其它的游戏,它们在逆规则下也是能够这样去简单分析呢?嗯,实际上对于一些游戏是能够的,可是对大部分游戏来讲,就算它们在正常规则下很容易分析,但在逆规则下会变得十分复杂,好比在后文中介绍的 Kayles and Dawson’s chess(第3章,第4部分)。
在这里,咱们将用有向图来表示以前所讲的几种游戏,咱们用点来表示游戏中的状态,而用边来表示一个状态能到达另外一个状态。接着咱们会定义一个叫作 \(SG\) 函数的东西,而在第四部分中咱们将介绍 \(SG\) 定理,它能够更方便咱们去肯定\(N、P\) 位置。
一个有向图 \(G\),是一对 \((X,F)\) ,其中X为一个非空点集(位置),而 \(F\) 是表示对于任意 \(x∈X,F(x)∈X\),表示能够将 \(x\) 移动到的位置的集合,咱们称 \(F(x)\) 为 \(x\) 的后继。显然,若是 \(F(x)\) 为空集,那么 \(x\) 为终点。
两我的在 \(G=(X,F)\) 的图上进行图论游戏,以 \(x_0\) 为起点,双方轮流操做。在位置 \(x\) ,操做者能够将 \(x\) 移动到任意\(x_t∈F(x)\) 。移动到终点的人为胜利者。若是按着这个规则,可能会出现这个图论游戏能够无限制地进行的可能,因此《Game Theory》中给出以下定义:
To avoid this possibility and a few other problems, we first restrict attention to graphs that have the property that no matter what starting point x0 is used, there is a number n, possibly depending on x0, such that every path from x0 has length less than or equal to n. (A path is a sequence \(x_0, x_1, x_2,...,x_m\) such that \(x_i ∈ F(x_{i−1})\) for all \(i = 1,...,m\), where m is the length of the path.) Such graphs are called progressively bounded. If X itself is finite, this merely means that there are no cycles. (A cycle is a path, \(x_0, x_1,...,x_m\), with \(x_0 = x_m\) and distinct vertices \(x_0, x_1,...,x_{m−1}, m ≥ 3\))
这里就是给出了一个图的限制:图的大小无限,可是从图上任意一个点,必定存在一个正整数 \(n\),使从该点开始到终点的全部路径长度都不大于 \(n\)。
为了方便讲解,咱们拿第一部分中的 \(S=\{1,2,3\}\) 的减法游戏进行分析。剩余的火柴数为点,那么 \(n\) 就是起点。由于 \(0\) 终点,没有后继,因此 \(F(0)=\) ∅ 。一样的,咱们会获得 \(F(1) = \{0\},F(2) = \{0,1\}\),而且对于 \(2 ≤ k ≤ n, F(k) = \{k−3, k−2, k−1\}\) 。对于10根火柴的状况,咱们能够获得下图。
定义:\(g(x) = min\{n \ge 0: n \not = g(y) | y \in F(x)\}\)
用文字来表示,就是不存在于x的全部后继的SG函数值(后简称SG值)中的最小值。好比:\(F(4)=\{1,2,3\},g(1)=0,g(2)=1,g(3)=4\),那么 \(g(4)=3\)。再好比一样的\(F(4),g(1)=1,g(2)=2,g(3)=3\), 那么 \(g(4)=0\)。
咱们将定义中的式子简写为:
咱们会发现,求某个 \(x\),必须递归地去求出来,因此通常是用递推实现的。显然, F(0)=∅,因此 \(g(0)=0\),而对于全部后继只有终点的,\(g(x)=1\)。咱们后面将用这样的方式进行推导得出 \(SG\) 值。
若是咱们知道了\(SG\)值,对一个图论游戏的分析便变得很简单了。若是 \(g(x)=0\) ,显然这是个P位置,若是 \(g(x)≠0\),显然这是个 \(N\) 位置。说明以下:
固然,SG函数值确定包含不仅这些信息,更多的应用咱们将在第四部分的SG定理中看到,它能够解决多个图同时存在的图论游戏的问题。
咱们将用下图来介绍 \(SG\) 函数的推导过程。其实很简单,如定义中同样,只要找到一个点的全部后继,而后找到不在它们后继的 \(SG\) 值之中的值便可。在图中,咱们能够发现有4个终点,位于图的左侧和底部,这四个点的SG值就为0。接着咱们会发现只有1个点的后继已经所有肯定了,就是a点,它的SG值为1。如今b和c的后继的SG值也已所有肯定,因此b,c的SG值分别肯定出来。这样不断重复这个过程,知道将整张图的SG值都肯定下来。
对于以前提到的 \(S=\{1,2,3\}\) 的减法游戏,它对应的SG函数是怎样的呢?终点 \(0\),\(g(0)=0\)。状态1只能移动到终点 \(0\),因此 \(g(1)=1\) 。状态2能够移动到 \(0,1\) ,因此 \(g(2)=2\) 。同理获得 \(g(3)=3\) 。对于状态4,它能移动到 \(1,2,3\) ,分别对应\(g(x)=\{1,2,3\}\),因此 \(g(4)=0\)。继续重复下去,咱们会获得:
观察后发现,\(g(x)=0\) 当且仅当 \(x\ mod\ 4=0\)
下面提到一种叫作至少拿一半的游戏。一样是火柴堆,可是每次你至少要拿走一半。和上面同样,咱们会得出它的SG函数:
观察后,会发现 \(g(x)=min\{k|2k > x\}\)
而后仔细一想,是否是脑子进水了才去算SG值,至少拿一半,我所有拿掉不就得了...可是,在下一部分中咱们会发现计算SG值是颇有必要的,配合这 Nim和 来使用,能够很方便地处理多堆火柴的状况。
给定多个组合游戏,那么你能够将这几个组合游戏合成一个新的游戏。游戏规则以下:
假定咱们有多个知足第三部分中限制的图 \(G_1=(X_1,F_1),G_2=(X_2,F_2),...,G_n=(X_n,F_n)\) 。咱们能够把这多个图组成一个新的游戏 \(G=(X,F)\),称之为图 \(G_1,G_2,...,G_n\) 的和,表示为 \(G=G_1+G_2+...+G_n\)。点集X是多个点集的笛卡尔乘积,\(X=X_1*X_2*...*X_n\),即集合中的点为 \(\{x_1,x_2,...,x_n\}\) ,其中对于任意 \(i∈[1,n], x_i∈X_i\) 。同时对于一个点,其后继 \(F(x)\) 定义为
所以,从 \(x=\{x_1,x_2,...,x_n\}\) 开始的一步移动,就是将其中任意一个 \(x_i\) 移向 \(F(x_i)\)。这样的游戏成为图论游戏的和。
若是每一个子游戏都知足第三部分中对图的限制,那么所获得的母游戏也符合那个限制。其移动步数的最大值显然就是全部子游戏移动步数最大值的和。
接下来介绍的 \(SG\) 能够很方便地求出对于图论游戏的和中的 \(SG\)值。这须要用到以前所提到的Nim和。
\(SG\) 定理:母游戏的SG值等于其各个子游戏的SG值的Nim和。
SG定理在大多数组合游戏的和中能够用于求出其SG函数值,而更多的时候,咱们是经过SG定理暴力求出SG函数值以后去寻找规律,减小麻烦。在《Game Theory》中有讲到不少实用的例子,做者因为时间以及能力问题暂未可以彻底理解,在此不进行展开阐述。 请感兴趣的读者自行阅读《Game Theory》\(4.3\)~\(4.4\),\(5.1\)~\(5.4\) 。
第五部分来自 OI wiki 和 Coco_T
从某一棵树上删除一条边,同时删去全部在删除边后再也不与根相连的部分。双方轮流进行,没法再进行删除者断定为失败,也就是比你拿掉最后一部分你就赢了。一个游戏中有多棵树,咱们把它们的根都挂在天花板上…或者说,放在地板上也行..这么作是为了方便后面的一些解释和处理。
在这篇文章中,咱们讨论的将是公平游戏,也就是双方能够删除任意的边,咱们称这个游戏为:Green Hackenbush,暂且称之为树上公平删边游戏。这个命名是由于还有另一种删边游戏,为不公平的,参与者双方一方只能删除蓝色边,一方只能删除红色边,而绿色边是两边均可以删除的。
为了更好地解决树上删边游戏的相关问题,咱们引入“竹子”。竹子长的像下面这样
根据上面的游戏规则,拿掉竹子上的某一节,那么竹子上面的那些也会跟着被删掉。仔细想一想会发现,这不就是最简单的Nim游戏吗?有不少堆火柴,每次只能拿走某一堆火柴中的任意数量的火柴。而这里则是有不少个种在地板上的竹子,咱们每次只能选一根出来,任意砍掉一部分或者所有。既然发现这是Nim游戏了,那么相应的SG值就知道了: g(x)=x..
搞定竹子以后,咱们就能够来研究树上删边游戏究竟要怎么解决。其实,树上删边游戏就是个披了层树皮的Nim游戏。为何这么说呢,咱们介绍克朗原理
克朗原理:对于树上某一个点,它的分支能够转换为以这个点为根的一根竹子,这个竹子的长度等于它各个分支的边的数量的异或和。
(怕翻译很差因此把原文放上来:When branches come together at a vertex, one may replace the branches by a non-branching stalk of length equal to their nim sum.)
如今咱们来分析下图所示的树上删边游戏。
对于第一个图,1号点有2个分支,分支上的边树分别为一、1,异或和为0,因此1号点的分支被替换为长度为0的竹子,也就是说上面两个分支被删掉了。因此对于2号点,就剩下2个分支,同理被消掉。最后这个图被转化为一根长度为1的竹子,其SG值为1。
对于第二个图,分析过程以下,SG值=8
对于最后一个图,同理能够得出 \(SG\) 值=4。
如今,咱们就能够算出这个游戏在当前状态的SG值:\(1\) xor \(8\) xor \(4=13 ≠0\),因此这个是先手必胜状态,也就是N位置。而后剩下的就是找要到删去哪条边了。
假设咱们要删掉的是图3.1中第二棵树上的某一条边,也就是说,咱们要让这棵树的SG值变为 1 xor 4=5,才能使获得的游戏状态的SG值为0.
咱们看图3.2中的倒数第二个图,这里面所获得的竹子长度: 3 xor 2 xor 6=7,咱们要让它变成4,这样子加上最下面那条边的话得出来就是5. 由于 2 xor 6=4,因此能够直接删掉最左边的3条边。固然,若是要删除中间的话,那么删除的条数就是 2-4 xor 3 xor 6=1,同理,删除最右边的话,就要删去 6-4 xor 3 xor 2=1条。
好了,这样子咱们就利用克朗原理解决了树上删边游戏的问题。关于克朗原理的证实,由于笔者比较懒因此就不翻译过来了。请看下面这段:
Proof of the Colon Principle. Consider a fixed but arbitrary graph, G, and select an arbitrary vertex, x, in G. Let H1 and H2 be arbitrary trees (or graphs) that have the same Sprague-Grundy value. Consider the two graphs G1 = Gx : H1 and G2 = Gx : H2, where Gx : Hi represents the graph constructed by attaching the tree Hi to the vertex x of the graph G. The colon principle states that the two graphs G1 and G2 have the same Sprague-Grundy value. Consider the sum of the two games as in Figure 6.4(下图).
The claim that G1 and G2 have the same Sprague-Grundy value is equivalent to the claim that the sum of the two games has Sprague-Grundy value 0. In other words, we are to show that the sum G1 +G2 is a P-position. (证实两个游戏的SG值相同,只要证实它们的SG值异或后为0便可,也就是当作一个Nim游戏的和来理解)
Here is a strategy that guarantees you a win if you are the second player to move in G1 + G2. If the first player moves by chopping one of the edges in G in one of the games, then you chop the same edge in G in the other game. (Such a pair of moves may delete H1 and H2 from the games, but otherwise H1 and H2 are not disturbed.) If the first player moves by chopping an edge in H1 or H2, then the Sprague-Grundy values of H1 and H2 are no longer equal, so that there exists a move in H1 or H2 that keeps the Sprague-Grundy values the same. In this way you will always have a reply to every move the opponent may make. This means you will make the last move and so win.(其实就是轮流取,慢拿的确定赢,由于每次均可以拿走和被取走那部分SG值相同的。)
其实克朗原理的意思应该这么理解,对树上一个点,在它的分支都被转换成竹子以后,咱们能够求出它的SG值,而克朗原理是说,能够将它替换称一个SG值相同的竹子。其实,不仅仅对于树上删边游戏,应该是对于博弈论大部分问题,只要SG值相同,均可以相互转换。上面的证实是证实能够转换的缘由。
研究过树上的,如今来讨论下图上删边游戏的。就像下面这样的图:
在《Game Theory》的第四章中,咱们知道任意一个图均可以等价为一个Nim游戏中的火柴堆(Nim堆)。为了找到这个火柴堆,咱们须要试着把这个图转换成一棵树,而后就能够用上面的办法转换成一个Nim堆。这里咱们介绍另外一个原理,费森原理。
费森原理:环上的点能够在被融合,且不改变图的 SG 值。
(原文:The vertices on any circuit may be fused without changing the Sprague-Grundy value of the graph.)
其实这个原理看起来好像没什么用,可是,这个原理使咱们能将一个图去化简成为咱们可以计算的样子。如今咱们看看在图4.1是怎么化简的。
首先,咱们先研究下最左边那个房子的门。如图4.2所示,地板上的那两个点能够当作一个,由于地板其实就是一个点,那么门就变成了地板上的一个三角形。接着,就用到费森原理了。三角形是一个环,而咱们能够把环上的点换成连在一个点上的三个环。其实这里能够看出,费森原理是容许咱们将环上的点换成一个环去表示。最后,每一个环分别等价于一个大小为1的Nim堆,因此这三个环的异或和(Nim sum,后称为Nim和)是1,等价于一个大小为1的 Nim堆。
通常来讲,咱们能够把一个带有奇数边的环等价于只有一个端点的一条边,而偶数边的环等价于一个点。举个例子,图4.1中第二个图,树上的环带有4条边,等价于一个点,因此这棵树就被等价为一条边,即等价于一个大小为1的Nim堆。一样的,图4.1中的房子上的烟囱能够等价为一个点,右边的窗也能够等价为一个点。接着,如图4.3进行转换,咱们会获得房子的SG值为3。
下面,请本身尝试计算图4.1最右边的人的SG值,答案为4。而后,试试看你能不能找到图4.1为状态的游戏的解法。
《Game Theory》给的练习真的是太逗了。
答案(从右到左): 2 4 2 5