这个有趣的问题出现在Riddler博客。在这里:
有N名特工,其中K人是间谍。你的工作是识别所有间谍。你可以派遣一定数量的特工去偏远岛屿上的“撤退”。如果所有K间谍都在场,他们将会面制定战略。即使有一个间谍失踪,这次间谍会议也不会举行。你从撤退中得到的唯一信息是间谍会议是否发生。你可以派尽可能多的特工去撤退,撤退可以根据需要进行多次。你知道N和K的值。
确保你能识别所有K间谍所需的最小撤退次数是多少?如果每次撤退每人花费1000美元,那么识别所有K间谍的总成本是多少?
首先,假设您知道N=1024和K=17。
下面是我的$K=1$解决方案:
[显示解决方案]
案例$k=1$
让我们用简单的例子$k=1$来热身一下。我们将$r_1(n)$称为识别一组$n$特工中单个间谍所需的最小撤退次数。如果我们选择派$n$特工中的$m$去撤退,那么要么举行了一次会议,这意味着间谍就在$m$特工之中,要么没有举行任何会议,所以间谍一定是在没有撤退的$n-m$特务之中。根据结果,我们可能需要再撤退$1(m)$或$r_1(n-m)$。因此,我们可以写下这一点(动态规划)递归:
\开始{align}
r_1(1)&=0\\
r1(n)&=下置{m\in\{1,\dots,n-1\}}{\text{minimize}}\,\,1+\text{max}\{r1(m),r1(n-m)\}
\qquad\text{表示}n=2,3,\点
\完{align}之所以出现“最大值”,是因为我们希望确保撤退次数总是找到间谍。因此,我们假设间谍就在他们需要的地方,所以需要尽可能长的时间才能找到他们。从这里开始,很明显,我们应该总是一分为二。因此,
\开始{align}
r1(1)=0\quad\text{和}\quad r1(n)=1+r1\bigl(\lceil\tfrac{n}{2}\rceil\bigr)
\四边形\text{表示}n=2,3,\点
\完{align}位置$\lceil x\rceil$表示我们将$x$四舍五入到最接近的整数。通过检查,我们可以解决这个递归问题,我们发现:
$\显示样式
\text{撤退次数}=r1(n)=\lceil\log2(n)\rceil
$
费用怎么样?我们可以简单地计算参加务虚会的人数,我们称之为$a_1(n)$。当我们将$n$分成两半时,我们可以选择将$\lceil\tfrac{n}{2}\rceil$或$\lfloor\tfrac}{n}}\rfloor$(向上取整或向下取整)发送到撤退处。两者都给我们提供了相同的信息,因此我们将选择派遣更少的代理。因此,与会人数满足:
\开始{align}
a_1(1)=0\quad\text{和}\quad a_1
\四边形\text{表示}n=2,3,\点
\完{align}再次经检查,我们发现与会者人数为:
$\显示样式
\text{与会者人数}=a1(n)=n-1
$
请注意,我们可以通过一个接一个地派遣特工进行单独的撤退来获得相同的总成本。当我们只派出一名特工时,我们必须知道间谍是谁。然而,我们被要求尽量减少撤退次数,所以撤退这么多次是浪费时间的。
下面是$K\gt 1$的部分解决方案:
[显示解决方案]
案例$k\gt 1$
案件$k=1$都是关于找到一名间谍的。有$n$种可能性(每个$n$特工都可能是间谍),每次我们撤退时,我们都会收到一点信息(是/否)。我们能做的最好的事就是利用这一点将我们的可能性降低两倍,而这可以通过每次派遣一半的特工参加撤退来实现。
如果$k\gt 1$,我们的任务是寻找$k$间谍,现在有$\binom{n}{k}$的可能性(从$n$特工中选择$k$间谍)。同样,逻辑是一样的:我们对一点信息的最好期望是将可能性减少两倍。如果我们称$r_k(n)$为确定间谍身份所需的最小撤退次数,则此论点得出了界限:
$\显示样式
\text{撤退次数}=rk(n)\ge\left\lceil\log2\binom{n}{k}\right\rceil
$
如果$n=1024$和$k=17$,则生成绑定的$r_{17}(1024)\ge122$。问题是:我们实际上离达到这个界限有多近?一种可能的方法是贪婪的:我们跟踪所有可能的剩余子集,然后考虑所有可能的撤退安排,并使用尽可能减少剩余子集数量的安排(不能超过两倍)。我们继续这样做,直到我们将可能的子集的数量减少到一个,这一定是我们的间谍集合。
虽然这种贪婪的方法可能是最优的,但它在计算上很难处理。有$\binom{1024}{17}大约3.68乘以10^{34}$可能的间谍子集,还有$2^{1024}大约1.8乘以10^}308}$我们可以在每一步安排可能的撤退。因此,没有希望计算出最优贪婪策略,并观察它与我们的下限相比表现如何。
我们可以把这想象成一场游戏,在游戏中我试图猜测间谍,而对手则试图安排间谍,让我尽可能难以猜测。因此,这就变成了一个哲学问题:如果我选择了一个分裂,让我的对手说“是的,有一个会议”有一点优势,那么只要他们一直说“是”,解决方案就是递归的,而且很容易计算。但是,如果我的对手知道,每当他们说“不,没有会议”时,问题就变得非常棘手,他们可能会做一些“次优”的事情,目的是耗尽我的内存。
次优启发式
贪婪的启发式似乎遥不可及,所以这里有另一个启发式,这是一个真正的团队努力-与我的同事讨论阿尔贝托·德尔皮亚,Jim Crimmins、Adam和Jason Weisman对这篇帖子的评论,以及我的一点努力。其想法是将$n$代理拆分为大小大致相等的$m$组,其中$k+1\le-m\le-n$。让我们给组编号$1,\点,m$。计划如下:
- 采取
- 第一组呆在家里,其他组都去度假。
- 如果有一次会议,那么第一组就没有间谍了。
- 如果没有会议,那么第一组至少有一名间谍。
- 回到第一步,但这一次,第二组呆在家里,所有其他组都撤退。
- 继续以这种方式进行,直到我们确定了所有至少有一名间谍的团体。最多可以有$k$个这样的组。合并这些组(这将成为我们的新$n$),丢弃所有其他组,并使用新的较小组重复整个过程:选择$m$,划分组,等等。
请注意,我们做到了不需要在每一轮中尝试所有$m$可能的撤退!一旦有$k$撤退且“无会议”,我们就可以停止并立即进入下一轮撤退,因为我们现在知道了哪些$k$组包含间谍。在最坏的情况下,这不会发生。我们总是被迫尽可能多地撤退。当我们进行了$m-1$的撤退时,可能会发生两件事:
- 我们已经确定了$k$间谍,在这种情况下,我们可以立即将我们的$k$包含间谍的团体转入下一轮。
- 我们已经确定了$k-1$名间谍,在这种情况下,我们可以将最后一组人员转移到下一轮,而不进行测试。
在这两种情况下,我们只需要$m-1$次撤退,并且我们总是将$k$组派往下一轮。因此,从来没有必要在特定的一轮中进行所有百万美元的撤退。要查看每一轮发生的情况,请注意,如果我们将$n$划分为$m$组,然后计算组大小,让$q$和$r$分别是$n$除以$m$时的商和余数。因此$n=qm+r$,其中$0\le r\le m-1$。然后$n$将分为$m$组,如下所示:
\[
n=\下大括号{q+\cdots+q}{m-r}+\下大杠{(q+1)+\cdot+(q+1”)}{r}
\]但哪些小组将继续进行下一轮比赛?由于我们可以选择撤退的顺序,而且并非所有组别的规模都相同,因此我们可以确保最后一组(对应于从未发生过的最后一次撤退)尽可能少。但我们的$(m-1)^\text{th}$组也有可能被派往下一轮。所以我们最好的选择是把最小的两组留到最后。最终,在最坏的情况下,将有$k-1$最大的组和$2^\text{nd}$最小的组被发送到下一轮。让我们用这个号码呼叫$g(n,m)$。计算$g(m,n)$有些烦人,因为它取决于$k$和$r$的相对大小,但它大约等于$kn/m$。递归如下:
\[
r_k(k)=0\qquad\text{和}\qquad
rk(n)=\下置{m\in\{k+1,\点,n\}}{text{minimize}}\,\,\左(m-1+rk(g(n,m))\右)
\]递归可以使用递归以简单的方式解决。下面是一些Julia代码以及完成此工作的$g(n,m)$的完整计算:
nmax=1024k=17memo=-1+零(Int,nmax)#如果n个代理被分为m组,则选择k-1最大和第二最小函数g(n,m,k)#n=q*(m-r)+(q+1)*rq、 r=地板(Int,n/m),rem(n,m)如果m==k+1,在这种情况下我们必须选择k最大的(r>=k?k*(q+1):r*(q/1)+(k-r)*q)else#在本例中选择k-1最大和第二小(r>=k-1?(k-1)*(q+1):r*(q+1)+(k-1-r)*q)+(m-r>=2?q:q+1)结束结束函数rk(n)如果备忘录[n]!=-1备忘录[n]其他的备忘录[n]=(n==k?0:最小值([m-1+rk(g(n,m)),对于m=k+1:n])结束结束rk(1024)
在第一轮中,我们有$n=1024$个嫌疑人。最佳做法是选择$m=43$组,剩下407$个嫌疑人。然后,我们选择51美元的组,以降低到136美元的嫌疑人。然后再次选择$46$组,以降低到$50$嫌疑人。最后,我们选择了价值50美元的团队,我们的嫌疑犯数量降到了17美元,这一定是我们的间谍。因此,总计为(43-1)美元+(51-1)+(46-1)+。有趣的是,如果我们使用近似$g(n,m)\approx\lceil\tfrac{kn}{m}\ rceil$,我们也得到了$186$的结果。结合之前推导的下限,我们得出:
$\显示样式
\文本{撤退次数}:\quad 122\leq r{17}(1024)\leq 186
$
下限意味着任何策略都不可能做得比这更好,但可能没有任何策略能做到这一点。上限表示,使用特定策略确实可以做到这一点,但其他策略可能会做得更好。在这种情况下,我们的上下限之间的比率约为1.52。这种比率用于近似理论当问题难以准确解决时,量化建议解决方案的质量。
费用如何?我们将估算。在最坏的情况下,每一轮我们都有万美元的撤退,其中万美元有会议,万美元没有。无论什么时候有会议,呆在家里的团队都可以被永远排除在外(因为我们知道它不包含间谍),所以我们不需要在随后的撤退中派遣该团队。可能发生的最昂贵的事情是,我们以会议形式举行的$k$务虚会排在最后。因此,与会者总数约为:
\开始{align}
a(n,m)&近似(m-1-k)\左(n-\tfrac{n}{m}\右)+sum{j=1}^k\左(nj\tfrac}{m{右)\\
&\近似frac{n\left(k-k^2+2(m-1)^2\right)}{2m}
\完{align}所以如果我们最终选择了$m$groups,而有$n$个与会者,那么我们应该将$a(n,m)$添加到当前的与会者计数中。通过使用上述解决方案将其合并,我们得到的结果是,该战略将需要派遣大约65484美元的与会者参加务虚会。每名与会者花费1000美元,这意味着找到所有间谍最多花费6548万美元。
对于好奇的人来说,这里有一个图,显示了嗅出17名间谍所需的最大撤退次数,这是间谍总数的函数:
正如我们所见,上限和下限开始时很接近,但随着$n$的增加,最终分散开来。
将成本降至最低?
问题陈述要求我们尽量减少撤退导致我们以6548万美元的代价撤退了186次。相反,如果我们尝试使用类似的策略将资金最小化,即分组并保留一个组在家,那么我们可以制定与上述类似的递归,但这次我们执行的是成本最小化,而不是撤退。此案的结果是220次撤退,费用为5446万美元。这很有道理。如果我们愿意,我们可以降低成本,但代价是增加更多的静修。
甚至更好!
事实证明,如果一次只挑选一个间谍,上限可以降到131美元!事实证明,这比我在解决方案中描述的将其余代理拆分为大小相等的组要好得多。正如人们可能预期的那样,以美元计算的最坏成本急剧上升。由于蒂姆·布莱克,可以在这里找到。是否存在一种简单的策略可以进一步缩小122下限和131上限之间的差距,仍有待观察。