嗅出间谍

这个有趣的问题出现在Riddler博客。在这里:

有N名特工,其中K人是间谍。你的工作是识别所有间谍。你可以派遣一定数量的特工去偏远岛屿上的“撤退”。如果所有K间谍都在场,他们将会面制定战略。即使有一个间谍失踪,这次间谍会议也不会举行。你从撤退中得到的唯一信息是间谍会议是否发生。你可以派遣任意数量的特工去撤退,撤退可以根据需要多次进行。你知道N和K的值。

确保你能识别所有K间谍所需的最小撤退次数是多少?如果每次撤退每人花费1000美元,那么识别所有K间谍的总成本是多少?

首先,假设您知道N=1024和K=17。

下面是我的$K=1$解决方案:
[显示解决方案]

下面是$K\gt 1$的部分解决方案:
[显示解决方案]

关于“嗅出间谍”的23点思考

  1. 让我们假设我们尝试2 ^ m大小的组来开始并测试所有N/2 ^ m非交叉组,替换下一个撤退时有间谍的组,并丢弃那些没有间谍的组。最糟糕的情况是,在这一轮之后,我们剩下了K组,大小为2^m。如果我们每轮将小组人数减半,直到人数=1,我们最多只能有m+1轮总人数,最大总撤退次数为R=2*k*m+N/m^2-1。我们可以对m进行优化,发现m=ln((Nln(2)+1)/2K)/ln(2)。对于N=1024,k=17,m=4(四舍五入)(初始组大小为16,64组),我们看到一个测试程序,如:

    剩余的组成员总数
    1024 64 16 272
    272 34 8 136
    136 34 4 68
    68 34 2 34
    34 34 1 17

    $1,533,000.00 199

    我们从上一轮的总测试次数中减去一次,其中组大小为一。

    1. 也许我误解了,但我认为这种策略行不通。你不知道撤退处是否有间谍——你得到的唯一信息是所有间谍是否在撤退处。因此,当撤退处没有举行会议时,你实际上不知道你的撤退小组中是否有间谍。它可能有0.1美元,\点,k-1$间谍,所有人都会给出相同的答案“不见面”。

      1. 所以你从所有N开始,然后系统地抽取小组,并抓住一个会面的机会。如果会议召开,您将丢弃提取的组以供下次撤退,并继续提取下一组;如果会议未召开,则替换提取的组并继续提取下次组。

  2. 你这样做的原因正是你所说的。您只能通过提取组并查看是否存在所有间谍来获取信息。如果测试组中有间谍,则需要替换他们以测试下一组。

    1. 啊,我明白了!我很困惑,因为你写了一篇关于“测试”一个2米大小的团队的文章。那么你的意思是,你把这个团队留在家里,然后把其他人都送到休养所?如果是这样的话,我想我会理解。如果我能解决这个问题,我会考虑更多,并更新我的解决方案(w学分)!

  3. 吉姆认为劳伦特的答案太高是正确的,而劳伦特认为吉姆的答案太低是正确的。原因是,在Jim的场景中,他正在进行5组务虚会,但每次务虚会只统计每个参与者一次,而实际上每次务虚都需要至少K人,因此需要在每个集合中保持寻人。

    我的答案是5608万美元。我想知道我能否把它弄得更低。我是这样做的:和吉姆一样,我正在进行多组撤退,每组撤退的目标都是清除一些嫌疑人。每组都有一个撤退次数R=上限(N/X),其中X是被排除的人数,N是嫌疑人的总数。在最坏的情况下,每一次K-1撤退都有一名被排除在外的间谍,下一次R-K撤退都会有一次间谍会面(允许我清除被排除在后的所有撤退),最后一次撤退在被排除的小组中只有一名间谍。这意味着我在第一次K-1务虚会中都有N-X参与者,在随后的每次务虚会(最后一次除外)中都有N-iK参与者,其中I从1增加到R-(K-1)。对于集合的最后一个后退,我可能会排除小于X的项(因为N/R可能不是整数)。相反,我排除了x',所以我有(N-(R-(K-1))x)-x'参与者。在一组结束时,我清理了N-((K-1)X+X')人,每名务虚会参与者总计花费1000美元。我可以将这些X值递减的项相加,直到我找到每个清关人员产生最小成本的X。

    对于N=1024,我发现X=26,R=40,每个清仓(598)的成本(33134)为55.4。我现在只有426名嫌疑人。我用X=10重复,得到166个嫌疑人,用X=4重复,得到66个嫌疑人,再用X=2重复,得到34个嫌疑人。对于34名嫌疑人,我一次清剿了34名嫌疑人。总成本为33134+14528+5564+1870+984=56080名务虚会参与者或56080000美元。

    每次撤退我都最小化X。我的下一步是看看X值效率稍低是否会降低总体成本,但由于提交截止日期已经过去,我想我就到此为止。很想听听你对这种方法的看法。

    1. 重新阅读我的帖子时,我注意到几个印刷错误。短语“每次撤退只统计每个参与者一次”应该改为“每次撤军只统计每个参加者一次”。声明“N-iK参与者在随后的每次撤退中”应该改成“N-iX参与者在以后的每次撤军中”

      我也应该清楚,这个策略是以最低的净空成本最大限度地清除间谍身份。我不知道如何从数学上实现这个最小化,但数字很小,所以我编写了一段代码来运行所有可能的整数值,并返回产生最低净空成本的值。

      每个阶段的撤退次数为40、43、42、33和34次。该阶段分别有598人、260人、100人、32人和17人被疏散。因为一个阶段内的每次撤退都会忽略该阶段早期撤退中清理出来的人员,所以每次撤退的参与者数量在我前面描述的阶段内都会减少。每个阶段的务虚会参与者总数为33134人、14528人、5564人、1870人和984人。因此,成本为56080000美元。

      我使用了一种贪婪算法,该算法假设最小化每个阶段的成本将最小化总成本。我还没有证明这个假设是正确的,我也不完全肯定它是正确的。我没有解决的问题是,早点为不同数量的人支付更多的费用,是否会在晚些时候以较低的成本来清理人员。例如,我本可以在第一阶段使用45个务虚会疏散644人,但需要支付36052名务虚会参与者的费用。如果我这样做,然后对剩下的380个项目使用我的原始计划,我的成本将达到56309。但也许还有一些更好的优化?

      1. 酷,哟。按照提议,这个想法是最小值(最大值(后退))。那是什么?

  4. 嗨,同样的想法。你的团队规模/团队编号只是有点不完整。所以你有26/10/4/2/1个成员(我有16/8/4/2/1,真正挑选出来的只是因为数字是整数),我认为你的总撤退次数是193次对199次(可能)。不确定你是否解决了非完整性问题,但实际上是相同的想法!我认为你的50毫米是不对的?我认为你的是1.737毫米。

    干杯。
    吉姆

  5. 如果你看看我的最佳表达方式:

    m=ln((Nln(2)+1)/2K)/ln(2)。

    得出m=~4.4,这将是21.5的初始组大小。我只是把它四舍五入到4,选了16,因为数字很容易!

    干杯,
    吉姆

  6. 向亚当道歉,他关于总测试成本的说法是正确的!但我认为我们已经接近撤退的次数了。

    1. 我认为16/8/4/2/1的撤退次数为199次,21/10/4/2/1非整数或不同(组)数为194次。

  7. 优化组的初始大小(见上文):

    m=ln((Nln(2)+1)/2K)/ln(2)

    对于N=1024,K=17得出m=4.42,初始组大小=21.5。我只是选择了整数…。

  8. 谢谢大家的深刻评论!我更新了我的解决方案,以反映在每一步自适应选择$m$的改进策略。我发现至少有191次撤退,花费了6560万美元。
    我在计算撤退次数时使用了精确的整数,所以这个数字应该是精确的,尽管我使用了近似值来计算成本。一些评论指出,我们可以降低成本……这是事实,但前提是要付出更多的代价。这个问题要求减少撤退,而不是减少资金。相反,我尝试最小化美元,发现有229次撤退,花费5717万美元(同样使用最小化中的近似成本)。

    我更新了我的解决方案-欢迎评论!

    1. 我发现Julia有更直观的语法(类似于Matlab),但它和Python一样快——通常快得多。它还与Jupyter笔记本电脑兼容,我非常喜欢。

      在我看来,使用Julia的主要缺点是它仍然是一种非常新的语言。因此,它没有Matlab所做的任何好东西,比如调试器、分析器或像样的IDE……语言也在不断变化,在线资源中没有太多可以获得帮助的东西。

  9. Laurent,我认为你可以做得稍微好一点,注意到每一轮m组的比赛,你最多只需要组织m-1次务虚会。最后一次撤退是不必要的,因为到那时,如果你还没有了解到那一轮的第K次间谍会议,你会自动知道,在没有真正举行最后撤退的情况下,它会发生。因此,在给定的示例中,N=1024和K=17,确保能够识别所有间谍所需的最小撤退次数为37+50+50=187。

    1. 我对此不太确定。当你把一个小组留在家里,让其他人都去务虚会时,如果有会议,你可以把留在家里的小组除掉,因为它不能包含间谍。如果没有会议,那么你知道呆在家里的团队中至少有一个间谍,所以你要留住它。

      确实,如果“不见面”发生了k次,那么你可以停下来立即进入下一轮(并选择一个新的m),因为你已经确定了k个组,每个组中至少有一个间谍。由于只有k个间谍,这意味着每个小组正好包含一个间谍。但是如果你的一个小组里有两个间谍怎么办?那么“不开会”的撤退次数将少于k次!事实上,如果在m-1撤退后,你发现“没有会面”的次数少于k次,你仍然无法对最后的撤退做出任何结论,因为你不知道每个小组中有多少间谍。

      1. 我仍然认为你不应该在任何一轮中举行最后一次撤退。

        这很容易在最后一轮中看到,因为每个“组”只有一个特工,如果你在该轮(m-1)次撤退后还没有确定克特特工,那么你会自动知道最后一个特务/克特组是间谍。

        同样,正如你所建议的那样,假设其中一个小组中有两名间谍。在那一轮(m-1)次撤退后,你仍然无法断定最后一组中是否有间谍,这是正确的。然而,不管怎样,最佳策略是保持最后一组,避免在那一轮中举行m't撤退。

        例如,在更好的配置中,如果您已经确定(K-2)组包含代理,但仍有两个组处于轮换状态,请遵循相同的策略-保留最后两个组,并减少两个组的撤退次数。

        考虑到尽可能减少撤退次数的目标,即使在最坏的情况下也能确保所有间谍的身份——我认为你能做的最好的事情就是将每轮撤退次数与你的解决方案相比减少一次。因此,对于N=1024,K=17,不需要进行超过187次的撤退。

        1. 你完全正确。从来没有必要进行第七次静修;我们可以直接跳到下一轮。有趣的是,我用这个策略撤退了186次(不是187次)。区别可能是因为我假设我们会对分组进行排序,以便将两个最小的分组保存到最后。这样,在最坏的情况下,最大的$k-1$组和最小的$2^\text{nd}$组将进入下一轮。这对结果产生了微小的影响,因为它避免了将最大的团队送到下一轮。

          我(再次)更新了我的解决方案,并包含了一个比较上下限的图。再次感谢您的帮助和洞察力!

  10. 我的直觉告诉我,最佳出行次数至少应该在122次以上。

    考虑N=6名特工,K=2名间谍的情况。六选二为15,且15<16,因此理论下限为4回。但是,第一次撤退时你会派多少特工?没有任何选项可以保证搜索空间减少到8个或更少的间谍对。您可以保证获得的信息最多为0.737位。

    即使N=1024,K=17的“块状”数字少得多,您从第一次撤退中可以保证的最多信息是~0.9898位。这是0.0102位的损失,即使你能将每个决策的“浪费”保持在如此低的水平,从信封的背面来看,这仍然会给我们带来超过123个猜测。

留下回复

您的电子邮件地址将不会被发布。 已标记必填字段*