前言
本篇为博弈论总结,文章会按题目类型分类。
基础铺垫——必胜点和必败点的介绍
P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败。
N点:必胜点,处于此情况下,双方操作均正确的情况下必胜。
必胜点和必败点的性质:
1、所有终结点是 必败点 P 。(我们以此为基本前提进行推理,换句话说,我们以此为假设)
2、从任何必胜点N 操作,至少有一种方式可以进入必败点 P。
3、无论如何操作,必败点P 都只能进入 必胜点 N。
我们研究必胜点和必败点的目的是为题进行简化,有助于我们的分析。通常我们分析必胜点和必败点都是以终结点进行逆序分析。
思路清晰的题目
分析决策前后的不变量
(一)考虑奇偶性的变化
(二)考虑总量的不变性
对称构造
从特殊情况入手
(一)从最简单的必胜态入手
(二)从最简单的必败态入手
(三)从固定参数的情况进行讨论
(四)分析参数之间的大小关系
博弈树
(一)博弈树基础
(二)简单优化
(三)极大极小搜索和alpha-beta剪枝
经典博弈问题及其拓展问题
(一)巴什博奕
普通巴什博奕
1.问题模型:
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜(谁拿了最后一个谁赢)。
2.解决:
当n=m+1时,由于一次最多只能取m个,所以无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜,所以当一方面对的局势是n%(m+1)=0时,其面临的是必败的局势。
当n=(m+1)*r+s时,(r为任意自然数,0 < s ≤ m)时,只要先取者要拿走s个物品,局面便变成了n%(m+1)=0的必败局面,所以先取者必胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
3.变形:条件不变,改为最后取光的人输。
结论:当(n-1)%(m+1)==0时后手胜利。
巴什博奕的扩展——k倍动态减法游戏
1.问题模型:
有一个整数S(>=2),先行者在S上减掉一个数x,至少是1,但小于S。之后双方轮流把S减掉一个正整数,但都不能超过先前一回合对方减掉的数的k倍,减到0的一方获胜。
2.解决:
法一:曹钦翔的《从“k倍动态减法游戏”出发探究一类组合游戏问题》中提到了动态规划的优化算法:
咕咕咕。。。
法二:纯数学方法:
k=1的时候,
必败态是2 ^ i, 因为我们把数按二进制分解后,拿掉二进制的最后一个1,那么对方必然不能拿走倒数第二位的1,因为他不能拿的比你多。你只要按照这个策略对方一直都不可能拿完,而且一定会生成新的低位的1。所以你就会赢。而当分解的二进制中只有一个1时,因为第一次先手不能全部取完,所以后手一定有办法取到最后一个1,所以必败!
k=2的时候,
即为斐波那契博弈,必败态是斐波那契数列,这里用到一个斐波那契数列的性质,即任何数都可以表示成若干个“互不相邻的”斐波那契数的和,而不相邻的斐波那契数所差的倍数都是大于2的,那么我们就可以类比K=1的情况,把N按这种“斐波那契数列”的数制分解,每次仍然是取走最低位的1,由于后手无法取走高两位之上的1而前边的不相邻有保证了不会有连续的1出现,所以接下来就和K=1的时候一样了,每次取走最低位的1直到结束。
k>2的时候,
犹如Fibonacci博弈,我们首先要求一个数列,将n分解成数列中一些项的和,然后就可以按Fibonacci博弈的解决方法来完成,也可以按二进制的方法来理解,每次取掉最后一个1 还是符合上面的条件。
我们用a数组表示要被求的数列,b数组中的b[i]保存 a[0…i] 组合能够构造的最大数字。这儿有点难理解,所谓构造就是指n分解为Fib数相加的逆过程。举例说明,当k = 2 时,a[N]={1, 2, 3, 5, 8, 13, 21, 33…} (Fibonacci数组);那么b[3] 即 1、2、 3 能够构造的最大数字,答案是4,有点匪夷所思?或许你会问为什么不是5、6或者其它的什么,其实是这样的 ,4 能分解成 1+3 是没有争议的,但5能分解成2+3吗? 不能,因为5本身也是Fibonacci数;6虽然能分解,但不是分解成1+2+3,而是分解成1+5。
经过上述,我们知道b[i] 是 a[0…i] 能够构造出的最大数字,那么a[i +1] = b[i]+1;因为a数组(Fib数组)所存的数字都是不可构造的(取到它本身就是必败态),显然a[0…i]构造的最大数字 + 1 即为下一个不可构造的数字了(a[i + 1])。
然后关于b[i]的计算,既然是a[0…i]构造最大数字,那么 a[i]是一定要选用的(这儿需要一定的推理,a[i]构造数字时,相邻的j个是不能同时用的,就像上述的2、3不能构造出5一样,推理请自己完成),那么要选用的下一项只能递减寻找,直到找到 a[t] 满足 a[t] * K < a[i] ,而b[t]就是a[0…t]所能构造的最大数字,再加上a[i], 即为a[0…i]能构造的最大数字,于是b[i] = b[t] + a[i]。
求得数列后,之后的工作就简单了,跟Fibonacci博弈一样一样的,如果n=数列中的数,则必败,否则必胜;必胜时还要求输出第一步取法,按照上文的理解,将n分解之后,选择最小的一个a[i]即可(类似选择二进制的最小的1)。
(二)威佐夫博弈
1.问题模型:
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
2.解决:
设(ak,bk)(a_k,b_k)(ak,bk)(ak≤bk,k=0,1,2,…,n)(a_k ≤ b_k,k=0,1,2,…,n)(ak≤bk,k=0,1,2,…,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。
如何找出所有的奇异局势?
下面证明,根据下面的方法,可以构造出所有的必败态:
a. (0,0)是必败态。
b.第k个必败态的两个数相差为k(记(0,0)为第0个必败态)。
c. 已知前k个必败态,则最小的没出现过的正整数为第k+1个必败态的第一个数。
由构造方法,可以推出奇异局势的下述三条性质:
a.任何自然数都包含在一个且仅有一个奇异局势中。
由于aka_kak是未在前面出现过的最小自然数,所以有ak>ak−1a_k > a_{k-1}ak>ak−1 ,而 bk=ak+k>ak−1+k−1=bk−1>ak−1b_k= a_k + k > a_{k-1} + k-1 = b_{k-1} > a_{k-1}bk=ak+k>ak−1+k−1=bk−1>ak−1 。所以性质a成立。
b.任意操作都会将奇异局势变为非奇异局势。
事实上,若只改变奇异局势(ak,bk)(a_k,b_k)(ak,bk)的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。如果使(ak,bk)(a_k,b_k)(ak,bk)的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势。
c.采用适当的方法,可以将非奇异局势变为奇异局势。
1.若a=b,则同时从两堆中取走 a 个物体,就变为了奇异局势(0,0)
2.若a!=b,不妨设a<b
(1)若a=ak且b<bka=a_k且b<b_ka=ak且b<bk:同时从两堆中取走ak−ab−aka_k-a_{b-a_k}ak−ab−ak个物体,就变为了奇异局势(ab−ak,ab−ak+b−ak)(a_{b-a_k},a_{b-a_k}+b-a_k)(ab−ak,ab−ak+b−ak)
(2)若a=ak且b>bka=a_k且b>b_ka=ak且b>bk:从b堆中取走b−bkb-b_kb−bk个物品,就变为了奇异局势(ak,bk)(a_k,b_k)(ak,bk)
求奇异局势的公式: ak=⌊k(1+5)2⌋,bk=ak+ka_k=\left\lfloor\dfrac{k(1+\sqrt5)}{2}\right\rfloor,b_k= a_k+kak=⌊2k(1+5)⌋,bk=ak+k (k=0,1,2,...,n)(k=0,1,2,...,n)(k=0,1,2,...,n)
结论:
若(int)((bk−ak)∗(1+5)/2)!=ak(int)((b_k-a_k) * (1+\sqrt5)/2) != a_k(int)((bk−ak)∗(1+5)/2)!=ak,先手必赢
若(int)((bk−ak)∗(1+5)/2)==ak(int)((b_k-a_k) * (1+\sqrt5)/2) == ak(int)((bk−ak)∗(1+5)/2)==ak,后手必赢
(三)尼姆博奕
普通尼姆博弈
1.问题模型:
有n堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
2.解决:
结论:记各堆物品个数分别为a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1,a2,a3,...,an
若a1xora2xora3...xoran!=0a_1\space xor\space a_2\space xor \space a_3...xor\space a_n != 0a1 xor a2 xor a3...xor an!=0,先手必胜
若a1xora2xora3...xoran==0a_1\space xor\space a_2\space xor \space a_3...xor\space a_n == 0a1 xor a2 xor a3...xor an==0,先手必败
尼姆博弈的拓展
扩展形式1:限定每次取物上限
1.问题模型:
有n堆物品,其中第i堆有pip_ipi个物品,两人轮流从某一堆取走一些物品,每次最多取走m个物品,谁不能继续取谁就输了。
2.解决:
结论:令S为pip_ipi对m+1取模后异或和的结果,若S=0则为P局面,否则为N局面。
证明:将pip_ipi分解为rir_iri和kik_iki,其中 kik_iki为(m+1)的倍数。如果对手在rir_iri内取物,则按照Nim游戏的走法,若不然,假设A取x个,那么B就取(m+1-x)个,使得游戏保持原有必胜态或必败态。
拓展形式2:每次允许从k堆中取物(Nimk问题)
1.问题模型:
有n堆物品,其中第i堆有pip_ipi个物品,两人轮流从k堆中选若干物品取走,谁不能继续取谁就输了。
2.解决:
结论:我们把pip_ipi这n个数转成二进制,然后每位分别相加,每位和%(k+1)即可。如果每一位结果都是0,则为P局面,否则为N局面。
扩展形式3:规定取物方向(阶梯Nim)
1.问题模型:
有 n堆石子,每堆石子的数量为 x1,x2,...,xnx_{1},x_{2},...,x_{n}x1,x2,...,xn。A,B轮流操作,每次可以选第 k 堆中的任意多个石子放到第 k-1 堆中,第 1堆中的石子可以放到第 0堆中,最后无法操作的人为输。
2.解决:
结论:先手必败当且仅当奇数阶梯上的石子数异或和为 0
拓展形式4:不能继续取者赢(Anti-Nim)
1.问题模型:
有n堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得输。
2.解决:
结论:
1.每一堆石子只有一个 且 异或和为0
2.存在至少一堆石子多于一个 且 异或和不为0
满足上述任意一个条件,先手必胜
公平组合博弈(ICG)
1.定义:
(1)两人参与。
(2)游戏局面的状态集合是有限。
(3)对于同一个局面,两个游戏者的可操作集合完全相同
(4)游戏者轮流进行游戏。
(5)当无法进行操作时游戏结束,此时不能进行操作的一方算输。
(6)无论游戏如何进行,总可以在有限步数之内结束。
2.模型:
给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移动者判负。事实上,这个游戏可以认为是所有公平组合游戏(Impartial Combinatori Games)的抽象模型。其实,任何一个ICG都可以通过把每个局势看成一个顶点,对每个局势和它的子局势连一条有向边来抽象成这个“有向图游戏”。
SG函数与SG定理
1.SG函数(Sprague-Grundy函数):
首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数SG如下:SG(x)=mex{SG(y)∣y是x的后继}SG(x)=mex\{ SG(y) | y是x的后继\}SG(x)=mex{SG(y)∣y是x的后继}。
SG函数性质:
(1)所有的终结点所对应的顶点,其SG值为0,因为它的后继集合是空集——所有终结点是必败点(P点)。
(2)对于一个SG(x)=0SG(x)=0SG(x)=0的顶点x,它的所有后继y都满足SG(y)!=0SG(y)!=0SG(y)!=0——无论如何操作,从必败点(P点)都只能进入必胜点(N点)
(3)对于一个SG(x)!=0SG(x)!=0SG(x)!=0的顶点,必定存在一个后继点y满足SG(y)=0SG(y)=0SG(y)=0——从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点)
结论:
当SG[x] = 0时,x为必败态。
当SG[x] > 0时,x为必胜态。
SG函数的求法:
(1)可选步数为1-m的连续整数,直接取模即可,SG(x) = x % (m+1)(eg.Bash game);
(2)可选步数为任意步,SG(x) = x(eg.Nim game);
(3)通法:用mex(计算每个节点的值) 。
2.SG定理(Sprague-Grundy定理):
游戏和的SG函数等于各个游戏SG函数的Nim和。 这样就可以将每一个子游戏分而治之,从而简化了问题。
而Bouton定理就是Sprague-Grundy定理在Nim游戏中的直接应用,因为单堆的Nim游戏 SG函数满足 SG(x)=xSG(x) = xSG(x)=x。
三类特殊的SG游戏
Anti-SG游戏
1.定义:
Anti-SG游戏规定,决策集合为空的游戏者赢。其他规则与SG游戏相同。
2.SJ定理:
对于任意一个Anti-SG游戏,如果我们规定当局面中所有的单一游戏的SG值为0时,游戏结束,则先手必胜当且仅当:
1)游戏的SG函数不为0 且 游戏中某个单一游戏的SG函数大于1。
2)游戏的SG函数为0 且 游戏中没有单一游戏的SG函数大于1。
注意:如果所有单一游戏SG值都为0,而游戏还未结束的话,SJ定理是不适用的。
Multi-SG游戏
1.定义:
Multi-SG游戏规定,在符合拓扑原则的前提下,一个单一游戏的后继可以为多个单一游戏,其他规则与SG游戏相同。
2.定理:Multi-SG游戏的仍然可以用SG函数来定义局面。
注意区分后继以及多个单一游戏
对于一个状态来讲
不同的划分方法会有多个不同的后继
而在一个后继当中会有多个独立的游戏
该后继状态SG值即为后继状态中独立游戏的异或和
该状态的SG值即为后继状态的mex
Every-SG游戏
1.定义:
Every-SG游戏规定,对于还没有结束的单一游戏,游戏者必须对该游戏进行一步决策,其他规则与SG游戏相同。
2.定理:
step函数step函数step函数:
在通过拓扑关系计算某一个状态点的SG函数时,对于SG值为0的点,我们需要知道最快几步能将游戏带入终止状态,对于SG值不为0的点,我们需要知道最慢几步游戏会被带入终止状态,我们用step函数表示这个值。
Every−SG定理Every-SG定理Every−SG定理:
对于Every-SG游戏,先手必胜当且仅当单一游戏中最大的step为奇数。