前言
本篇为博弈论总结,文章会按题目类型分类。
基础铺垫——必胜点和必败点的介绍
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.解决:
设
(
a
k
,
b
k
)
(a_k,b_k)
(ak,bk)
(
a
k
≤
b
k
,
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.任何自然数都包含在一个且仅有一个奇异局势中。
由于
a
k
a_k
ak是未在前面出现过的最小自然数,所以有
a
k
>
a
k
−
1
a_k > a_{k-1}
ak>ak−1 ,而
b
k
=
a
k
+
k
>
a
k
−
1
+
k
−
1
=
b
k
−
1
>
a
k
−
1
b_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.任意操作都会将奇异局势变为非奇异局势。
事实上,若只改变奇异局势
(
a
k
,
b
k
)
(a_k,b_k)
(ak,bk)的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。如果使
(
a
k
,
b
k
)
(a_k,b_k)
(ak,bk)的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势。
c.采用适当的方法,可以将非奇异局势变为奇异局势。
1.若a=b,则同时从两堆中取走 a 个物体,就变为了奇异局势(0,0)
2.若a!=b,不妨设a<b
(1)若 a = a k 且 b < b k a=a_k且b<b_k a=ak且b<bk:同时从两堆中取走 a k − a b − a k a_k-a_{b-a_k} ak−ab−ak个物体,就变为了奇异局势 ( a b − a k , a b − a k + b − a k ) (a_{b-a_k},a_{b-a_k}+b-a_k) (ab−ak,ab−ak+b−ak)
(2)若 a = a k 且 b > b k a=a_k且b>b_k a=ak且b>bk:从b堆中取走 b − b k b-b_k b−bk个物品,就变为了奇异局势 ( a k , b k ) (a_k,b_k) (ak,bk)
求奇异局势的公式: a k = ⌊ k ( 1 + 5 ) 2 ⌋ , b k = a k + k a_k=\left\lfloor\dfrac{k(1+\sqrt5)}{2}\right\rfloor,b_k= a_k+k ak=⌊2k(1+5)⌋,bk=ak+k ( k = 0 , 1 , 2 , . . . , n ) (k=0,1,2,...,n) (k=0,1,2,...,n)
结论:
若
(
i
n
t
)
(
(
b
k
−
a
k
)
∗
(
1
+
5
)
/
2
)
!
=
a
k
(int)((b_k-a_k) * (1+\sqrt5)/2) != a_k
(int)((bk−ak)∗(1+5)/2)!=ak,先手必赢
若
(
i
n
t
)
(
(
b
k
−
a
k
)
∗
(
1
+
5
)
/
2
)
=
=
a
k
(int)((b_k-a_k) * (1+\sqrt5)/2) == ak
(int)((bk−ak)∗(1+5)/2)==ak,后手必赢
(三)尼姆博奕
普通尼姆博弈
1.问题模型:
有n堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
2.解决:
结论:记各堆物品个数分别为
a
1
,
a
2
,
a
3
,
.
.
.
,
a
n
a_1,a_2,a_3,...,a_n
a1,a2,a3,...,an
若
a
1
x
o
r
a
2
x
o
r
a
3
.
.
.
x
o
r
a
n
!
=
0
a_1\space xor\space a_2\space xor \space a_3...xor\space a_n != 0
a1 xor a2 xor a3...xor an!=0,先手必胜
若
a
1
x
o
r
a
2
x
o
r
a
3
.
.
.
x
o
r
a
n
=
=
0
a_1\space xor\space a_2\space xor \space a_3...xor\space a_n == 0
a1 xor a2 xor a3...xor an==0,先手必败
尼姆博弈的拓展
扩展形式1:限定每次取物上限
1.问题模型:
有n堆物品,其中第i堆有
p
i
p_i
pi个物品,两人轮流从某一堆取走一些物品,每次最多取走m个物品,谁不能继续取谁就输了。
2.解决:
结论:令S为
p
i
p_i
pi对m+1取模后异或和的结果,若S=0则为P局面,否则为N局面。
证明:将 p i p_i pi分解为 r i r_i ri和 k i k_i ki,其中 k i k_i ki为(m+1)的倍数。如果对手在 r i r_i ri内取物,则按照Nim游戏的走法,若不然,假设A取x个,那么B就取(m+1-x)个,使得游戏保持原有必胜态或必败态。
拓展形式2:每次允许从k堆中取物(Nimk问题)
1.问题模型:
有n堆物品,其中第i堆有
p
i
p_i
pi个物品,两人轮流从k堆中选若干物品取走,谁不能继续取谁就输了。
2.解决:
结论:我们把
p
i
p_i
pi这n个数转成二进制,然后每位分别相加,每位和%(k+1)即可。如果每一位结果都是0,则为P局面,否则为N局面。
扩展形式3:规定取物方向(阶梯Nim)
1.问题模型:
有 n堆石子,每堆石子的数量为
x
1
,
x
2
,
.
.
.
,
x
n
x_{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如下: S G ( x ) = m e x { S G ( y ) ∣ y 是 x 的 后 继 } SG(x)=mex\{ SG(y) | y是x的后继\} SG(x)=mex{SG(y)∣y是x的后继}。
SG函数性质:
(1)所有的终结点所对应的顶点,其SG值为0,因为它的后继集合是空集——所有终结点是必败点(P点)。
(2)对于一个
S
G
(
x
)
=
0
SG(x)=0
SG(x)=0的顶点x,它的所有后继y都满足
S
G
(
y
)
!
=
0
SG(y)!=0
SG(y)!=0——无论如何操作,从必败点(P点)都只能进入必胜点(N点)
(3)对于一个
S
G
(
x
)
!
=
0
SG(x)!=0
SG(x)!=0的顶点,必定存在一个后继点y满足
S
G
(
y
)
=
0
SG(y)=0
SG(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函数满足
S
G
(
x
)
=
x
SG(x) = x
SG(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.定理:
s
t
e
p
函
数
step函数
step函数:
在通过拓扑关系计算某一个状态点的SG函数时,对于SG值为0的点,我们需要知道最快几步能将游戏带入终止状态,对于SG值不为0的点,我们需要知道最慢几步游戏会被带入终止状态,我们用step函数表示这个值。
E
v
e
r
y
−
S
G
定
理
Every-SG定理
Every−SG定理:
对于Every-SG游戏,先手必胜当且仅当单一游戏中最大的step为奇数。