浅谈博弈论

公平组合游戏

公平组合游戏(Impartial Game)的定义如下:

  • 游戏有两个人参与,二者轮流做出决策,双方均知道游戏的完整信息;
  • 任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关;
  • 游戏中的同一个状态不可能多次抵达,游戏以玩家无法行动为结束,且游戏一定会在有限步后以非平局结束。

有向图游戏

给定一个 Dag 和唯一的一个起点,起点处有一个棋子,双方轮流沿一条边移动棋子,无法移动者判负。

任何公平组合游戏都可以转化为有向图游戏,即点是状态,边是转移。

定义必胜态是先手必胜,必败态是先手必败,有如下三个定理:

  1. 若节点 x 没有后继,则 x 是必败态。
  2. 若节点 x 可以转移到一个必败态,则 x 是必胜态。
  3. 若节点 x 的后继都是必胜态,则 x 是必败态。

有向图的核

对于一个有向无环图 G=(V,E),如果存在点集 S,满足 S 是独立集,且 VSS 中的某一个点有直接连边,则称 SG 的核。

结论: 核的点集都是必败态。
证明考虑,对于 S 内的每一个点,若其向 VS 中的点 x 有边,则 x 一定可以通过一条边回到 S

四种经典组合游戏

尼姆游戏

给定 n 堆物品,第 i 堆物品有 ai 个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手是否必胜。

结论:定义 NimS=i=1nai。先手必胜当且仅当 S0

证明:
首先游戏的终止局面一定满足 S=0,此时先手必败。
对于 S0 的情况,设 S 二进制下最高位为 k,则一定存在奇数个 ai 满足 ai 的第 k 位为 1。任选一个 ai 使其变成 aiS,即可将 S 变为 0
对于 S=0 的情况,根据异或的性质,且不能不取,所以一定会变成 S0 的情况。

巴什博弈

1 堆石子,总个数是 n ,两名玩家轮流在石子堆中拿石子,每次至少取 1 个,至多取 m 个。取走最后一个石子的玩家为胜者。判定先手和后手谁胜。

结论:先手必败当前仅当 (m+1)|n
易证。

威佐夫博弈

有两堆石子,石子数可以不同。两人轮流取石子,每次可以在一堆中取,或者从两堆中取走相同个数的石子,数量不限,取走最后一个石头的人获胜。判定先手是否必胜。

将所有的局面对应到二维平面上的点。定义奇异点 (x,y) (xy) 为两堆石子分别有 xy 个,且是必败态。

结论:设 x=1+52,第 i 个必败态 (ai,bi) 满足 ai=ix,bi=i+ai=ix2
证明

斐波那契博弈

有一堆个数为 n(n2) 的石子,游戏双方轮流取石子,规则如下:

  • 先手不能在第一次把所有的石子取完,至少取 1 颗;
  • 之后每次可以取的石子数至少为 1,至多为对手刚取的石子数的 2 倍。

约定取走最后一个石子的人为赢家,求必败态。

结论:当且仅当个数为斐波那契数时是先手必败。

证明:
首先证明充分性。考虑归纳法。
对于 i2,显然都是必败态。
假设对于 ikn=fi 都成立,则 n=fk+1 成立。
考虑将 n 拆成两堆棋子,分别是 fkfk1
若先手取的石子数大于等于 fk1,则后手一定可以一次取完。
对于第一堆 fk1,由假设可知后手一定可以取到最后一个。设后手第一堆取到的最后一个的个数为 x,则 x23fk1<12fk
所以先手一定不能一次把第二堆取完。由假设可知,后手一定能取到第二堆的最后一个。所以 k+1 成立。

接下来证明必要性。
首先有 齐肯多夫定理:任何正整数可以表示为若干个不连续的斐波那契数之和。
该定理的证明考虑归纳。构造就从大到小大于等于一个斐波那契数就减去它。
先手从最小的斐波那契数开始选,因为不连续,所以后手一定不能取完下一个斐波那契数,变成了子问题,所以先手必胜。

SG 函数

对于一个有向图游戏而言,SG(u)=mex{SG(v)}
对于 n 个有向图游戏的组合游戏,设其起点分别为 s1,s2snSG(G)=i=1nSG(si)
先手必胜当且仅当 SG0

证明:
考虑将 mex 类比成取石子。
若向 SG 比当前点大的节点走,后继节点一定能通过一条边走到具有同样 SG 的节点。所以只需要考虑向 SG 比当前节点小的节点走。
因为 SG 递减,且减小的值可以在当前 SG 内任意选,当 SG=0 时为必败态。所以等价于 Nim 游戏。

Anti-SG

将公平组合游戏的终止态改为先手胜。

SJ定理:s1n 为游戏组合的所有游戏的起点,先手必胜当前仅当满足以下条件之一:

  1. i=1nSG(si)0maxi=1nSG(si)>1
  2. i=1nSG(si)=0maxi=1nSG(si)1

证明:
可以考虑分类讨论。这里类比前面公平游戏的证明,转化为 Nim 游戏来证。
首先,终止态一定满足条件 2。

对于 max1 的情况,等价于石子数都为 1。显然只有偶数堆时先手必胜。
当异或和不为 0 时,若只有一堆石子个数大于 1,则可以视情况调整使得剩下偶数堆。若有多堆大于 1,则类比 Nim 游戏一定能使异或和为 0
当异或和为 0 时,一定有大于 1 堆石子个数大于 1。根据 Nim 游戏,异或和一定不为 0。

Multi-SG

与普通 SG 的差别在于一个游戏的后继为多个游戏。

一个后继状态的 SG 为多个游戏的 SG 异或和。一个状态的 SG 为后继状态的 mex

Multi_Nim

类似 Nim,但是每次可以进行两种操作之一:

  1. 取石子。
  2. 将一堆石子数大于 1 的石子任意分为两堆非空石子堆。

Multi_SG 打表。

Every-SG

每个起点放一个棋子。每次移动所有能移动的棋子。不能移动判负。

等价于最后一个结束的游戏的胜负。
如果一个游戏必胜,一定是时间越长越好。如果是必败,一定是时间越短越好。
于是算出每一个游戏必胜的最长时间。所有游戏的最大时间是奇数则先手必胜。

石子游戏综合

限制个数的 Nim

每次限制最多取 k 个。
先对每个游戏考虑其 SG 函数。
对于 nk,SG(n)=n
对于 n/geqk,SG(n)=mexi=1k{SG(ni)}=nmod(k+1)
最后求出 SG 和即可。

阶梯 Nim

给定 n 堆物品,第 i 堆物品有 ai 个。两名玩家轮流行动,每次可以任选第 x(x0) 堆,将任意多个物品移动到第 x1 堆,可把一堆移光,但不能不移动。无法移动者判负。两人都采取最优策略,问先手是否必胜。

结论:只考虑下标为奇数的堆做普通 Nim

证明:第 0 堆是偶数堆,从偶数堆移动到奇数堆,一定可以从奇数堆同样的移动到偶数堆,所以这样的一次操作无效。

Nim-k

n 堆石子,每次可以选不超过 k 堆,从每堆拿走若干个。不能动的人输。

结论:对于每个二进制位,如果每一位都满足有 x 个在这位是 1(k+1)|x,则先手必败,否则先手必胜。

证明:
Si 表示二进制表示下第 i 位的和 mod(k+1) 的值。

首先终止状态一定满足所有 Si0

若存在 Si 不为 0 则一定可以通过一次操作使得所有的 Si0
考虑当前最大的 Si 不为 0 的位置,选出 x=Si 个第 i 位为 1 的数。则这 x 个数剩下的低位的 0/1 状态可以随便改变。
考虑第二大的不为 0 的位置的 Sj=r,之前选出的数中有 a 个数第 j 位为 1b 个为 0
ar,将 r1 改为 0
bk+1r,将 k+1r0 改为 1
a<r,b<k+1r,新选 y=ra 个第 j 位为 1 的数。满足 x+y=a+b+ra=b+r<k+1r+r=k+1。故合法。

若所有的 Si0 则一定不可以通过一次操作使得所有的 Si 依然为 0
因为每次最多选 k 堆 进行操作,所以 Si 变化的绝对值一定小于 k+1,所以只有使所有的 Si 不变才能维持 0
这意味着对于所有的位置,01 的数量等于 10 的数量。
对于每一个 01 都一定存在更高位 10,所以最高位一定只有 10
所以不合法。

也可以考虑直接讨论 SG 函数构造的合法性,即 mex 是否合法。
证明

Anti-Nim

取走最后一个石子的人输。

结论:如果每堆石子都只有一个,则偶数时先手必胜,否则异或和不为 0 先手必胜。

Anti-Nimk

取走最后一个石子的人输。

结论:
设石子数转为二进制进行 k+1 进制加法得到的和为 S

先手必胜当前仅当满足以下条件之一:

  1. S0maxi=1nSG(si)>1
  2. S=0maxi=1nSG(si)1

翻硬币

n 个硬币排成一行,有正有反,从左向右按 1n 编号。
按照某种规则选取硬币集合翻转,但是受到操作的最右侧的硬币必须从正面翻到反面(否则转移可能成环)。

一般需要利用不同游戏具有同样的 SG 值可以互相抵消这一特点。

每次只能翻一或两枚(不用连续)

将整个游戏拆分成只有右侧一枚硬币的单一游戏。
对于右侧棋子编号为 x 的游戏,将其看做是有 x 颗石子的石子堆。然后做 Nim
翻一枚等价于取掉整堆。
翻两枚 i,j,等价于取走 ji 颗石子,也就是说取走一堆 j 个的石子堆,加入一个 i 个的石子堆。如果原本 i 是正面朝上,那么就能看做是两堆石子数同样是 i 的互相抵消。

每次必须翻动相邻的三枚硬币

打表找规律。转成巴什博弈。
n=1,硬币为 1,SG(1)=0
n=2,硬币为 01,SG(2)=0
n=3,硬币为 001,SG(3)=1
n=4,硬币为 0001,操作一次后变成 0110SG(4)=mex{SG(3)SG(2)}=0
n=5,硬币为 00001,操作一次后变成 00110SG=mex{SG(4)SG(3)}=0

整个表形如 001001001
所以结论是 SGk1011 循环。

每次能够翻动一、二或三枚硬币

1 开始的 SG 值为:1,2,4,7,8,11,13

结论:第 iSG 值为第 i 个二进制下有奇数个 1 的数。
快速的生成方式:从 0 开始标号,如果 i 二进制下有奇数个 1,则 SG=2i,否则为 2i+1

每次能够连续翻动随意个硬币,至少翻一个

1 开始的 SG 值为:12141218

结论:第 iSG 值为 i 的质因数分解中 2 的乘积。

每次必须翻转4个对称的硬币,最左与最右的硬币都必须是从正翻到反

每个状态被表示成最右端和最左段的正面。
1 开始的 SG 值为:0,0,0,1,1,2,2,3,3,4,4

结论:第 iSG 值为 max{0,i21}。等价于正多边形中不等的对角线个数。

无向图删边

不平等博弈

杂题

见博弈论杂题

BZOJ 3759 Hungergame

[POI2004]Gra

P5363

P3185

P3235

CF1091H

P5387

P4077

P4279

P2490

HDU2897

P1857

P4363 [九省联考2018]一双木棋chess

CF138D

CF1585G

CF273E

CF1312F

CF1498F Christmas Game

CF142D Help Shrek and Donkey 2

HDU3595 GG and MM

CF930D Game with Tokens

CF1221E Game With String

CF1368F Lamps on a Circle

posted @   zym417  阅读(155)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示