浅谈算法——博弈论(从零开始的博弈论)
网上的博弈博客和论文有很多,但是有些没有详细的证明,仅仅是给出了结论。今天作者将一些常见的博弈论模板集中起来,给大家介绍一下博弈论中一些单一游戏的决策和常见的Nim模板与证明。
注:下列游戏都建立在双方都有最优策略的情况下,若未加以说明,则每人每次至少取一个石子。
例1:取石子游戏之一
有两个游戏者:
约定:两人轮流取走石子,每次可取
问题:
分析:这是小学必备奥数题之一,我们可以很容易的知道,当
经过我们的分析发现,对这个游戏而言,
如果我们推广一下,每次不一定取
下面,我们现在介绍一下有关博弈的一些名词和概念
1、平等组合游戏
- 两人游戏。
- 两人轮流走步。
- 有一个状态集,而且通常是有限的。
- 有一个终止状态,到达终止状态后游戏结束。
- 游戏可以在有限的步数内结束。
- 规定好了哪些状态转移是合法的。
- 所有规定对于两人是一样的。
因此我们的例1提到的游戏即为一个平等组合游戏,但是我们生活中常见的棋类游戏,如象棋、围棋等,均不属于平等组合游戏,因为双方可以移动的棋子不同,不满足最后一个条件;而我们后续提到的游戏,以及博弈中的其他游戏,基本属于平等组合游戏
2、N状态(必胜状态),P状态(必败状态)
像例1的分析一样,
那么我们定义两个状态之间的转换:
- 所有的终止状态都为P状态
- 对于任意的N状态,存在至少一条路径可以转移到P状态
- 对于任意的P状态,只能转移到N状态
证明过于简单,这里不再赘述,我们只需要明白一点,每个人都会选择最策略即可。
当然这里所说的都是最后走步的人获胜的游戏,至于那些走到最后失败的游戏,我们在最后做了一个简单的讲解(Anti Nim)。
例2:取石子游戏之二
将例1的游戏扩展一下,我们定义一个集合
那么,
有没有必胜策略,我们关键是要找到哪些状态是P状态,哪些状态是N状态,不过,本题没有例1那么容易判断,因此我们需要引入一个新东西——SG函数,它的定义如下:
其中,mex(minimal excludant)是定义在整数集合上的操作。它的自变量是任意整数集合,函数值是不属于该集合的最小自然数。
那么,终止状态的SG值显然为
例3:取石子游戏之三
有
这题主要是为了加强大家对SG函数的理解,我们考虑从
我们把他们列出来找下规律:
0,1
0,2,1,3
0,4,2,5,1,6,3,7
0,8,4,9,2,10...
好像有个很奇怪的规律:数列在间隔递增,上一行的数间隔着插在下一行的数中间。没错,这就是本题SG函数的规律,先手必败当且仅当SG值为
例4:取石子游戏之四(Nim游戏)
有
这题相当于例2的扩展版本,由于这里有多堆石子,因此我们可以得到多个SG值,而且这些SG值必定为
Nim游戏的神奇之处在于它的SG值和异或扯上了关系,Nim游戏中先手必败当且仅当
首先,
- 交换律:
x\oplus y=y\oplus x - 结合律:
x\oplus(y\oplus z)=(x\oplus y)\oplus z - 拥有单位元:
0\oplus x=x - 相同两数运算为0:
x\oplus x=0 - 消除律:
x\oplus y=x\oplus z\Rightarrow y=z
当Nim游戏的SG值为
那么对于一个SG值不为
因此,我们得到,对于Nim游戏而言,必败状态当且仅当
例5:取石子游戏之五(Nimk)
有
首先这题又称Nimk,那么肯定和Nim游戏有关联,其实Nimk就是Nim游戏的一个简单扩展
Nimk存在必胜策略,当且仅当,将所有石子数转成二进制后,存在某位上,所有二进制数中1的个数之和
如何证明?首先终止局面全为
对于任意一种必胜状态,必然存在一种取石子方式,使得其可以转移到必败状态。我们设必胜状态下,
然后我们分情况讨论:
-
a\geqslant r$,则将$r$个$1\rightarrow0 -
b\geqslant k+1-r$,则将$k+1-r$个$0\rightarrow 1 -
重复上述操作,我们必然能使每一位上的
那么对于任意一个先手必败态而言,由于我们每次最多只能选取
其实Nim游戏相当于Nimk中
例6:取石子游戏之六(Wythoff's Game)
有两堆石子,个数为
这种情况下是颇为复杂的,普通SG函数已经无法解决这个问题。我们用
那么,我们该如何去找到这些奇异局势呢?
首先我们知道,局势
我们从直角坐标系来考虑,
这样我们可以得到前几个奇异局势是:
通过找规律,我们大胆猜测一下
下面我们给出其证明:
-
根据我们寻找奇异局势的方法,可以得知
a_{k} 为之前未出现的最小自然数 -
我们使用数学归纳法,假定之前的
k\in[1,n],(a_{k},a_{k}+k) 都为奇异局势,我们只需要证明(a_{n+1},a_{n+1}+n+1) 为奇异局势即可从局势
(a_{n+1},a_{n+1}+n+1) 出发,只可能走向三种状态,从左边拿一点,从右边拿一点,或者两边一起拿一点:情况一:因为比
a_{n+1} 小的数在之前都出现过,所以一旦左边少了,我们只要把右边拿到相同的情况即可情况二(右边取的较少):这样使得两堆之间差值变小了,变成了
(a_{n+1},a_{n+1}+m) ,这样我们拿成(a_{m},a_{m}+m) 即可情况二(右边取的较多):这样使得右边比左边少了,这样就变成了和情况一类似,可以直接取到奇异拘束
情况三:若拿成
(a_{m},a_{m}+n+1) ,我们直接取成(a_{m},a_{m}+m) 即可
奇异局势还有如下三条性质:
- 任何自然数都包含在一个且仅有一个奇异局势中。
- 任意操作都可将奇异局势变为非奇异局势。
- 采用适当的方法,可以将非奇异局势变为奇异局势。
我们同样给出其证明:
-
由于
a_{k} 是未在前面出现过的最小自然数,所以有a_{k}>a_{k-1} ,而b_{k}=a_{k}+k>a_{k-1}+k-1=b_{k-1}>a_{k-1} 。所以性质1,成立。 -
若只改变奇异局势
(a_{k},b_{k}) 的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。如果使(a_{k},b_{k}) 的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势。 -
假设面对的局势是
(a,b) :如果
a=b ,则同时从两堆中取走a 个物体,就变为了奇异局势(0,0) ;如果
a=a_{k},b>b_{k} ,那么,取走b-b_{k} 个物体,即变为奇异局势;如果
a=a_{k},b<b_{k} ,则同时从两堆中拿走a_{k}-a_{b-a_{k}} 个物体,变为奇异局势(a_{b-a_{k}},a_{b-a_{k}}+b-a_{k}) ;如果
a>a_{k},b=a_{k}+k ,则从第一堆中拿走多余的数量a-a_{k} 即可;如果
a<a_{k},b=a_{k}+k ,分两种情况:- 第一种,
a=a_{j},(j<k) ,从第二堆里面拿走b-b_{j} 即可; - 第二种,
a=b_{j},(j<k) ,从第二堆里面拿走b-a_{j} 即可。
- 第一种,
从如上性质可知,两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。
而且,通过如上性质,我们可以发现,
下面介绍下Beatty数列和Beatty定理:
取正无理数
构造两个数列
那么这个数列显然是正整数序列,Beatty定理指出,两个数列都是严格递增的,并且每个正整数在两个数列中只出现一次
我们给出其证明:
- 单调性:因为
\frac{1}{\alpha}<1,\alpha>1 ,所以\alpha n-1>\alpha (n-1) ,所以a_{n}-1>a_{n-1} ,b_{n} 也亦然如此。 - 完备性:我们要证明这个命题,只需要证明对于任意一个
k,(k \in Z^*) ,小于等于k 的数在序列中出现了k-1 次即可。
设数列
合并两式,得到
注意到两个取整函数中的数都是无理数,于是我们就有严格的不等式
于是有
我们回到之前的奇异局势,由于奇异局势中的
因为
那么,我们就得到了通项式:
所以对于任意局势,先手必败当且仅当局势为奇异局势,我们只需要用通项式判断其是否为奇异局势即可。
例7:取石子游戏之七(Fibonacci Nim)
有一堆个数为
- 先手不能在第一次把所有的石子取完;
- 之后每次可以取的石子数介于
1 到对手刚取的石子数的2 倍之间(包含1 和对手刚取的石子数的2 倍)。
约定取走最后一个石子的人为赢家,问
这个和之前的Wythoff's Game和取石子游戏有一个很大的不同点,就是游戏规则的动态化。之前的规则中,每次可以取的石子的策略集合是基本固定的,但是这次有规则:一方每次可以取的石子数依赖于对手刚才取的石子数。
这个游戏叫做Fibonacci Nim,肯定和Fibonacci数列:
就像Wythoff博弈需要Beatty定理来帮忙一样,这里需要借助Zeckendorf定理(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。
首先我们证明下Zeckendorf定理(齐肯多夫定理):
我们以
- 当
m 为Fib 数时,该定理成立 - 当
m 不为Fib 数时,设Fib_{p_{1}}<m<Fib_{p_{1}+1} 。
设
因为
故
所以Zeckendorf定理(齐肯多夫定理)对所有的
那我们再看看Fibnacci数列的必败证明:
首先给出三个定理,之后证明需要用到:
-
Fib_{n+1}<2*Fib_{n}<Fib_{n+2} -
Fib_{n+2}<3*Fib_{n} -
4*Fib_{n}<3*Fib_{n+1},(4*Fib_{n}<3*(Fib_{n}+Fib_{n-1})\Rightarrow Fib_{n}<Fib_{n+1}<3*Fib_{n-1})
同样运用数学归纳法:
- 当
i=2 时,先手只能取1颗,显然必败,结论成立。 - 假设当
i \leqslant k 时,结论成立。
则当
则我们可以把这一堆石子看成两堆,简称
(一定可以看成两堆,因为假如先手第一次取的石子数大于或等于
对于
如果先手第一次取的石子数
我们来比较一下
所以我们得到,
即后手取完
即
对于不是Fibonacci数列,首先进行分解。
分解的时候,要取尽量大的Fibonacci数。
比如分解
我们令先手先取完
此时后手相当于面临这个子游戏(只有
同理可知,对于以后的每一堆,先手都可以取到这一堆的最后一颗石子,从而获得游戏的胜利。
例8:取石子游戏之八(Staircase Nim)
有
Staircase Nim又名阶梯Nim,它其实可以通过一些转化变成我们所熟知的Nim游戏,先手必败当且仅当奇数阶梯上的石子数异或和为
假如我们是先手,我们就按照这个方法将多余的石子从奇数堆移动到偶数堆里面。
此后如果对手移动的是奇数堆,我们就继续移动奇数堆使得SG值重新变为
这样经过多次操作我们总能使奇数堆保持必胜状态,最后我们总可以在对手之后将石子从奇数堆移动到偶数堆,最后移动到第
所以通过整个过程我们可以发现,偶数堆中的石子不会影响整个游戏的结果,只有奇数堆中的石子会影响游戏结果。
因此对这个游戏而言,先手必败当且仅当奇数堆中的石子数异或和为
例9:取石子游戏之九(Anti Nim)
本题为例4(Nim 游戏)的变相版本,其他条件均不变,唯独定义:取到最后一个石子的人为输。那么
这题和Nim游戏非常类似,就是输赢的条件不同,但是这个游戏的胜利状态却和Nim有一些区别,这个游戏的的胜利当且仅当:
- 所有堆石子数都为
1 且SG值为0 - 至少有一堆石子数大于
1 且SG值不为0
我们对这个游戏进行分析,将其分为两种情况:
- 所有堆的石子数均为
1 - 至少有一堆石子数大于
1
对于第一种情况而言,我们可以很容易得到当堆数为奇数时,先手必败,否则先手必胜。
对于第二种情况而言,我们分两种情况进行讨论:
- 当SG值不为
0 时: 若还有两堆石子数目大于1 时,我们将SG值变为0 即可;若只有一堆石子数目大于1 时,我们总可以让状态变成有奇数个1 。所以当SG不为0时,先手必胜。 - 当SG值为
0 时: 这样的话至少会有两堆石子的数目大于1 ,那么先手决策完之后,必定会使局面的SG值不为0 ,这样便到了先手必胜局。所以当SG为0 时,先手必败。
但是上述有关的推导只对于Anti Nim成立,对与Anti SG-组合游戏这个推论是不成立的,因此Anti SG-组合游戏的推论我们是需要重新证明的。不过这篇博客主要讨论单一游戏的决策问题,因此对于SG-组合游戏不予以讨论,有兴趣的读者可以参考贾志豪《组合游戏略述——浅谈SG游戏的若干拓展及变形》