【数学】博弈论初步

平等博弈问题的基本模型:一个状态 DAG 上的移动。

解决博弈论的重要方法:打表

博弈论问题一般有一些方向:

  • 观察先手怎么做,后手怎么做。一般是一些显然的贪心策略。

  • 结合 SG 函数。

  • 结合已有模型。

Ferguson Game

两堆石子,每次可以清空一堆,拆另一堆为两堆,无法操作者输。

分两堆奇偶性画出状态转移,发现两奇必败,其他必胜。

Chomp Game

n×m 网格,每次拿走一个点右上的所有数,删除 (1,1) 的人输。

这题有一个非构造性的巧妙判断方法:考虑第一次无论怎么操作都会删掉右上角,所以先手拿掉右上角,如果后手此时必胜,则先手第一步学习后手的必胜策略即可。

所以 n=1,m=1 时后手必胜,否则先手必胜。

Bash Game

n 个石子,一次拿 [1,m] 个,无法操作的人输。

这题有两种分析方法:

第一种,考虑状态间的转移,考虑最后的必败状态是 n=0 ,也是 n0mod(m+1) 。考虑如果 n0mod(m+1) ,先手一定可以把它变成 n0 ,同理,如果一开始 n0 ,那么操作过后一定 0 ,由于石子数一定在减小,所以总有一个时候 n0 时失败。

这样得出先手必胜条件为 n0mod(m+1) 。这是一种十分常规的分析方法,考虑用合理的状态刻画先后手之间的互相转化,最后走到终点。

但是感觉这样设计状态有些唐突,我们考虑第二种,从终点开始, n=0 是必败态。容易得到 n[1,m] 是必胜态,因为一定可以一步取完。再推,发现 n=m+1 是必败态,因为后继状态全部必胜;同理又发现 n[m+2,2m+1] 是必胜态,因为可以转化到 m+1

这里得出了 SG 函数的一个弱化结论(十分显然):如果一个状态的后继状态中存在必败态,那么这个状态就是必胜态;否则为必败态。

这个结论有一个练习题:过河卒(作者省选的遗憾)。

SG 定理

我们定义 DAG 上一个节点的 SG 函数:

SG(u)=mex{SG(v)|(u,v)E}

其中无出度的点(必败)的 SG 值为 0

SG 函数的性质就是先手必胜当且仅当 SG 函数大于 0

有以下定理:

对于一个由多个不干扰的平行游戏组成的博弈,整体的 SG 函数值为子游戏 SG 值的异或和。

Nim Game

n 堆石子,第 i 堆有 ai 个,可以选取一堆并且拿走任意个石子(非 0),无法操作者输。

考虑用 SG 函数分析,如果列出 0,1,,ai 这些点代表石子个数,我们发现这些点构成一张竞赛图,其中大的连向小的。

不难归纳证明 SG(i)=i

根据以上定理,我们发现这个游戏先手必胜当且仅当所有堆的异或和大于 0

如果要具体分析的话,就是先手先操作使得异或和等于 0 ,后手一次操作一定让它变得大于 0 ,先手存在操作将异或和重新变回 0 (取最大的一堆),这样操作最后到 0 时一定轮到后手。

Lasker’s Nim Game

Nim 游戏,但是可以选择这一步分裂石子堆。

SG(x) 与新局面取 mex 就好了,由于是两堆并列,所以新局面是 SG(y) xor SG(xy)

打表发现:

kN+SG(4k)=4k1,SG(4k+1)=4k+1,SG(4k+2)=4k+2,SG(4k+3)=4k+4

k-nim Game

n 堆石子,每堆有 ai 个,每次可以选 k 堆拿,无法操作者输。

考虑如果 i,ai=1 ,那么就是一个 Bash Game。

考虑定义状态为对于所有堆,每一个二进制位 1 的个数都是 k+1 的倍数。当前操作者一次操作一定会让某些位 1 的个数不是 k+1 的倍数。由简单 nim 游戏我们可以发现,一定可以通过操作一个数改变某一位的值;同样地,操作最大的数可以改变所有位的值。由于每次操作不超过 k 个数,所以一个二进制位上可以改变不超过 k1 ,所以如果当前某些位不是 k+1 倍数,那么一定可以变成 k+1 的倍数。

所以类似地,这个游戏的结论就是先手必胜当且仅当某一位二进制 1 的个数不是 k+1 的倍数。

Anti-nim

nim 游戏,但是不能操作者胜。

考虑如果全部都是 1 ,那么偶数时先手胜,奇数时后手胜。

如果只有 1>1 ,那么先手可以决定取不取完,必胜;注意到这种情况所有堆异或和 >0

如果有很多堆 >1 ,且所有堆异或和 >0 ,那么先手可以操作一次使异或和 =0 ,此时一定不会出现上面的情况,后手操作一次后异或和一定重新 >0 ,总有一次会变成上面的情况,先手必胜。

反之,如果有多堆 >1 且所有堆异或和 =0 ,先手必败。

一些奇妙的转化
棋盘游戏

m×m 的棋盘和 n 个棋子,每次可以操作一个棋子向左下对角线方向,左边,下面移动任意格,一个棋子移到 (0,0) 就获胜。

这个和以往的博弈不同,一个到达就获胜,不能直接 SG 函数,考虑转化。

容易发现当前行动的这个人不会走到 (0,y),(x,0),(1,1) ,不然直接送掉。所以可以假设 (1,2),(2,1) 是棋子的终点,当所有棋子到达时,对手就被迫走上面三步,你就赢了。

所以把 (1,2),(2,1) 当作终点推 SG 即可。

Crosses and Crosses

一张 1×n 空纸条,可以涂黑一格,涂黑后连续三个黑就赢。

n5000

考虑涂黑一格后,左右延伸两格范围内都不能再涂,所以转化为左右两段的子问题,SG 函数递推即可。

翻硬币游戏

一排 n 个硬币, m 个朝上,每次选择区间并将所有硬币翻面,要求右端点的硬币一定朝上,无法操作者输。

1n109,1m105

翻硬币游戏的统一结论:这些硬币可以看作很多只有一个硬币的子问题的组合,SG 函数直接异或。

关于这个的感性证明就是考虑翻完最高位,并且同时将低位的很多硬币都翻转,相当于这些子问题的异或,如果某个低位本来就有朝上的硬币,那么会被抵消,同时异或运算也可以抵消,所以 SG 函数不被影响。

K 倍动态减法游戏

n 个石子,第一个人拿 [1,n1] 个,后面每个人拿的都不能超过前面一个人的 k 倍,不能操作者输。

k=1 :先手必胜当且仅当 n2i ,因为先手每次取 lowbit ,然后后手必须取更低的,会制造新的 1 ,而只有先手的操作会让 1 的个数减少,所以最后拿完的一定是先手,必胜。

如果是 2i ,那么先手拿完后会变成多个 1 ,后手采用相同策略。

k=2 :先手必胜当且仅当 nFibonacci 。考虑一个正整数一定可以拆分成若干个不相邻的 Fibonacci 数的和。有一个特征就是 fi+2>2fi ,所以我们就可以每次拿 Fibonacci 拆分中最低位,类比二进制计算。

最后通解也就可以构造:我们需要构造数列 {an} 使得任意一个正整数可以表示成若干个 ai 的和并且这种表示中相邻两项相差至少 k 倍。

a1=1 ,我们记数列 {bn}an 可以表示出的最大范围,接下来这样构造:

an+1=bn+1,bn+1=an+1+bj

j 是满足 kaj<an+1 的最大的 j ,由于 bn+1 前面表示不出,所以这一项一定要能表示这个数;bn+1 是因为选了 an+1 后下一项需要小于等于 an+1k

这样,策略就是取最小表示中最低的位来获得胜利,如果 n 是序列中的数的话就必败。

posted @   The_Last_Candy  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示