先回顾一道简单的高考数学题:
武汉全民核算检测时,采取将十个人的样品混合在一起,如果查出病毒再逐一检测,问:人群中健康人群的比例应达到多少采用混检能减少检测次数?
答:如果不采取混检,则十个人需要测试10次;如果采取了,则需要测试1次或者11次,期望为11x+1-x,其中x为需要逐一检测的几率。那么我们有x<0.9,则1-x>0.1,开10次方根,每个人健康的概率大于(0.1)^0.1≈0.79。也就是说,只要每个人健康的概率大于0.8,或者说人群中健康人群的比例达到80%,即可采用混检法。
这个问题是我前几天突发奇想,计算的一个内容。因此我就在想这个问题的延伸,就是混检法的这个混检人数,究竟应该怎么选择,所以我打算在MATLAB上编写一个简单的程序,来进行计算。
大致的思路是这样的,我们设置一个有一定规模的人群感染比例的数值,然后计算采用不同人数的混检方法的最终检测次数,并绘制图表来加以说明。我们绘制一条与人口相等的红线,低于这个红线就说明检测次数是小于人口总数的,选择混检能减少检测次数,反之则反而增加了检测次数。比红线低越多,说明效果越明显。
代码如下
clear all;close all;clc;
N=1e7;% N means population of a city.
infected=0.2;% the rate of infected people.
Result=[];% Result matrix
I=20; % Maxium number of a mixed test.
for i=1:I
times=0;% Total times of test we need.
tested=0;% people we have tested.
while tested
A=rand(1,i);% Select i people to test.
if min(A)-infected<0 %Anyone infected.
times=times+i+1; %test 1+i times.
else % Everyone is healthy
times=times+1; %test only 1 time.
end
tested=tested+i; % till everyone got tested.
end
Result=[Result times]; %Record the result.
end
plot(1:I,Result,'o-');
line([1,I],[N,N],'color','r');%Reference Line
title(strcat('N=',num2str(N),' infected=',num2str(infected)));
得到的结果如图
图1 运算结果,N=1e7,infected=0.2
根据图1我们可以看出,当一座城市有1e7也就是一千万人口,人口中的感染率为0.2也就是20%时,需要检测的总次数是随着每次混检的人数变化的,先变小后变大,最低点大约在3人混检左右。我改变了一些相关参数,发现基本上数据也保持这个趋势:当感染率更低(10%)的时候,采取4人混检甚至比3人更好,如图2;当感染率更高(30%)的时候,这个最低点会向上移动一些,变成只有3人混检能节省次数,如图3;再高,比如说达到一半人感染,混检法就不适用了,因为次数难以收敛,呈现出不断上升的趋势。
图2 运算结果,N=1e7,infected=0.1
图3 运算结果,N=1e7,infected=0.3
因此,我们发现,其实采取3人到4人的混检法,能有效地减少混检次数,因此Foursome和Threesome会比较好。