前置知识:博弈论简介

本文讨论 公平组合游戏。

公平组合游戏中,最基础也最重要的是正常 Nim 游戏。Sprague–Grundy 定理指出,所有正常规则的公平组合游戏都等价于一个单堆 Nim 游戏。由此,可以发展出 Sprague–Grundy 函数和 Nim 数的概念,它们完全地刻画了一个正常规则的公平组合游戏。因此,本文首先建立了正常 Nim 游戏的结论和 Sprague–Grundy 理论。随后,本文讨论了算法竞赛中常见的一些公平组合游戏。

最后,本文简单地讨论了反常 Nim 游戏。反常游戏相对于正常游戏来说要复杂得多,也很少在算法竞赛中出现。本文提到的游戏,如果没有特别说明,均默认为正常的公平组合游戏。

「状态」、「局面」与「游戏」

本文会交替地使用这三个词语。在博弈论中,游戏的状态(state)通常包括到游戏的某一时刻为止,所有可能与游戏有关的信息。在一般的情形下,游戏的状态通常包括双方玩家过往的行动、已经实现的随机变量值、双方已知信息的内容等。游戏的局面(position)相对来说并非博弈论的标准术语,通常指在游戏的某一时刻,双方玩家面对的局势,例如棋类游戏中各棋子的位置等。仅对于公平组合游戏(或更一般的零和、确定、完美信息游戏)而言,由于游戏不涉及随机性,且玩家未来的行动集合与收益函数均与到达当前局面的历史路径(即之前双方的行为)无关,所以,游戏的状态(state)和局面(position)没有区别,且都可以看作博弈图上的一个结点(node)。由于一个游戏(game)总是可以由它的初始局面描述,所以有时也会直接使用「局面」一词代指游戏本身。

Nim 游戏

Nim 游戏的规则很简单:

Nim 游戏

共有 堆石子,第 堆有 枚石子。两名玩家轮流取走任意一堆中的任意多枚石子,但不能不取。取走最后一枚石子的玩家获胜。

容易验证,Nim 游戏是正常规则的公平组合游戏。

例子

举个例子。当前,有 堆石子,石子的数量分别为 。那么,可以取走第 堆中的 个物品,局面就变成了 ;也可以取走第 堆的 个物品,局面就变成了 。如果某一时刻的局面变为了 ,甲取走了第 堆的 个物品,也就是取走了最后一个物品,此时甲获胜。

博弈图和状态

Nim 游戏中,局面可能的变化可以用博弈图来描述。

将每一个可能的状态都看作是图中的一个结点,并将状态向它的后继状态(即通过一次操作可以达到的状态)连边,就得到一个有向无环图,这就是博弈图。图是无环的,因为 Nim 游戏中,每次操作,石子的总数量都是严格减少的。

例子

例如,对于初始局面有 堆石子,且每堆石子的数量分别为 的 Nim 游戏,可以绘制如下的博弈图:

马上就会提到,图中的红色结点表示必胜状态,黑色结点表示必败状态。

由于 Nim 游戏是公平组合游戏,每个玩家是否有必胜策略,只取决当前游戏所处的状态,而与玩家的身份无关。因此,所有状态可以分为(先手)必胜状态 和(先手)必败状态,分别记为 态和 态 1。这个定义适用于所有公平组合游戏。

通过下述引理,可以归纳地将所有状态标记为必胜状态和必败状态:

引理

正常规则的公平组合游戏中,

  1. 没有后继状态的状态是必败状态 ,
  2. 一个状态是必胜状态 当且仅当存在至少一个它的后继状态为必败状态 ,
  3. 一个状态是必败状态 当且仅当它的所有后继状态均为必胜状态 。

所有公平组合游戏中,博弈图都是有向无环图。所以,通过这三条性质,可以在绘制出博弈图后,在 的时间内,计算出每个状态是必胜状态还是必败状态。其中, 为博弈图的状态数目, 为边数,即所有状态可以采取的行动的数量的总和。

这一引理可以推广到反常游戏和有向图可能有环的情形。相关讨论详见 有向图游戏 一节。

Nim 和

继续考察 Nim 游戏。

通过绘制博弈图,可以在 的时间内求出某一局面是否是先手必胜。但是,这样做的复杂度过高,无法实际应用。实际上,可以发现 Nim 游戏的状态是否先手必胜,只与当前局面的石子数目的 Nim 和有关。

Nim 和

自然数 的 Nim 和(Nim sum)定义为 。

所谓 Nim 和,就是 异或运算。

定理

Nim 游戏中,状态 是必败状态 ,当且仅当 Nim 和

由此,可以在 时间内判断 Nim 游戏的一个状态是否为先手必胜状态。

Sprague–Grundy 理论

Sprague–Grundy 理论指出,所有公平组合游戏都等价于单堆 Nim 游戏。这一结论主要应用的场景,就是游戏由多个相互独立的子游戏组成的情形。此时,游戏的状态判定可以通过计算子游戏的 SG 函数值的 Nim 和来完成。如果游戏本身没有这样的结构,那么,判定必胜状态和必败状态只需要应用前文博弈图一节的 引理。

游戏的记法

前文已经说明,所有公平组合游戏都可以通过绘制博弈图来描述。由于博弈图中,每个状态的性质只由它的后继状态决定,所以,可以将博弈图中的一个状态 用它的后继状态的集合来表示。

例子(续)

以上文的博弈图为例,可以得到如下状态表示:

其中,,。

一个游戏可以用它的初始状态表示。

尽管公平游戏的表示可能相当复杂,单堆 Nim 游戏相对来说简单很多。只有一堆石子,石子数量为 时,它可以表示为

其中,记号 表示石子数量为 时的单堆 Nim 游戏(的初始状态)。

例子(续)

利用这一记号,上面的例子中的状态可以简单地表示为

在随后的讨论中,记号 应当理解为状态 是状态 的后继状态。

游戏的和与等价

游戏的等价关系,依赖于游戏的和 2 的概念。

游戏的和

游戏 和 的 和(sum),或称 游戏组合(combined game),记作 ,是指游戏

游戏的和,可以理解为由两个同时进行且互不干扰的子游戏组成的游戏,玩家在每一步能且只能选择其中一个子游戏移动一步,且游戏在两个子游戏都无法移动时结束。游戏的和的概念,可以推广到任意多个游戏的情形,且满足结合律和交换律——也就是说,多个游戏组合的结果,和组合进行的次序以及游戏的顺序都无关。Nim 游戏就是多个单堆 Nim 游戏的和。

一个观察是,尽管单堆 Nim 游戏中,除了没有石子的情形,都是先手必胜状态,但是这些不同的单堆 Nim 游戏在和其他的单堆 Nim 游戏组合起来时,得到的游戏并不相同。比如,游戏 只有在和另一个 组合时,才能得到一个必败游戏;和所有其他的游戏 组合,得到的游戏都是必胜游戏。

这个观察带来的启示是,可以通过考察与其他游戏的和来研究某个游戏的性质。这就引出了游戏的等价的概念。

游戏的等价关系

如果对于所有游戏 ,游戏 和 都同处于必败状态或必胜状态,那么,称游戏 和 等价(equivalent),记作 。

容易验证,这样定义的 确实是全体公平游戏上的 等价关系。

Sprague–Grundy 函数

对 Nim 游戏的分析说明,不同的单堆 Nim 游戏互不等价。但是,所有的公平游戏都等价于某个单堆 Nim 游戏。由此,可以给每个公平游戏都分配一个数字,这就是 Sprague–Grundy 函数。

为了证明这些结论,首先需要建立关于游戏等价关系的两个引理。第一,将必败游戏和任何游戏组合到一起,都和原来的游戏等价。

引理 1

对于游戏 和任何必败游戏 ,都有 。

第二,两个游戏等价,当且仅当它们的和是必败游戏。这一引理提供了证明两个游戏等价的方法。

引理 2

游戏 和 等价,当且仅当 是必败游戏。

利用这些引理,可以得到如下定理:

定理(Sprague–Grundy)

对于任何一个(有限)公平游戏 ,都存在 ,使得 成立。

这一结论说明,可以为每一个公平游戏 都分配一个自然数 ,使得 。

Nim 数

一个公平游戏 对应的 Nim 数(nimber)就是使得 成立的唯一自然数 。

这个将公平游戏映射到 Nim 数的函数称为 Sprague–Grundy 函数(Sprague–Grundy function),简称 SG 函数,记作 。由于每个公平游戏的状态都是另一个公平游戏,所以,对于公平游戏的每一个状态都可以计算相应的 Nim 数,也称为相应的 SG 函数值。

根据本节定理的证明过程可知,Sprague–Grundy 函数可以递归地计算如下:

推论

公平游戏 中的一个状态 对应的 Sprague–Grundy 函数值 满足

其中, 是没有出现在集合 中的最小自然数。

也就是说,一个状态的 SG 函数值,等于它的所有后继状态的 SG 函数值的 值。

利用 SG 函数值(即 Nim 数),可以判断一个状态是否为先手必胜状态。

推论

公平游戏 中的一个状态 是先手必胜状态,当且仅当 。

最后,游戏的和的 SG 函数值,就是子游戏的 SG 函数值的 Nim 和(即异或)。

定理(Sprague–Grundy)

对于公平游戏 ,有

利用这一定理,在计算游戏的和的 SG 函数值时,可以大幅简化计算。

由此,可以总结出 SG 函数值的计算方法:

  • 对于多个独立的游戏,可以分别计算它们的 SG 函数值,再求 Nim 和;
  • 对于单个游戏,每个状态的 SG 函数值都是它的所有后继状态的 SG 函数值的 值;
  • 特别地,终止状态(即没有后继状态的状态)的 SG 函数值为 。

Nim 数

所有的公平游戏都唯一对应一个 Nim 数。(有限)Nim 数的集合就是自然数集 。但是,它的代数性质和自然数集不同。具体来说,Nim 数上可以定义 Nim 和 、Nim 乘积 两种运算:

Nim 数的运算

对于 Nim 数 ,可以定义:

  • Nim 和 ,
  • Nim 积 。

全体 Nim 数在运算 和 下构成一个特征为 的 域。而且,这些运算以及它们的逆运算,对于前 个 Nim 数是封闭的;这就得到一系列大小为 的 有限域 。

常见的公平游戏

尽管 Sprague–Grundy 理论完全解决了公平游戏的问题,但是,处理实际的公平游戏时,直接应用 Sprague–Grundy 定理计算效率仍然不高。比如,Nim 游戏中,暴力计算 Sprague–Grundy 值的复杂度是指数级的。因此,往往需要通过打表的方式猜测具体的公平游戏的结论。

本节列举了一些常见的公平游戏及其结论。叙述结论时,本节只给出了必胜和必败状态的判断法则。至于必胜策略,就是进行恰当的操作,使得留给对手的局面恰好为必败状态。由于算法竞赛中经常出现这些游戏的变体,所以,掌握每个游戏的结论的证明过程也很重要。

本节结论的证明方法

本节结论的证明都是验证性的。对于一个游戏,结论中会描述它的先手必败状态和先手必胜状态。证明中,只需要验证从一个先手必败状态出发,只能得到先手必胜状态;而从先手必胜状态出发,总能得到至少一个先手必败状态。要将这些证明改写为严格的证明,需要建立博弈图,然后对博弈图上的状态应用数学归纳法,而这些验证的步骤就是其中的归纳部分。

Bachet 游戏

相较于单堆 Nim 游戏,Bachet 游戏限制了每次可以取走的石子的数量。

Bachet 游戏

有一堆石子,共计 枚。两名玩家轮流取走至少 枚、至多 枚石子。取走最后一枚石子的玩家获胜。

对此,有如下结论:

定理

游戏先手必败,当且仅当 。

Moore’s Nim-k 游戏

相较于 Nim 游戏,Moore’s Nim- 游戏允许一次性从 个石子堆中取石子。

Moore's Nim- 游戏

共有 堆石子,第 堆有 枚石子。两名玩家轮流取走至少 堆、至多 堆中的任意多枚石子,但不能不取。取走最后一枚石子的玩家获胜。

对此,有如下结论:

定理

将每一堆石子的数目都表示为二进制数,并对每个数位 ,都统计有多少堆石子数目的第 位是 ,并计算这个数目对于 的余数。如果对于每个数位,这个余数都等于 ,那么先手必败;否则,先手必胜。

阶梯 Nim 游戏

阶梯 Nim 游戏稍微复杂一些,它允许石子在相邻的堆之间移动。

阶梯 Nim 游戏

共有 堆石子,第 堆有 枚石子。两名玩家轮流操作,每次操作中,要么取走第 堆石子中的任意多枚,要么将第 堆石子中的任意多枚移动到第 堆,但不能不做任何操作。取走最后一枚石子的玩家取胜。

对此,有如下结论:

定理

游戏先手必败,当且仅当奇数堆石子数量的 Nim 和 。

Fibonacci Nim 游戏

Fibonacci Nim 游戏类似 Bachet 游戏,只有一堆石子,且限制了每次取走的数量。与 Bachet 游戏不同,Fibonacci Nim 游戏中,每次取走的数量的限制是动态的。

Fibonacci Nim 游戏

有一堆石子,共计 枚。两名玩家轮流取石子。第一个行动的玩家不限制取走的石子数目,但是不能取完石子;随后,每次取走的石子数目不得超过上次(指对手回合)取走的石子数目的二倍。每次取走的石子的数目不得为 。取走最后一枚石子的玩家获胜。

对此,有如下结论:

定理

游戏开始时,先手必败,当且仅当石子数目 是 Fibonacci 数。

Wythoff 游戏

Wythoff 游戏允许同时从多堆石子中移除,但是要求每堆移除相同数量的石子。

Wythoff 游戏

有两堆石子,分别有 和 枚石子。两名玩家轮流从其中一堆或两堆中取石子,不能不取,但要求从两堆都取石子时,取走的石子数量必须相同。取走最后一枚石子的玩家获胜。

对此,有如下结论:

定理

不妨设 ,那么,先手必败,当且仅当 ,其中, 是黄金分割比。

为了证明这一结论,需要用到如下引理:

Beatty 序列

设 为无理数。它生成的 Beatty 序列是 。

Rayleigh 定理

设 是两个无理数,且 。那么,序列 和 构成正整数集 的一个分划。此时,它们也称为互补的 Beatty 序列。

由此,可以得到前述结论的证明。

翻硬币游戏

翻硬币游戏也是一类常见的公平组合游戏。

翻硬币游戏

设 是一个 良基偏序集,映射 满足对于所有 集合都有 非空,对于 都有 ,而且对于所有 ,都有 。集合 的每个元素处都有一枚硬币,可能正面朝上也可能背面朝上。玩家轮流行动,选择一枚正面朝上的硬币 和集合 ,并将集合 中所有硬币翻转。将所有硬币都翻转到背面朝上的玩家获胜。

翻硬币游戏其实是一大类游戏。取决于具体的偏序集 和映射 的选择,翻硬币游戏的具体形式也有所不同。游戏描述中,映射 需要满足的条件是在说,每次玩家选择翻转硬币的集合 中,一定存在一枚正面朝上的硬币 ,使得集合 中所有元素都排在 前面。这保证了游戏可以在若干步后终止。

例子

  1. 设 且 。这相当于说,有一排 枚硬币,每次翻转一枚正面朝上的硬币,并且可以选择一枚它左侧的硬币翻转。
  2. 设 且 。这相当于说,有一排 枚硬币,每次翻转一段连续的硬币,但是必须保证这些硬币中最右侧的那枚硬币在翻转前是正面朝上的。
  3. 设 且 。这相当于说,有 行 列硬币,每次只能翻转一枚正面朝上的硬币。
  4. 设 是一棵有根树的结点集合,且 是顶点 到树根的路径经过的结点集合的子集中,所有包含 自身的子集的集合。这相当于说,有一棵有根树,每个结点处放置一枚硬币,每次翻转一枚正面朝上的硬币,并且可以选择它的若干个祖先结点处的硬币翻转。

尽管翻硬币游戏种类繁多,但是它们的求解思路是一致的。对于翻硬币游戏 ,设 为只有元素 处的硬币正面朝上的局面。这些局面称为基础局面。那么,任意一个局面 都可以看做是这些基础局面对应的游戏的和。也就是说,以下结论成立:

定理

对于翻硬币游戏 和局面 ,设其中正面朝上的硬币所处位置的集合为 。那么,局面 的 SG 函数值就是

利用这一结论,判断某一局面是否必胜,只需要计算其中所有正面朝上的硬币对应的基础局面的 SG 函数值,再求 Nim 和即可。这些基础局面的 SG 函数值也不难计算,因为它们的后继局面已经由映射 给出,且后继局面的 SG 值可以归纳地计算:

这相当于提供了一个基础局面 SG 函数值的递推公式。

二分图博弈

前置知识:二分图最大匹配

本节的最后,讨论二分图博弈。尽管这个游戏常称作二分图博弈,但是它的描述和结论的证明都与二分图的结构无关,所以,它的结论实际上对于一般的无向图都成立。但是,一般图的最大匹配较为复杂,所以这一结论常出现在二分图的题目中。

二分图博弈

两个玩家轮流行动。每个玩家面临的局面都由一个无向图 和它的一个顶点 构成。在一名玩家的回合中,若当前局面为 ,则该玩家必须选择一个与 相邻的顶点 。随后,将顶点 及其所有关联边从图 中删除,得到残余图 。新的局面即为 ,交由下一位玩家。若某位玩家在其回合开始时,当前顶点 在图中没有相邻顶点(即不存在合法选择),则该玩家无法行动,并因此输掉游戏。

对此,有如下结论:

定理

游戏先手必胜,当且仅当顶点 是图 的最大匹配关键点,也就是说,在图 的所有最大匹配中,顶点 都是匹配点。

求出二分图最大匹配关键点的算法详见 二分图最大匹配页面。

另外,二分图博弈还有一个变体:

二分图博弈的变体

设 是一个无向图,且图的每个顶点上都放置了一枚石子。两名玩家轮流行动取走石子。游戏开始时,先手玩家可以取走任何一枚石子;后续的回合中,每名玩家取走石子的顶点必须与上一回合中对方取走石子的顶点相邻。最先无法取走石子的玩家输掉游戏。

显然,这个变体相当于在前文所述二分图博弈中,让先手玩家选择初始局面,然后从后手玩家开始二分图博弈。因此,这个变体中,先手玩家必败,当且仅当每个顶点都是最大匹配关键点,亦即图 存在 完美匹配。

反常 Nim 游戏

本节讨论反常 Nim 游戏的求解。

Nim 游戏

共有 堆石子,第 堆有 枚石子。两名玩家轮流取走任意一堆中的任意多枚石子,但不能不取。取走最后一枚石子的玩家失败。

对此,有如下结论:

定理

反常 Nim 游戏中,状态 是必败状态 ,当且仅当

  1. 存在 使得 ,且 Nim 和 ,或者
  2. 对于所有 都有 ,且剩余的非空石子堆数是奇数。

有向图游戏

本文讨论的公平组合游戏,要求同一局面不能出现两次,也不存在平局的可能性。因此,对应的博弈图总是有向无环图。本节放宽了这一限制,讨论如何在一般的有向图上判定各个状态是先手必胜、先手必败或平局。

有向图游戏的规则和其他的公平组合游戏大体一致:从起始状态出发,轮流沿着有向图的边移动一步,直到无路可走。根据游戏是正常规则还是反常规则,最后一个不能移动的玩家分别是败者和胜者。在这样的游戏里,每个状态的胜负情况共有三种可能性:先手必胜、先手必败、平局。平局中游戏永远不会终止。尽管稍微复杂一些,但是关于必败状态和必胜状态的 引理 依然成立,而剩下的状态就是平局状态:

  • 一个状态有后继状态先手必胜,当且仅当后继状态之一是必败状态;
  • 如果一个状态有后继状态,那么它先手必败,当且仅当所有后继状态都是必胜状态;
  • 如果一个状态无法分类为必胜状态和必败状态,那么它就是平局状态。

要将所有状态分类为这三种状态,只需要采用类似 拓扑排序 的思路:

  1. 初始化时,记录所有状态的出度,将所有出度为零的状态压入队列,并根据游戏是正常规则或是反常规则分别设为必败状态或必胜状态。
  2. 弹出队首状态。如果是必败状态,则设前驱状态为必胜状态;否则,当前状态是必胜状态,将它的所有前驱状态的出度减一,并将出度为零的前驱状态设为必败状态。将可以判断是必胜或必败状态的前驱状态压入队列。
  3. 算法在队列为空时终止。尚未判断为必胜或必败状态的状态均为平局状态。

这一算法可以在 时间内将所有状态分类。

例题

本节讨论一些典型的例题。

有 堆石子。对于 ,石子堆 和 分为一组。两名玩家轮流操作,每次选择一组石子堆,将其中一堆移走,并将另一堆分为非空的两堆,放到该组石子堆所在的两个位置。如果所有石子堆都只有一枚石子,当前玩家就没有合法操作,输掉游戏。给定每堆石子的数量 ,问是否为先手必胜状态。

有 堆石子,第 堆有 枚。两人玩 Nim 游戏。现在,可以任意指定若干堆石子作为初始局面,并指定其中一堆石子要求先手玩家首轮必须从中取走石子,但不能指定取走石子的数目。问有多少种指定方式,使得先手无法获得胜利。数据满足 。

有 堆石子,第 堆有 枚。两人轮流取走石子,每次都只能从最左或最右的两堆中选择一堆取走任意枚石子,但不能不取。取走最后一枚石子的玩家胜利。问先手是否必胜。

习题

首先是一些模板题。它们是对本页面的结论的简单应用:

然后是一些思维性更强或更为综合的题目:

最后是一些二分图博弈的题目。由于需要用到一些二分图匹配的算法,故将它们单独列出:

参考资料与注释

Footnotes

  1. 「 态」和「 态」这两个名称分别表示「下一名玩家胜利」(Next player wins)和「前一名玩家胜利」(Previous player wins)。 ↩

  2. 本文讨论的「和」都是 长规则(long rule)下的 析取和(disjunctive sum)。这也是最常见的一种游戏组合方式。除此之外,还有其他可能的游戏组合方式。关于它们的详细讨论,可以参考 Conway, John H. On numbers and games. AK Peters/CRC Press, 2000. 一书的第 14 章。 ↩