前两天看到一篇一个有趣的假设,里面提了一个问题:
请两位互相陌生的侦探A和B,然后让A跟踪B,B也跟踪A,而且他们是不知道相互跟踪这件事,那接下来会发生什么有趣的事儿?请各位脑洞大开,补充各种细节吧。
我不是侦探推理小说迷,所以没法从这个角度去开脑洞。不过,我倒是冒出一个想法,就是给这个问题建个模,写一个简单的程序跑一跑,看看能模拟出什么有意思的结果出来。
先说结论吧:如果我们采用二维随机行走的模型来描述侦探的行为,并且假设这两个侦探的跟踪能力完全相同,那么他们必然会在跟踪的过程中互相靠近,直到不能再近为止。互相跟踪,最后在一起,这不正是大家喜闻乐见的结局么?
本文用到的都是最基本的概率论与数学模型,不愿意看这方面内容的可以直接拉到后面看模拟结果。
建模与设定
这个模拟采用的随机游走模型是这样设定的:在一个二维平面上,一个人从原点(0,0)出发,每次以固定步长向任意方向随机走出一步。每一步选择的方位角是一个均匀分布的随机变量。这样,在N步之后,此人的最终位置作为一个随机变量,满足二维的正态分布。期望值为0,标准偏差则随步数N的增加而增加。这个结果可以很容易推导出来,这里就不写了。还是把模拟的结果画出来比较直观一些。
也就是说,在这种二维随机行走中,无论走了多少步,这个人最终位置的期望值依然在原点,没有移动。步数越大,只是导致标准差变大了大。
接下来,假设两个侦探的行为都符合这样的随机行走,不过,要加上一个“跟踪”行为。
真实世界的跟踪是个很复杂的活动,为了把事情充分地简化,我选择这么建模:
- 跟踪在一个无穷大无障碍的平面上进行,
- 跟踪成功与否仅由两者之间的距离决定。如果两者距离大于某个最大值R,则目标丢失,该侦探跟踪失败。
于是,侦探必须根据目标的运动相应的改变自己的位置,以保证自己永远处于以目标为圆心,以R为半径的圆形区域内。所以,侦探的跟踪能力就可以用R来描述。R越大,跟踪能力就越强。
加上这样定义的跟踪行为以后,我们的随机游走模型就要加以限制——选择每一步的方向的时候,要排除所有走出跟踪范围导致跟踪失败的方向。显然,正是这种倾向性导致了两个侦探的互相靠近。一个明显的推论就是,如果侦探的跟踪能力无穷大,也就是R无穷大,那么这种跟踪和一个人的随机行走没有任何区别。
至于为什么要用二维随机游走来描述侦探的行为,也很好理解。既然是跟踪,就不应该是两个人站在原地不动死盯着对方看,总得在保持一定距离的前提下装出一副随便逛逛的姿态免得被怀疑。而每一步随机行走的步长(step)也有很好的现实对应:如果目标移动范围很小,侦探就不用太在意,无须采取行动。而一旦目标移动了比较大的距离,就会触发侦探作出反应。这个触发反应的最小移动范围就是step。
有一点需要说明,现实中侦探与目标的位置是连续变化,瞬时调整的。在模拟的过程中,需要将这个过程分立化。跟踪的过程被拆解为“你走一步,然后我看到你的新位置,确定新的跟踪区域,然后在新的区域内再走一步”的方式交替进行。
最后,选定初始条件,只要让两者的初始位置处于彼此跟踪范围内即可,坐标系以两者连线为x轴,连线中点为圆点。
好了,以上就是全部设定。然后就可以让程序跑起来了。
模拟结果
设两个侦探Alice和Bob,初始位置分别为x=-10和x=10。先来看看如果两位侦探的跟踪水平完全相同会怎么样。让我们设他们的最大跟踪距离都是R=40,随机行走步长step=1。
首先来看看在跟踪进行一定步数之后,他们走过的轨迹都是什么样子。比如,一次跟踪进行了10000步,两人走出来的轨迹大概就是下图这样(图中A和B分别是Alice和Bob的初始位置;Alice轨迹为蓝色,Bob为黄色):
显然,计算单次的跟踪路径除了证明这两个侦探真的很辛苦以外,并不能提供什么有用的信息。所以,让我们将跟踪重复进行N次,来看看当N取值很大的时候,他们的“平均路径”是什么样的。
下图是所有设定不变,将上面的跟踪重复20000次,将所有路径进行平均以后的结果:
看,大家喜闻乐见的结局果然出现了。两位侦探最终相会在他们初始位置连线的中点,相爱相杀。
其实他们要相会也远不需要走10000步那么多。让我们来看看他们前进n步之后所处位置之间距离的期望值随步数n的变化情况。(如果没有跟踪行为,这个期望值将是一个常数)。还是对20000次跟踪取平均:
可见,他们的距离随步数增加迅速减小。大概到4000多步的时候,距离就几乎为零,这之后就基本上在原点附近小范围浮动,不再有大的变化。
也就是说,由于跟踪范围R是一个有限值,必然导致随机行走的过程中剔除了那些会导致跟踪失败的方向,于是平均下来,两者必然越走越近。
再将第n步时两者的位置分布画出来,更直观地看一下随着步数n的增长两者位置分布的变化情况。
-
n=1,也就是他们走出第一步以后的位置分布。我选取的参数保证了这一步无论走么走都不会走出跟踪范围,因此位置分布自然是一个以初始位置为圆心,步长为半径的圆圈。
-
n=10。随着步数增长,正态分布开始显现。不过肉眼还看不出来它们的中心有相互靠近的迹象。
-
n=100。 到100步的时候,可以看出分布中心沿着x轴移动,两者之间的靠近与重叠已经很明显了。
-
n=5000。 到了5000步,他们的位置分布基本上已经完全重叠,不可分辨了。
于是,我们可以得出结论,从相隔一定距离的两点出发,两位侦探的行动必然导致他们互相靠近,直到他们的位置分布收敛到一个以同一点为中心的平凡的二维随机游走为止。这一点,对于两个水平相同的侦探来说,就是初始位置连线的中点。
接下来可以看看当两位侦探水平不同的时候情况会有什么变化。这里我只关心他们的平均路径。
还是先摆结论:当两个侦探水平不同时,他们最终依然会相遇,只不过相遇的位置会偏向那个跟踪范围更大、水平更高的侦探。
比如,当Alice的跟踪范围依然为Ra=40,而Bob只比他差一点点,比如Rb=39.5的时候,差别就很明显了。
你看,水平只比人家差一点点,却要比人家多跑不少路。
如果水平再差得多一点,就更有意思了。下图是Ra=40,Rb=30的结果。
Alice水平高,于是可以运筹帷幄之中,几乎只要在自己家门口转转就行了。Bob水平差一截,为了不丢失Alice这个目标,就得一路跟踪到人家家门口去才行。
这些结果也都很合情理。
只要愿意,我们还可以加上其他限制条件。比如要求跟踪距离不能太近,否则会被发现等等。这里就不继续做了。
其实从数学角度来说,这是个很简单的问题。从概率论入手进行理论推导大概也就是一道作业题的难度,而我所做的模拟在简书上众多的程序员眼里也只能算是小儿科。不过,这种用数学建模、暴力计算、强行插入一个侦探推理问题的感觉还是很爽的。应该也算有点脑洞了吧?哈哈。