公平组合游戏ICG
- 两名玩家交替行动
- 游戏进程任意时刻,可执行的合法行动与轮到哪位玩家无关
- 游戏中同一个状态不能多次抵达,游戏以玩家无法行动为结束,且定会在有限步后以非平局结束
有向图游戏(博弈图)
给定一个有向无环图,有唯一的起点,其上放有一枚棋子,两名玩家交替使棋子沿有向边移动,每次一步,无法移动者判负。
任何一个公平组合游戏都可以转化为有向图游戏。
- 先手必胜状态:可以让对方走到某一个必败状态
- 先手必败状态:对方走不到任何一个必败状态
定理:
- 没有后继状态的状态是必败状态
- 一个状态是必胜状态当且仅当存在至少一个必败状态为它的后继状态
- 一个状态是必败状态当且仅当它的所有后继状态均为必胜状态
依此,可以在绘出博弈图的情况下用 O(N + M) 的时间得出每个状态是必胜状态还是必败状态。(N 为状态种数, M 为边数)
- 必败点(P点):前一个选手将取胜的点
- 必胜店(N点):下一个选手将取胜的点
- 所有终结点是必败点
- 从任何必胜点操作,至少有一种方法可以进入必败点
- 无论如何操作,从必败点都只能进入必胜点
内固集:有向图中,集合 X 中任意两点之间无边。
外固集:有向图中,任意不在集合 X 中的点存在一条指向集合 X 的边。
核:有向图中,集合 X 既是外固集,又是内固集。
核是所有必败态的集合。
定理:双人博弈中,约定走最后一步为胜,如果有核存在,则其中一方有不败策略。
先手初始状态不在核中,则先手一定可以采取某种策略将状态走到核中,轮到B时,B无论采取什么策略,都将走出核,如此反复,A将使B永远面临核内状态。无路可走的状态不可能在核外,因为核外总能走到核内,A可以维持不败。
定理:有限个结点的无回路有向图有唯一的核。
尼姆博弈 Nim Game
给定 N 堆物品,第 i 堆物品有 Ai 个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手是否必胜。
不存在平局。
结论:
定义 Nim 和 为 a1 ^ a2 ^ …… ^ an
当且仅当 Nim 和为 0 时,该状态为先手必败,反之为先手必胜。
巴什博弈 Bash Game
有 1 堆石子,总个数是 n,两名玩家轮流在石子堆中拿石子,每次至少取 1 个,至多取 m 个。取走最后一个石子的玩家为胜者,判定先手和后手谁胜。
结论:
若 (m + 1)% n = 0 则先手必败,反之先手必胜。
威佐夫博弈 Wythoff Game
有两堆石子,石子数可以不同。两人轮流取石子,每次可以在一堆中取,或者从两堆中取走相同个数的石子,数量不限,取走最后一个石子的人获胜。判定先手是否必胜。
结论:
假设两堆石子为(a,b)其中 a < b
那么先手必败,当且仅当(b - a)* (5 ^ (1 / 2) + 1) / 2 = a
斐波那契博弈 Fibonacci Game
有一堆个数为 n (n >= 2) 的石子,游戏双方轮流取石子,规则如下:
- 先手不能在第一次把所有石子取完,至少取 1 颗。
- 之后每次可以取的石子数至少为 1 ,至多为对手刚取的石子数的 2 倍。
约定取走最后一个石子的人为赢家,求必败态。
结论:
先手必败,当且仅当石子数为斐波那契数。
SG函数 Sprague - Grundy
设 S 表示一个非负整数集合。
mex(S) 求出不属于集合 S 的最小非负整数的运算。
即 mex(S) = min{x},x 属于自然数,且 x 不属于 S。
SG函数 是对游戏图中每一个结点的评估函数。
规定游戏终点的 SG函数值为 0,即 SG(终点) = 0.
对于每个结点 x (局面),设从 x 出发共有 k 条有向边(合法操作),分别到达结点 y1, y2,……, yk(下一个局面),定义 SG(x) 为 x 的后继结点。
y1, y2,……, yk 的 SG函数值构成的集合再执行 mex(S)运算的结果,即:
SG(x) = mex({SG(y1), SG(y2), …… , SG(yk)})
特别的,整个有向图游戏 G 的 SG函数值被定义为有向图游戏起点 s 的 SG函数值。
若 SG(x) = 0,则为必败状态,若 SG(x) != 0,则为必胜状态。
(若非零则说明这个点直接指向0,即可以达到必败状态,为必胜状态)
性质:
- 对于任意的局面,如果它的 SG值为 0 ,那么它的任何一个后继局面的 SG值不为 0
- 对于任意的局面,如果它的 SG值不为0,那么它一定有一个后继局面的 SG值为 0
SG定理:
所有一般胜利下的公平组合游戏都能转化为 Nim数 表达的 尼姆堆博弈,一个博弈的 Nim值 定义为这个博弈的等价 Nim数。
即:对于当前游戏 X,它可以拆分为若干个子游戏 x1, x2, ……, xn,那么 SG(X) = SG(x1) ^ SG(x2) ^ …… ^ SG(xn)
对于由 n 个有向图游戏组成的组成游戏,设它们的起点分别为 s1, s2, ……, sn,则当且仅当 SG(s1) ^ SG(s2) ^ …… ^ SG(sn) != 0 时,这个游戏为先手必胜。
原来要考虑博弈图所有点,复杂度较高,但现在通过 SG函数,只需要考虑起点。