组合游戏学习笔记 [补档]

基础

满足以下条件的游戏是组合游戏:

  • 有两人参与游戏, 轮流作出决策
  • 无法作出决策的人失败, 然后游戏结束
  • 游戏总能在有限次决策后结束
  • 游戏的同一个状态不会多次到达
  • 任意一个参与者在某一确定状态下可以作出的决策集合只与当前状态有关

定义先手必败状态为必败态, 先手必胜状态为必胜态, 则我们有

  • 无法进行任何移动的状态是必败态.
  • 可以移动到必败态的状态的是必胜态.
  • 所有移动都只能得到必胜态的状态是必败态.

考虑如何判断一个游戏中, 先手是否必胜: 根据定义, 由于游戏中任意状态都不可能重复出现, 因而每个状态都只能是必胜态或必败态, 并且可以根据上述规则计算出来, 进而判断游戏中先手是否必胜.

然而, 我们发现按照上述规则进行计算需要枚举每个状态以及它能转移到的所有状态, 复杂度开销较大, 因此考虑如何优化一些常见的组合游戏问题.

Bash博弈

Wythoff博弈

问题概述

两堆若干个物品, 两人轮流操作, 每次可以从一堆中取任意多个物品, 或者在两堆中取相同的任意多个物品, 不可以不取. 取走最后一个物品的人获胜. 问先手是否必胜.

解决

我们用二元组\((a, b)\)表示一种状态. 我们不妨假设\(a \le b\). 考虑任意两个必败态\((a_1, b_1)\)\((a_2, b_2)\)之间的关系, 有如下性质:

  • \(a_1\), \(b_1\), \(a_2\), \(b_2\)之间两两不相等. 证明:
    • \(a = b\)时, 可以同时在两堆中取\(a\)个物品, 继而转移到结束状态. 因此\(a = b\)的状态为必胜状态.
    • 当我们只取一堆中的物品时, \(a\)\(b\)中的一个数保持不变. 不妨假设\(a\)不变, 由于\((a, b)\)可以转移到\((a, c)\)(或者是\((c, a)\))的状态, 因而\((a, b)\)\((a, c)\)不可能同时是必败状态, 因而任意两个必败状态中不可能出现重复的数字
  • \(a_1 - b_1 \ne a_2 - b_2\). 证明: 对于\(a_1 - b_1 = a_2 - b_2\)的两种状态, 我们对\((a_1, b_1)\)在两堆中同时取出\(a_1 - a_2\)个物品, 即可得到\((a_2, b_2)\)状态, 因而这两种状态不可能同时是必败状态.

猜测所有必败状态的形式: 我们将所有必败二元组按照首元排序, 显而易见, 第\(0\)组为\((0, 0)\), 其后的每个必败二元组中首元为未在之前出现过的最小正整数, 并且第\(n\)组中两个数之差为\(n\). 直观地, 这些必败状态的前几位是这样的:\((0, 0)\), \((1, 2)\), \((3, 5)\), \((4, 7)\), \((6, 10)\), \(\cdots\)

证明:

首先用数学归纳法证明这种方法得到的状态一定都是必败态.

\(0\)组显然是必败状态. 假设我们已经得到了前\(n\)组必败状态, 考虑第\(n + 1\)组. 我们假设在第\(0\)\(n\)组中未出现过的最小非负整数为\(m\), 则第\(n + 1\)组显然是\((m, m + n + 1)\). ,考虑如何证明这一状态是必败状态:

  • 假如在\(m\)中取物品, 得到\((m - k, m + n + 1)\). 由于\(m\)为前\(n\)组中未出现过的最小非负整数, 因而\(m - k\)一定已经出现过. 根据前面的性质, 由于任意两组必败状态中的数字都不相同, 因而\((m - k, m + n + 1)\)不是必败状态.
  • 假如在\(m + n + 1\)中取物品, 得到\((m, m + n + 1 - k)\), 则两堆物品之差为\(n + 1 - k\), 必定在之前出现过. 由于任意两组必败状态的两堆物品之差不相同, 因而\((m, m + n + 1 - k)\)不是必败状态.

因而\((m, m + n + 1)\)不能转移到必败状态, 因而我们按照这种方法得到的状态一定都是必败状态.

同时, 我们还需要证明, 所有必败状态都可以通过这种方法得到, 换而言之, 就是这种方法无法得到的状态都是必胜状态.

证明非常简单, 考虑一个状态\((a, b)\), 假如不能通过上述方法得到, 则必然存在另一个\((a, c)\)状态是必败状态. 由于\((a, b)\)可以转移到\((a, c)\), 因而\((a, b)\)是必胜状态, 证毕.

因而这种方法是正确的.

Nim博弈

问题概述

Nim博弈应该是组合游戏中最广为人知的一个了. 给定\(n\)石子, 每堆\(a_n\)个, 两个人轮流取, 每次可以从一堆中取走任意多个石子, 取走对后一颗石子的人获胜. 问先手是否必胜.

解决

直接放公式吧: 一个状态为必败状态, 当且仅当\(a_1 \oplus a_2 \oplus \cdots \oplus a_n = 0\)

证明如下:

跟之前Wythoff博弈的证明一样, 首先还是用数学归纳法证明通过这个结论得到的状态都是必败态.

显而易见地, 对于\(a_1 = a_2 = \cdots = a_n = 0\), 有\(a_1 \oplus a_2 \oplus \cdots \oplus a_n = 0\), 且是必败态.

考虑之后的所有\(a_1 \oplus a_2 \oplus \cdots \oplus a_n = 0\)的状态, 由于无论将哪一个\(a_k\)改为\(a_k'\)都不能使得\(a_1 \oplus \cdots \oplus a_k' \oplus \cdots \oplus a_n = 0\), 因而这个状态不能转移至一个必败状态, 因而它本身为必败态.

然后证明不能通过这种方法得到的状态都是必胜态: 仍然是显而易见地, 我们可以通过将\(a_1 \oplus a_2 \oplus \cdots \oplus a_n \ne 0\)中的某一个数\(a_k\)改为\(a_k' < a_k\), 使得\(a_1 \oplus \cdots \oplus a_k' \oplus \cdots \oplus a_n = 0\), 因而它是必胜状态.

因而公式正确.

posted @ 2018-01-29 22:01  Zeonfai  阅读(196)  评论(0编辑  收藏  举报