博弈论——两人取子游戏与威佐夫博弈,隐藏在背后的黄金分割

本文始发于个人公众号:TechFlow,原创不易,求个关注


今天是算法和数据结构专题第25篇文章,我们继续博弈论专题。

在上一篇文章当中我们了解了最简单的巴什博奕,今天我们来看看另一个经典的博弈模型——威佐夫博弈。博弈论和机器学习有些类似,数学家们针对场景进行建模,设计出了几个经典模型。然后我们在面临具体问题的时候,对问题进行深入分析,寻找最合适的模型应用来解决它。


石子问题


我们来看一道经典的例题,有两堆石子,有两个绝顶聪明的人在玩一个游戏。每次每个人可以从其中一堆石子当中取走任意数量的石子,或者是从两堆当中同时取走相同数量的石子。无法取石子的人落败,请问,在告知两堆石子数量的情况下,这两个人当中哪一方会获胜?

我们简单分析一下,会发现一些局面是先手必败的。比如说(0, 0),再比如(1, 2)。我们简单分析一下(1, 2),先手有4种策略,首先他可以取走第一堆,那么后手可以取完第二堆,显然后手获胜。他也可以在第二堆当中取1个,这时剩下(1, 1),后手会同时取完,同样是后手获胜。第三种是他取走第二堆,后手可以取完第一堆,后手获胜。第四种是他在第一堆和第二堆当中同时取走一个,这时第二堆剩下一个,后手胜。

那么,这些必败的状态之间有什么规律呢?我们怎么找到这个规律,并且找到解呢?


分析


我们可以枚举几个必败的状态:(0, 0), (1, 2), (3, 5), (4, 7)…

我们观察一下这些状态,可以找到两条规律。我们假设从小到大排的第k个必败状态是(x, y),并且x < y。我们可以发现y = x + k。也就是说必败状态两个数的差值是递增的,这也说明了每一个必败状态的差值都各不相同。

其实这是很容易证明的,我们用反证法,假设(a, a+k), (b, b+k)都是必败状态,并且a < b。那么先手在面临(b, b+k)的时候,只需要在两堆当中同时取走b-a个石子,那么给后手的局面就是(a, a+k)。对于后手来说,这是一个必败的局面,这就和(b, b+k)先手必败矛盾,所以不存在两个必败局面的差值相等

我们也可以作图分析,我们把两堆石子的数量看成是坐标轴上的一个点。所以游戏就变成了:棋盘上有一个点,每次每个人可以将它向下、向左或者向左下移动若干个格子,不能移动的人输。终止节点显然是原点,一步就能移动到原点的点显然是必胜点,假设我们给这些所有必胜点都染色的话,剩下的的没当中横纵坐标和最小的点就是下一个必败点。因为它不论如何移动,都会给对手留下一个必胜点。

我们根据上面的逻辑把必败点都染色,可以得到下面这张图:

从这张图可以看出,必败点之间不能通过一次移动得到,换句话说可以一次移动到必败点的点都是必胜点,从图上可以看出,除了必败点的之外的点都是必胜点,并且每一个自然数都必然只会被包含在一个必败状态当中。

到这里,我们距离解法已经很接近了,现在剩下的问题是,我们如何根据x和y的取值快速判断它们是否构成一个必败局面呢?也就是说我们能不能找出一个通项公式,对于第k个必败局面,它的坐标是( x k , y k x_k, y_k xk,yk)呢?


求解


为了写出通项公式,我们需要引入Betty定理

设a和b是两个正无理数,并且 1 a + 1 b = 1 \frac{1}{a} + \frac{1}{b} = 1 a1+b1=1

记P={[ a n a_n an], n ∈ N + n \in N^+ nN+}, Q={[ b n b_n bn], n ∈ N + n \in N^+ nN+},则 P ∩ Q = ∅ P \cap Q = \varnothing PQ= P ∪ Q = N + P\cup Q = N^+ PQ=N+


证明


P ∩ Q = ∅ P\cap Q = \varnothing PQ=

反证,我们假设存在 k ∈ P k \in P kP并且 k ∈ Q k \in Q kQ,即存在正整数n, m满足 k < an, bm < k+1。

也就是: n k > 1 a > n k + 1 , m k > 1 b > m k + 1 \frac{n}{k} > \frac{1}{a} > \frac{n}{k+1}, \frac{m}{k} > \frac{1}{b} > \frac{m}{k+1} kn>a1>k+1n,km>b1>k+1m两个式子相加可以得到: m + n k > 1 > m + n k \frac{m+n}{k} > 1 > \frac{m+n}{k} km+n>1>km+n

k < n + m < k + 1 k < n+m < k+ 1 k<n+m<k+1,这与n,m,k都是正整数矛盾

P ∪ Q = N + P \cup Q = N^+ PQ=N+

反证,假设存在 k ∉ P k \notin P k/P k ∉ Q k \notin Q k/Q,即存在正整数n,m满足 a n < k < a ( n + 1 ) − 1 , b m < k < b ( m + 1 ) − 1 an < k < a(n+1)-1, bm < k < b(m+1)-1 an<k<a(n+1)1,bm<k<b(m+1)1

即: n k < 1 a < n + 1 k + 1 , m k < 1 b < m + 1 k + 1 \frac{n}{k} < \frac{1}{a} < \frac{n+1}{k+1}, \frac{m}{k} < \frac{1}{b} < \frac{m+1}{k+1} kn<a1<k+1n+1,km<b1<k+1m+1

相加,可以得到: m + n k < 1 < n + m + 2 k + 1 \frac{m+n}{k} < 1 < \frac{n+m+2}{k+1} km+n<1<k+1n+m+2

即:n + m < k < n + m + 1,这与n,m,k均为正整数矛盾

我们花了这么大力气来证明Betty定理就是为了用的,因为我们发现必败状态的通项和Betty定理序列很像。我们不妨假设存在这样的a, b同时满足Betty定理与必败状态的性质:

[ a n ] + n = [ b n ] , 1 a + 1 b = 1 [an] + n = [bn], \frac{1}{a} + \frac{1}{b} = 1 [an]+n=[bn],a1+b1=1

[ a n ] + n = [ a n + n ] = [ ( a + 1 ) n ] = [ b n ] [an] + n = [an + n] = [(a+1)n] = [bn] [an]+n=[an+n]=[(a+1)n]=[bn]

代入可以得到:

1 a + 1 a + 1 = 1 \frac{1}{a} + \frac{1}{a+1} = 1 a1+a+11=1

解这个方程,可以得到 a = 1 + 5 2 ≈ 1.618 a = \frac{1 + \sqrt{5}}{2}\approx 1.618 a=21+5 1.618,熟悉数学的同学相信一下就看出来了,这个数是黄金分割的比例,这是巧合吗,还是藏着更深的道理呢?

至少,求出了a之后,我们就可以非常简单地判断必败状态了:

import math
def lose_or_win(a, b):
    if a > b:
        a, b = b, a
    
    k = b - a
    # 根据差值k求出第k个必败状态,判断是否相等
    return not (int(k * (math.sqrt(5)+1) / 2)) == a

总结


和之前介绍的巴什博奕相比,威佐夫博弈的推导过程要复杂得多,但是虽然推导过程依然复杂,但是仍然挡不住最后实现的代码非常简单。

另外,在推导的过程当中,我们用到了Betty定理,这个定理的推导和证明虽然不难,但是如果不是数学专业的同学,可能大概率都没有接触过。这其实体现了博弈论本身和数学的关系是非常紧密的。一个看起来非常简单的问题,引申出了一系列眼花缭乱的推导和证明,怎么样,大家看得还过瘾吗?

今天的文章到这里就结束了,如果喜欢本文,可以的话,请点个关注,给我一点鼓励,也方便获取更多文章。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值