所有的博弈问题都是一些看起来挺有趣的问题
实际上其中的分析比较复杂
那我们就来看看博弈中的一种特殊类型:威佐夫博弈
描述
威佐夫博弈( Wythoff′s W y t h o f f ′ s game g a m e )
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜
很典型的一个博弈问题
比较暴力的做法就是计算SG函数
一般来说我们先打个表看一下:
//打印必败态
void get()
{
int n=20;
for (int i=0;i<=n;i++)
for (int j=0;j<=n;j++)
{
int win=0,lose=0;
for (int k=1;k<=min(i,j);k++)
if (SG[i-k][j-k]) win++; else lose++;
for (int k=0;k<i;k++)
if (SG[k][j]) win++; else lose++;
for (int k=0;k<j;k++)
if (SG[i][k]) win++; else lose++;
if (lose==0) //所有后继都是必胜态,当前是必败态
printf("%d %d\n",i,j);
else SG[i][j]=1;
}
}
我们称这个问题中的必败态为奇异局势 (ak,bk) ( a k , b k )
可以看到, a0=b0=0 a 0 = b 0 = 0 , ak a k 是未在前面出现过的最小自然数,而 bk=ak+k b k = a k + k
性质
① 任何自然数都包含在一个且仅有一个奇异局势中
由于
ak
a
k
是未在前面出现过的最小自然数,所以有
a[k]>a[k−1]
a
[
k
]
>
a
[
k
−
1
]
而
bk=a[k]+k>a[k−1]+k>a[k−1]+k−1=b[k−1]>a[k−1]
b
k
=
a
[
k
]
+
k
>
a
[
k
−
1
]
+
k
>
a
[
k
−
1
]
+
k
−
1
=
b
[
k
−
1
]
>
a
[
k
−
1
]
② 任意操作都可将奇异局势变为非奇异局势
这个性质可以简单的理解为:必败态的后继一定都是必胜态
事实上,若只改变奇异局势
(ak,bk)
(
a
k
,
b
k
)
的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势
如果使
(ak,bk)
(
a
k
,
b
k
)
的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势
③ 采用适当的方法,可以将非奇异局势变为奇异局势
假设面对的局势是
(a,b)
(
a
,
b
)
,若
b=a
b
=
a
,则同时从两堆中取走 a 个物体,就变为了奇异局势(0,0)
如果
a=ak,b>bk
a
=
a
k
,
b
>
b
k
,那么,取走
b−bk
b
−
b
k
个物体,即变为奇异局势
如果
a=ak,b<bk
a
=
a
k
,
b
<
b
k
,则同时从两堆中拿走
a−a[b−a]
a
−
a
[
b
−
a
]
个物体变为奇异局势
如果
a>ak,b=ak+k
a
>
a
k
,
b
=
a
k
+
k
则从第一堆中拿走多余的数量
a−ak
a
−
a
k
即可
如果
a<ak,b=ak+k
a
<
a
k
,
b
=
a
k
+
k
,分两种情况
第一种,
a=aj(j<k)
a
=
a
j
(
j
<
k
)
,从第二堆里面拿走
b−bj
b
−
b
j
即可
第二种,
a=bj(j<k)
a
=
b
j
(
j
<
k
)
,从第二堆里面拿走
b−aj
b
−
a
j
即可
简单的证明
显然,两堆石头地位是一样的,我们用余下的石子数
(a,b)
(
a
,
b
)
来表示状态,并画在平面直角坐标系上
之后我们在坐标系上找到所有的奇异局势
先标出
(0,0)
(
0
,
0
)
,划去所有
(0,k),(k,0),(k,k)
(
0
,
k
)
,
(
k
,
0
)
,
(
k
,
k
)
的格点
找y=x上方未被划去的格点,标出
(1,2)
(
1
,
2
)
,然后划去
(1,k),(k,2),(1+k,2+k)
(
1
,
k
)
,
(
k
,
2
)
,
(
1
+
k
,
2
+
k
)
同时标出对称点
(2,1)
(
2
,
1
)
,划去
(2,k),(1,k),(2+k,1+k)
(
2
,
k
)
,
(
1
,
k
)
,
(
2
+
k
,
1
+
k
)
在未被划去的点中在
y=x
y
=
x
上方再找出
(3,5)
(
3
,
5
)
,以此类推
按照这样的方法做下去,如果只列出
a<=b
a
<=
b
的必败态的话,前面的一些是
(0,0),(1,2),(3,5),(4,7),(6,10),…
(
0
,
0
)
,
(
1
,
2
)
,
(
3
,
5
)
,
(
4
,
7
)
,
(
6
,
10
)
,
…
忽略
(0,0)
(
0
,
0
)
,记第
n
n
组必败态为
命题一:
a[n+1]=
a
[
n
+
1
]
=
前
n
n
组必败态中未出现过的最小正整数
如果不是未出现的数中最小的,那么可以从
a[n+1]
a
[
n
+
1
]
的状态走到一个使
a[n+1]
a
[
n
+
1
]
更小的状态,和我们的寻找方法矛盾
命题二:
b[n]=a[n]+n
b
[
n
]
=
a
[
n
]
+
n
归纳法:若前
k
k
个必败态分别为,下证:第
k+1
k
+
1
个必败态为
(ak+1,ak+1+k+1)
(
a
k
+
1
,
a
k
+
1
+
k
+
1
)
从该第
k+1
k
+
1
个必败态出发,一共可能走向三类状态,从左边堆拿走一些,从右边堆拿走一些,或者从两堆中拿走一些
下面证明这三类都是胜态
情况一:
由命题一,任意一个比
a[k+1]
a
[
k
+
1
]
小的数都在之前的必败态中出现过,一旦把左边堆拿少了,我们只要再拿成那个数相应的必败态即可
情况二之一(从右边堆拿走不太多):
这使得两堆之间的差变小了,
比如拿成了(ak+1,ak+1+m)
比
如
拿
成
了
(
a
k
+
1
,
a
k
+
1
+
m
)
,则可再拿成
(am,am+m)
(
a
m
,
a
m
+
m
)
情况二之二(从右边堆拿走很多):
使得右边一堆比左边一堆更少,这时类似于情况一,比如拿成了
(ak+1,am)
(
a
k
+
1
,
a
m
)
(其中
a[m]<a[k+1]
a
[
m
]
<
a
[
k
+
1
]
) ,则可再拿成
(am+m,am)
(
a
m
+
m
,
a
m
)
情况三:比如拿成
(am,am+k+1)
(
a
m
,
a
m
+
k
+
1
)
,则可再拿成
(am,am+m)
(
a
m
,
a
m
+
m
)
以上两个命题对于确定
(a[n],b[n])
(
a
[
n
]
,
b
[
n
]
)
是完备的了,给定
(0,0)
(
0
,
0
)
然后按照这两个命题,就可以写出
(1,2),(3,5),(4,7),…
(
1
,
2
)
,
(
3
,
5
)
,
(
4
,
7
)
,
…
这样我们得到了这个数列的递推式:
实际上 a[n] a [ n ] 和 b[n] b [ n ] 就是一个 Beatty B e a t t y 序列
Beatty B e a t t y 序列
Beatty定理
设a,b是正无理数且 1a+1b=1 1 a + 1 b = 1
记 P=[na]|n为任意的正整数,Q=[nb]|n为任意的正整数 P = [ n a ] | n 为 任 意 的 正 整 数 , Q = [ n b ] | n 为 任 意 的 正 整 数
( [x] [ x ] 指的是取 x x 的整数部分)
则与 Q Q 是的一个划分,即 P∩Q P ∩ Q 为空集且 P∪Q P ∪ Q 为正整数集合 N+ N +
取正无理数
α,β
α
,
β
,使得
1α+1β=1
1
α
+
1
β
=
1
构造两个数列
an,bn
a
n
,
b
n
,通项分别为
an=[αn]
a
n
=
[
α
n
]
bn=[βn]
b
n
=
[
β
n
]
an
a
n
为小于等于
αn
α
n
的最大整数
bn
b
n
为小于等于
βn
β
n
的最大整数
数列显然都是正整数数列
Beatty定理指出,两个数列都是严格递增的,并且每个正整数在两个数列中出现且仅出现一次。
严格递增:
因为 1α<1,α>1 1 α < 1 , α > 1 ,所以 an a n 相邻两项取整前相减大于1,取整后后面一项显然也大于前面一项
对 bn b n 同理出现且仅出现一次:
对于这个命题,我们只要证明,对于任意正整数 k k ,小于等于的正整数在两个数列中恰好出现 k k 次
设数列的前 p p 项小于等于(而不含 p+1 p + 1 项),又因为每一项取整前均为无理数,不可能取到整数值,于是有
αp<k+1 α p < k + 1
α(p+1)>k+1 α ( p + 1 ) > k + 1
两者综合起来,就有等式
p=[k+1α]
p
=
[
k
+
1
α
]
这就是小于等于k的正整数在数列
an
a
n
中出现的次数
对于数列
bn
b
n
同理
这样我们得到了小于等于
k
k
的正整数在两个数列中出现的总次数
注意到,两个向下取整符号内的数均为无理数,于是有严格的不等式
(k+1α−1)+(k+1β−1)<S<k+1α+k+1β
(
k
+
1
α
−
1
)
+
(
k
+
1
β
−
1
)
<
S
<
k
+
1
α
+
k
+
1
β
k−1<S<k+1
k
−
1
<
S
<
k
+
1
S=k
S
=
k
回到之前的问题
可以看到,奇异局势的规律非常符合Beatty定理
那我们就可以考虑计算出
α
α
和
an=[αn],bn=[βn]
a
n
=
[
α
n
]
,
b
n
=
[
β
n
]
an+n=[(α+1)n]=[βn]
a
n
+
n
=
[
(
α
+
1
)
n
]
=
[
β
n
]
解方程
1(α+1)+1α=1
1
(
α
+
1
)
+
1
α
=
1
得
α=sqrt(5)+12
α
=
s
q
r
t
(
5
)
+
1
2
到此,我们找到了该必败态的通项公式
实际上这组Beatty序列还有一些别的性质
比如当一个数是Fibonacci数的时候,另一个数也是Fibonacci数
而且两者的比值也越来越接近黄金比
总之卡着定义来就好了
结论
两个人如果都采用最优操作,那么面对非奇异局势,先手必胜;反之,则后手必胜
那么任给一个局势
(a,b)
(
a
,
b
)
,怎样判断它是不是奇异局势呢?
因为
ak=[k(1+sqrt(5))2],bk=ak+k(k=0,1,2,...n)
a
k
=
[
k
(
1
+
s
q
r
t
(
5
)
)
2
]
,
b
k
=
a
k
+
k
(
k
=
0
,
1
,
2
,
.
.
.
n
)
奇妙的是其中出现了黄金分割数: (1+sqrt(5))2=1.618... ( 1 + s q r t ( 5 ) ) 2 = 1.618...
因此,由 ak,bk a k , b k 组成的矩形近似为黄金矩形
由于
21+sqrt(5)=sqrt(5)−12
2
1
+
s
q
r
t
(
5
)
=
s
q
r
t
(
5
)
−
1
2
可以先求出
n=[a(sqrt(5)−1)2]
n
=
[
a
(
s
q
r
t
(
5
)
−
1
)
2
]
an=[n(1+sqrt(5))2]
a
n
=
[
n
(
1
+
s
q
r
t
(
5
)
)
2
]
,那么
b=a+n
b
=
a
+
n
若不等于,那么
a=an+1,b=a+n+1
a
=
a
n
+
1
,
b
=
a
+
n
+
1
若都不是,那么就不是奇异局势