新冠检测的最优分组算法

为了应对疫情,全球各国都需要检测潜在感染者。由于检测试剂相对短缺,如何用尽量少的试剂进行检测就成为一个有意思的问题。这里假设采样量足够,且不考虑检测时间要求。

目前,很多国家采用的都是分组检测机制,即将待检测群体进行分组,同组内样本混合进行检测。如果某组结果为阳性,则对该组再进一步进行检测。

一个很自然的问题:该怎么分组才能节约试剂?

先来看两种极端的情况。

少量感染者

通常,群体内的感染者是少数。

假设群体一共 64 人,其中只有 1 个感染者,采用 2、4、8、64 等分法。

  • 2 分法,要测 6 轮,共 2*6=12 次;
  • 4 分法,要测 3 轮,共 4*3=12 次;
  • 8 分法,要测 2 轮,共 8*2=16 次;
  • 64 分法,要测 1 轮,共 64 次。

实际上,当人数很多时候,如 N 个人,采用 x 分法,其总测试次数大概为 y=x*log(x, N),容易知道该函数在 x=e 时取极小值。

此时应当取 e 附近的 x 值,例如 2 或 3,可以节约试剂。同时,人数 N 最好选为能整除 x 的值。

大量感染者

第二种场景,64 个人全部都是感染者,同样采用 2、4、8、64 等分法。

  • 2 分法,要测 6 轮,共 2+4+8+16+32+64 = 126 次;
  • 4 分法,要测 3 轮,共 4+16+32+64=116 次;
  • 8 分法,要测 2 轮,共 8+64=72 次。
  • 64 分法,要测 1 轮,共 64 次。

容易发现,此时当采用 64 分法时候,总检测数最少。

N 个人,采用 x 分法,其总测试次数大概为 S=x*\frac{1-x^log(x,N)}{1-x},显然是递减函数。

此时应当取较大的分组数。

推广为一般情况

如果已知 N 个人,感染率为 p,此时 x 该选多少?

这个问题要比上面两种情况复杂一些,我们采用倒推的思路。

首先绘制检测路线,是个典型的树状结构,如下图所示。

其中有 p*N 个人是感染者(最坏情况下他们没有共同的父节点),那么最后一轮时,需要检测 p*N*x 次。倒推上一层,仍然需要检测 pNx 次。直到最后待检测的样本拥有共同的父节点,从这层开始,每层都需要检测 x 次。

即 p*N*x + p*N*x + …… x + x + ……

最坏情况下,感染样本彼此尽量分开,直到第二层,所有待检测的样本拥有共同的父节点。此时,检测总数为 S=p*N*x*(log(x, N)-1)+x。此时求得最优的 x 值在 3 左右。

通常情况下,感染率 p 不高的时候,这个公式是准确的;当 p 较高时候,由于底层多个感染者有共同的父节点,公式推测出的检测总数比实际值要高。因此,共识得到的是所需试剂个数的上限。

应用到现实生活

假设某市常驻人口 N=20000000(两千万),感染率 p=0.0001(万分之一),则套入公式得到

S=2000*x*(log(x,20000000)-1)+x,易求得当 x=2.91(可取整为 3)时,取得 S 最小值为 85782,检测轮数为 16 轮。

因此,如果采用最优检测算法,该市所使用的试剂数仅占整体待测人口的 0.43%,从而可以节约大量试剂。带来的成本是需要多轮检测。

实践中,可以采取只对前若干轮进行分组的做法,取得优化试剂数和检测时间之间的均衡。比如给定时间内必须要完成检测,此时可以调整各层的检测分组数。

ps,有趣的是,无论 p 取什么值,最后求得的最优的 x 都不会超过 4。

===== 关于 TechFirst 公众号 =====

专注金融科技、人工智能、数据科学相关领域的热门技术与前瞻方向。欢迎投稿!

如果你喜欢公众号内容,欢迎鼓励一杯 coffee~

猜你喜欢

转载自blog.csdn.net/yeasy/article/details/113497568