威佐夫博弈,Beatty定理和黄金分割数

所有的博弈问题都是一些看起来挺有趣的问题
实际上其中的分析比较复杂

那我们就来看看博弈中的一种特殊类型:威佐夫博弈

描述

威佐夫博弈 Wythoffs 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[k1] a [ k ] > a [ k − 1 ]
bk=a[k]+k>a[k1]+k>a[k1]+k1=b[k1]>a[k1] b k = a [ k ] + k > a [ k − 1 ] + k > a [ k − 1 ] + k − 1 = b [ k − 1 ] > a [ k − 1 ]

② 任意操作都可将奇异局势变为非奇异局势

这个性质可以简单的理解为:必败态的后继一定都是必胜态
事实上,若只改变奇异局势 (akbk) ( a k , b k ) 的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势
如果使 (akbk) ( a k , b k ) 的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势

③ 采用适当的方法,可以将非奇异局势变为奇异局势

假设面对的局势是 (a,b) ( a , b ) ,若 b=a b = a ,则同时从两堆中取走 a 个物体,就变为了奇异局势(0,0)
如果 a=akb>bk a = a k , b > b k ,那么,取走 bbk b − b k 个物体,即变为奇异局势
如果 a=akb<bk a = a k , b < b k ,则同时从两堆中拿走 aa[ba] a − a [ b − a ] 个物体变为奇异局势
如果 a>akb=ak+k a > a k , b = a k + k 则从第一堆中拿走多余的数量 aak a − a k 即可
如果 a<akb=ak+k a < a k , b = a k + k ,分两种情况
第一种, a=ajj<k a = a j ( j < k ) ,从第二堆里面拿走 bbj b − b j 即可
第二种, a=bjj<k a = b j ( j < k ) ,从第二堆里面拿走 baj 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],b[n])

命题一: a[n+1]= a [ n + 1 ] = n n 组必败态中未出现过的最小正整数
如果a[n+1]不是未出现的数中最小的,那么可以从 a[n+1] a [ n + 1 ] 的状态走到一个使 a[n+1] a [ n + 1 ] 更小的状态,和我们的寻找方法矛盾

命题二: b[n]=a[n]+n b [ n ] = a [ n ] + n
归纳法:若前 k k 个必败态分别为(ak,ak+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]|nQ=[nb]|n P = [ n a ] | n 为 任 意 的 正 整 数 , Q = [ n b ] | n 为 任 意 的 正 整 数
[x] [ x ] 指的是取 x x 的整数部分)
P Q Q Z+的一个划分,即 PQ P ∩ Q 为空集且 PQ 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 k
    设数列an的前 p p 项小于等于k(而不含 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 的正整数在两个数列中出现的总次数
S=[k+1α]+[k+1β]

注意到,两个向下取整符号内的数均为无理数,于是有严格的不等式
(k+1α1)+(k+1β1)<S<k+1α+k+1β ( k + 1 α − 1 ) + ( k + 1 β − 1 ) < S < k + 1 α + k + 1 β
k1<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数
而且两者的比值也越来越接近黄金比

总之卡着定义来就好了

结论

两个人如果都采用最优操作,那么面对非奇异局势,先手必胜;反之,则后手必胜

那么任给一个局势 (ab) ( a , b ) ,怎样判断它是不是奇异局势呢?
因为
ak=[k(1+sqrt(5))2]bk=ak+k(k=012...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...

因此,由 akbk 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+1b=a+n+1 a = a n + 1 , b = a + n + 1
若都不是,那么就不是奇异局势

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值