Skip to content
Cavill's Blog
Go back

Chasing the Golden Snitch

Edit page

在 Harry Potter 里面,Quidditch 是一种受到了几乎全世界巫师喜爱的扫帚运动。而 Golden Snitch 则是这种扫帚运动最有趣的一种比赛用球。不仅因为它快如闪电,更因为抓住它的球队可以赢得额外的 150 分,这很有可能扭转胜负的局势。

格兰芬多队追球手金妮·韦斯莱。

关于详细的规则参见:Quidditch
那么我们关注的重点就是在这场 magic game 里,搜寻手如何在一个不断变化的环境中追踪一个随机移动目标?

Table of contents

Open Table of contents

最简单和朴素的想法就是把场地的任何一个位置都搜寻一遍,这样我们总是可以找到对吧?但问题在于在一个三维空间进行这种搜寻方式需要损耗的时间和精力是无法接受的,效率过低。而且 Golden Snitch 还在高速移动,所以对于比赛而言,这是下策。

暴力搜索的问题就在于这种方式会忽略种种对于提高搜寻概率的条件置若罔闻,原著中这样写道:

And then he saw it. A spearing flash of gold, a flutter of tiny wings — the Snitch.

这告诉我们一个信息,Golden Snitch 经过的地方会留下 a flash of gold。这对我们来说非常重要,那么我们在看到光芒之后会优先选择前往它出现的地方,这是一个很自然的想法。但问题在于 Golden Snitch 会高速移动,那么等到搜寻手赶到上一次 Golden Snitch 出现的位置,可能它已经逃之夭夭了。所以这种方法也被否决了。

所以真正聪明的搜寻手会选择去看哪里 Golden Snitch 出现的概率最高,然后前往那个位置。也就是基于目前掌握的所有信息,来推理计算此时哪里出现 Golden Snitch 的概率最高,这才是一种真正聪明的做法。因此,让我们来探索和解释如何利用这种方式去完成高效的搜寻吧!

Derivation

我们可以把整个 Quidditch 球场看作一个三维空间,并为每一个位置赋予一个概率:P(x,y,z)P(x,y,z),用于表示 Golden Snitch 出现在坐标 (x,y,z)(x,y,z) 的可能性。
一开始,由于搜寻手没有任何信息。我们假设 Golden Snitch 出现在任何位置的概率相同,即服从均匀分布。

设:当 Golden Snitch 经过 (x0,y0,z0)(x_0,y_0,z_0) 时,会在该位置留下一道强度为 I0I_0 的光芒。残光随着时间 tt 指数衰减:

I(t)=I0eλtI(t) = I_0 e^{-\lambda t}

其中 λ\lambda 是衰减系数,我们在时间 tt 观察到光芒的强度为 I(t)I(t)
所以我们可以通过贝叶斯定理来更新 Golden Snitch 出现在 (x0,y0,z0)(x_0,y_0,z_0) 的概率:

P(x0,y0,z0I(t))=P(I(t)x0,y0,z0)P(x0,y0,z0)P(I(t))P(x_0,y_0,z_0|I(t)) = \frac{P(I(t)|x_0,y_0,z_0) P(x_0,y_0,z_0)}{P(I(t))}

其中:

P(I(t)x0,y0,z0)I(t)P(I(t)|x_0,y_0,z_0) \propto I(t) P(x0,y0,z0)=1VP(x_0,y_0,z_0) = \frac{1}{V}

其中 VV 是球场的体积。

P(I(t))=VP(I(t)x,y,z)P(x,y,z)dxdydzP(I(t)) = \int_V P(I(t)|x,y,z) P(x,y,z) \, dx \, dy \, dz

通过以上公式,我们可以不断更新每个位置的概率分布,从而指导搜寻手前往最有可能出现 Golden Snitch 的位置进行搜寻。

From Search to Tracking

但是我们也说过,Golden Snitch 是一个高速移动的目标,所以我们不能仅仅依赖于当前的概率分布来进行搜寻,不然和 Greedy Search 好像没什么差别。我们需要考虑到 Golden Snitch 的运动轨迹和速度,从而进行动态追踪。
为了描述 Golden Snitch 的运动,我们需要引入一个状态,它在 tt 时刻的位置

xt=(xt,yt,zt)\mathbf{x}_t = (x_t, y_t, z_t)

但是,仅仅知道位置是不够的。例如,如果我们知道 Golden Snitch 当前位于某个位置:

xt1\mathbf{x}_{t-1}

我们仍然无法预测它下一秒会出现在哪里,因为它可能向任意方向移动。
因此,我们还需要考虑它的速度:

vt1\mathbf{v}_{t-1}

其中 vt1\mathbf{v}_{t-1} 表示 Golden Snitch 在上一时刻的运动速度。
在一个简单的运动模型中,我们假设 Golden Snitch 下一时刻的位置由当前的位置、速度以及随机扰动共同决定,满足马尔科夫性质:

xt=xt1+vt1Δt+ϵt\mathbf{x}_t = \mathbf{x}_{t-1} + \mathbf{v}_{t-1}\Delta t + \boldsymbol{\epsilon}_t

其中:

由于 Golden Snitch 的飞行并不是完全规则的,它可能突然改变方向或者速度,因此我们将这种随机扰动建模为高斯噪声:

ϵtN(0,σ2I)\boldsymbol{\epsilon}_t \sim \mathcal{N}(0,\sigma^2\mathbf{I})

其中 σ\sigma 控制随机扰动的大小。

Prediction Step

有了 Golden Snitch 的运动模型后,我们就可以根据过去的信息预测它下一时刻可能出现的位置。
假设在 t1t-1 时刻,我们已经根据之前所有观测得到 Golden Snitch 的概率分布:

P(xt1I1:t1)P(\mathbf{x}_{t-1}|I_{1:t-1})

其中:

当时间推进到 tt 时刻时,Golden Snitch 会根据运动模型移动,因此原来的概率分布也会随之变化。
新的预测分布为:

P(xtI1:t1)=P(xtxt1)P(xt1I1:t1)dxt1P(\mathbf{x}_t|I_{1:t-1}) = \int P(\mathbf{x}_t|\mathbf{x}_{t-1}) P(\mathbf{x}_{t-1}|I_{1:t-1}) d\mathbf{x}_{t-1}

只看这个公式可能有点抽象,我们这样理解:P(xt1I1:t1)P(\mathbf{x}_{t-1}|I_{1:t-1}) 表示在上一时刻,Golden Snitch 在各个位置出现的概率分布。P(xtxt1)P(\mathbf{x}_t|\mathbf{x}_{t-1}) 表示从上一时刻的位置 xt1\mathbf{x}_{t-1} 移动到当前时刻位置 xt\mathbf{x}_t 的概率分布。通过对所有可能的上一时刻位置进行积分,我们就得到了当前时刻 Golden Snitch 可能出现的位置的预测分布。

Measurement Update

然而,仅仅依靠运动模型进行预测是不够的。
因为 Golden Snitch 的运动包含随机性,我们无法准确知道它下一秒的位置。
因此,当搜寻手再次观察到新的金色闪光 ItI_t 时,需要利用新的观测信息修正预测结果。
根据 Bayes 定理,当我们根据前 t1t-1 个时刻的观测信息预测 Golden Snitch 在 tt 时刻可能出现的位置后,又获得了新的观测信息 ItI_t,我们可以利用当前的光芒信息对原来的预测进行修正,从而更新 Golden Snitch 出现在各个位置 xt\mathbf{x}_t 的概率分布:

P(xtI1:t)P(Itxt)P(xtI1:t1)P(\mathbf{x}_t|I_{1:t}) \propto P(I_t|\mathbf{x}_t) P(\mathbf{x}_t|I_{1:t-1})

其中:

这个过程不断循环,直到搜寻手成功抓住 Golden Snitch。
不过话说回来,虽然在理论上,我们完全可以通过上述公式精确地描述 Golden Snitch 的概率分布。然而,在实际计算中,由于 Quidditch 球场是一个连续的三维空间,直接计算这种高维积分往往十分困难。
因此,实际系统通常会采用粒子滤波(Particle Filter)来近似这种连续的概率分布。它不再尝试计算整个空间的精确概率,而是使用大量离散的「粒子」表示 Golden Snitch 可能出现的位置。
每一个粒子都可以看作一个可能的假设:

通过不断地移动、筛选和重新采样这些粒子,搜寻手就可以近似追踪 Golden Snitch 的运动轨迹。


Edit page
Share this post:

Previous Post
How Google Ranks the Web
Next Post
Implementing a Skip List from Scratch