首页 » 算法神探:一部谷歌首席工程师写的CS小说 » 算法神探:一部谷歌首席工程师写的CS小说全文在线阅读

《算法神探:一部谷歌首席工程师写的CS小说》23 最佳优先搜索:侦探最值得信赖的工具

关灯直达底部

过去的五年中,Donovan警长的办公室几乎没有什么改变。房间的角落仍放着同样的书桌,上面整齐地摆放着四个贴有“输入”“输出”“需归档”“需销毁”标签的篮子。墙上除了Frank早已见过的数量众多的奖状外,又多出了几张新的。只有一张图片——警长与两个孩子的全家福速写——见证了时间的流逝。

“Frank,坐吧。”警长头也不抬地说。

Frank看着警长面前的椅子,回想起上一次他坐在这把椅子上的情景——那是他警队生涯的最后一天。那时他终于搜集到了足够的证据,正准备对Rebecca Vinettee实施抓捕,但是他用的方法却十分走险。尽管当时Frank发现了新证据,但警长并不赞同他的这一做法,因为他更在意的是Frank公然违反了相关规定。Frank从回忆中回过神来,倚靠在椅子的扶手上,继续等待。

终于,警长处理完手中的公文,并将其放到“输出”的篮子里,目光投向Frank说道:“你有什么新发现吗?”

“这个案子并不仅是文件盗窃这么简单,要比想象中严重得多。”Frank回答道。

警长看起来并不惊讶:“有多严重?”

在过去的一个小时里Frank在脑海中想象了这场谈话的各种版本,以及可能的回答方案。最终他决定靠自己的能力——这些绝不是投机取巧就能做到的。

“为什么不一开始就将你知道的全都告诉我?”Frank说,“也就是事实你上到底知道什么。请不要说谎。”

警长镇定地望着他说:“我从未骗过你,Frank,当初我过来找你时已经把我所知道的都告诉你了。”Frank想要说些什么,但警长抬起手示意不要打断他,接着说道:“但是,事态时刻都在发生变化,我们谈话的时候情况或许也正在改变,今天早上我得到了最新的消息。”

“又有盗窃案了吗?”Frank问道。

“是其他事情。”警长回答。

警长快速地翻了翻面前贴有“输出”标签的篮子,找到一封写着“请转交给Frank Runtime”字样的信封,并递给了Frank。“给你,这也省得别人再给你送了。”他说。

Frank拆开信封,快速地浏览了里面的内容。他发现其中包含了四份案情报告——其中有三份是关于其他警局盗窃案的细节描述,第四份是有关军方车队被袭击的详细描述。Frank之前就听说过这个案件,但是这些细节还是令他大吃一惊。

“加速腐蚀的咒语?”他问道。

“我们已经让巫师来确认过,”警长说,“这些盗贼把档案室的门给腐蚀了,轻轻一推就开了。”

“那车队是怎么回事?”

“带有腐蚀魔法的弩。”警长说,“还有一个车子的轮胎,我想应该是左后轮,报告里应该写到了。”

“那些宝剑和斧头呢?”

“你能不能仔仔细细地看一下那些报告?那些盗贼们用了加速锈蚀的咒语,这虽然不算什么高级的魔法,但非常有效。”

“那个里面根本就没有提到他们偷了些什么。”Frank说道,“有关魔法面具的事更是只字未提。”

警长惊讶地竖起了眉毛:“你怎么知道面具的事?这可是高级机密!”

Frank耸耸肩:“是你让我去寻找线索的呀。”他并没有告诉警长这条信息其实是Socks说漏嘴告诉他的,永远不能让你的客户知道你的成功有多少是建立在别人的愚蠢行为之上的。

“这很令人担忧,”警长说,“那是个很强大的东西。我们收到了一个匿名信息,说城堡可能遭到袭击,现在所有警力都处于戒备状态,我们已经把所有的人都调来保卫城堡。”

“对于攻击城堡这件事,我也听说过。”Frank说道,他又看了一遍文件,“没有关于袭击者的信息吗?”

“我们也只是听到一些谣传,并不肯定。至少没有什么可以被放到报告里的可靠信息。”

“那你的警员们怎么样呢?有没有任何可疑的人员在那儿?”

警长打量了一下Frank。Frank知道,如果警长确信没有任何内鬼的话,是绝不会来找他的。但这也仅仅是他的猜测。

“还没有,”警长说,“我还没有找到任何可疑的人员。盗窃案之间没有形成规律,不同的警局,不同的值班警员,连失窃的部门都不同。”

Frank思考着这些盗窃案,默默地点了点头。在进行到调查警察内部调职记录时,案件似乎进入了一个死胡同。每个事件都至少有一位新转来的警员值班,但是从来没有一个警员出现两次。他曾经考虑过这可能是整个新手班的阴谋,但是很快就否决掉了。这个人能组织这么大型的背叛事件,他的能力应该足以编排更微妙的盗窃案,至少不至于惊动方圆100英里的所有警力。

“那Notation警官呢?”Frank问。

警长看起来有些吃惊:“她怎么了?”

“她在你的名单上吗?”Frank又问。

“她那天值班,所以她当然在名单上。”警长说,“但是她在名单的最后。她是个好孩子,虽然是个新手,但她在警局尽忠职守。”

“你知道她在擅自调查这个案子吗?”

警长皱了皱眉头:“我觉得这没有什么好惊讶的,就像我所说,她很敬业。你什么时候碰见她的?”

“在Crannock的农场,”Frank说,“在这之后我们一起调查了一段时间。”

“那她现在在哪里?”

“我不信任她。”Frank说。

“你谁也不信,Frank。”警长补充道。

Frank叹了一口气。“这不重要,”他说,“如果你发现什么奇怪的事情,请尽快告诉我。”

“那你呢,”警长问,“你发现了什么?”Frank简洁地概括了一下案件的进展,他告诉警长他是如何根据一个提示找到了Crannock农场,又在那里发现了新的线索,线索指向了Usb港,也就是Vinettee集团的船,还有Rebecca Vinettee。

听到这个消息后,警长咯咯的笑声打断了他。“Frank,又和Vinettee家族相关?又是Rebecca Vinettee?我很惊讶你还在为此事奔波,你把他们家多少个人送到监狱里去了?”

“还远远不够。”Frank说。

“好了”,警长回应道,“你是怎么从那里逃脱的?”

“后来突然出现了一个年轻的巫师,开始到处扔装满腌鳗鱼的桶。”Frank把这一切说得仿佛只是一个正常的巧合。

警长看了他一眼:“什么?”

“有一个叫Socks的初级巫师,”Frank解释道,“他是一个名叫Gretchen的巫师的学徒,看来是国王带了几个高级巫师来协助我们破这个案子。”

“我没听说过Gretchen,但我一点也不惊讶国王会请巫师来。”警长说,“在军队遭到袭击之后,国王动员了所有人,甚至Ann公主都正在回来的路上,明天就能到城堡。”

这句话意味着现在的情形非常严重。Ann公主几乎永远都在出使任务、调查或者是谈判。既然她回来了,那现在的情况一定糟糕透了。

“Ann公主正在回来的路上?”Frank问。

“她认为最近的袭击一定和Unnecessary Complexity联盟有关。”

“Unnecessary Complexity联盟?”

“一切都和那个叫Exponentious的邪恶巫师有关,”警长说,“就是那个总是想摧毁王国的巫师。”

Frank点了点头。很显然,他还清楚地记得当年Exponentious发动的袭击所带来的恐慌。在那些天里,关于他发起的这次运动一直在年轻巫师与骑士中间流传。

警长继续说道:“他现在被牢牢地关在皇家监狱里,但Ann公主担心他可能有别的团伙在行动。比如说他的追随者、帮凶或者崇拜他的人。Ann公主一直在找有关这个神秘巫师联盟的线索,目前他们一直躲在阴暗处,进行一些小范围的袭击,但是皇室成员非常担心。”

Frank一脸茫然地盯着警长。这会不会就是Vinettee提到的那个联盟?如果真是的话,那么他怎么会把自己牵扯到这种事情中来。于是Frank脑中又萌生出了另一种假设。

“攻击城堡!会不会和Ann公主返回有关?”Frank说,“如果她在调查Unnecessary Complexity联盟,他们有可能会报复她。”

“我们已经想到了这一点,”警长说,“当Ann公主回来时,我会调派一百多个警察去保护她。虽然这会使军械库、监狱和警局的警力减少,但我们绝不能让Ann公主有任何闪失。”

“那魔法面具呢?有人会利用面具潜入安保人员的队伍。”

“是的,这是一个溜进城堡的绝好机会,”警长承认道,“即使没戴面具,在增加了一百多个新的警察后,我们也很难在人群中找出他们。但是我们采取了措施,皇家巫师Marcus创造了一种有魔法的身份徽章分配给那些城堡的安保人员。身份徽章是无法伪造的,一旦佩戴的人与徽章上的照片或者名字不一样,徽章就会发出红色的光。”

Frank努力思考是否还有其他的安全隐患。

“你再想想,”警长说,“你还有没有发现别的问题?”

Frank飞速地思考着,回忆他们在TCP Flyer号船上发生的事,以及他们在Mudwall和Frayed Cable岛上的搜索。他描述了监狱中遇到的袭击和公文被烧毁的经过,最终,他从调职记录中找到了更多线索。

“这也是为什么你想了解Notation的原因吧,”警长说,“她是刚从警察学院调过来的。”

“确实,”Frank承认,“她的名字在我的搜索范围之内。”

警长想了想后说道:“我不认为她是这种人,我的直觉告诉我,她是一个好警官,但是我不确定我现在应该相信谁。不管怎样她是不应该去调查这个案子的,这并不是她的任务。”

“谢谢你。”Frank说道。

“还有没有其他新调来的人需要去特别关注的?”

Frank摇摇头:“新调来的警察们分布在不同的犯罪现场,但是没有规律,没有任何一人与两个以上的盗窃案相关,除非一整个班都是叛徒才有可能,所以我认为这行不通。”

“你调查得很好,Frank。”警长说道,“这是我这么多年来见过的能把最佳优先搜索用到极致的案例之一。”

Frank笑了,即使在警队,也很少有人会知道这种类型的调查需要使用最佳优先搜索。多数人只会说“我正在调查”或是“这些线索我正在跟进”。

尽管对其认知不足,最佳优先搜索仍是警官们办案必备法宝之一,它就像记事本或者是一双舒服的鞋子一样重要。在最佳优先搜索中,你需要时刻维护一个线索列表,每次从中选择最可靠的一个线索去调查,调查完毕后,再从列表中选出下一个最可靠的线索继续调查。当然如果在调查的过程中发现了新的线索,就将其及时加入到列表中。这种方法对于查案很有帮助。

Frank摇摇头。

“那好,”警长说,“继续调查。如果Unnecessary Complexity联盟真的存在,而且一直在背后操纵这个案子,那么我们已经深陷危机之中了。注意安全,Frank。”

“我一向很谨慎。”Frank回答,他站了起来,又停住了,“最后一个问题,你知道Notation是如何知道Array Cart的吗?”

“我不知道,”警长回答道,“为什么不直接问问她呢,她现在似乎正站在我的办公室门口。”

警用算法导论:最佳优先搜索

节选自Drecker教授讲义

假如你在这门课程中只记住了一个算法,那么你一定要记住最佳优先搜索这个算法,它将是你警队生涯中最有用的工具。也许所有的案件到最后你都需要使用这个算法。

最佳优先搜索是基于某种估值分数或者评价函数来选择接下来探索哪个状态的算法。每一个新发现的状态也都将被赋予一个分数,这个分数就是算法对这个新发现状态的估值。例如,我们可以为每一个状态标记上一个值,可能是目标状态的概率(如果这个概率可以被估计的话)或者是在调查中线索的重要程度。其实最佳优先搜索就是在每时每刻维护着一个带有估值分数的状态列表,每次从这个有序列表取出下一个估值分数最高的状态去探索。

当然,最佳优先搜索也可以按照代价最小的规则来选取下一个要探索的状态,这个代价可以是当前状态到目标状态的估算距离。在这种情况下,每一步都要选择列表中估值最小的一个状态进行探索。

我们来看一个迷宫问题。现在我们已知起点和终点的坐标,可以在搜索空间中为每个点(状态)都设置一个值,这个值就可以是从该点到终点的距离,例如,可以使用曼哈顿距离——两点之间的垂直距离加上水平距离之和。虽然这个值不一定意味着当前点到目标点的实际步数,但它可以为最佳优先搜索算法提供更有效的选择依据。

随着搜索的进行,算法开始尝试探索不同的点(即下图中带阴影的圆圈),每当遇到一个新点,都要将其添加到一个列表中等待之后进一步探索(即下图中带有虚线的圆圈)。在每次迭代中,算法将根据每个点的估值分数来选择最佳的那个点去探索。在这个例子中,每次将选择估值最小的那个点去探索。

一旦找到目标点,我们就可以终止搜索。在这个例子中,我们只需要探索一半多一点的点。例如,我们不会选择探索第二个距离为4的点,因为我们总是有一个更好的选择可以优先尝试。

在搜索中,我们必须先确定线索的优先顺序。根据具体情况,你可以从最新的线索或可信度最高的线索开始。无论如何,最佳优先搜索都需要按照某个优先顺序进行。