血液检测
现有25只羊需逐一检测是否感染了一种罕见的病毒,已知这种病毒在羊群中的感染率为2%。
有一种准确性很高的PCR检测,能对血液样品给出明确的阳性或阴性的结论,但这种监测非常耗时且昂贵。为节省成本,兽医负责人建议采用以下做法(当然前提是这种检测充分敏感以及不同的样品混合后不会有副作用):
首先将羊群分成5组,每组有5只羊。先把每一组的5份血液样品混合在一起作一次检测,若结果呈阴性,则该组都未感染,否则再对该组中每只羊分别作一次检测(也就是一共5次)以确认被感染的个体。
由于感染率仅为0.02,每组第一次检测的结果有$0.98^5=0.9039207968$的概率为阴性,以及$ 0.9039207968=0.0960792032$的概率为阳性。因此每组的期望检测次数为
$$1+0.0960792032\times 5=1.480396016.$$
从而五组的总期望检测次数为$1.480396016\times 5=7.40198008$次,相比全部逐一检测的方案(需要25次)节省了70%。
该方案已然十分有效,不过其中仍存在一些改进空间。例如:
可以在一开始就混合全部25份血液样品作一次检测。可以验证,在大约60.35%的情况下结果会呈阴性,从而不需要再作更多的检测。
又如分组后若已知一组羊中至少有一只感染了病毒,且前四只的检测结果均为阴性,那就不必再作第五次检测。
此外还可以尝试其它分组方案以使总检测数的期望值最小等等。
为了简化这一问题中各种非常宽泛的可能性,让我们引入这样一个限制要求:若检测了一份混合样品,则必须先完全确认该样品中所有羊的感染情况后才能检测其它样本(也就是不允许先在若干组中每组先检测一部分样本,再将未检测的样本都混合)。
如此则上例中的最优策略(即能令总检测数的期望值最低的策略)平均仅需4.155452次检测。
现在有一群共s只羊和一种感染率为p的病毒,记$T(s,p)$为采用最优策略时所需要的平均检测次数。
可以验证,在四舍五入到六位小数时,$T(25, 0.02)=4.155452, T(25, 0.10)=12.702124$。
对于$p=0.01, 0.02, 0.03, \ldots, 0.50$,求$T(10000, p)$的总和,结果四舍五入到六位小数。
本题难度:
解答
设需要检测n只羊,令$f(n)$为不知晓其中是否有阳性病例时的期望检测次数,$g(n)$为知晓其中至少有一例阳性时的期望检测次数,则有
$$f(n)=1+ \min_k q_kg(k)+f(n-k),$$
以及
$$g(n)=1+\min_kq_k(g(k) + f(n-k))/q_n + (1-q_k) *g(n-k)/q_n,$$
其中$q_k=(1-p)^k$。递推计算即得结果$378563.260589$。
注:本题中的限制要求十分重要,若允许二次混检则期望检测次数可进一步降低。
注2:由于本题中的n相比p非常大,因此期望总是存在一定数量的阳性,所以太大的分组无助于获得信息,以下代码按调试中的经验值设置组的大小不超过200。
注3:为方便作除法,以下代码为Python 3。代码中还打印了进度信息。
s=0
target=10000
bound=200
for k in range(1,51):
p=0.01*k
q=1-p
d=[0.0,1.0]
e=[0.0,0.0]
for n in range(2,target+1):
qn=q**n
if n <= bound:
e.append(1+min(((q**j-qn)*e[n-j]+(1-q**j)*(d[n-j]+e[j]))/(1-qn) for j in range(1,n)))
m=min(d[j]+d[n-j] for j in range(1,min(n//2,bound)+1))
if n < bound:
m=min(m,1+(1-qn)*e[n])
d.append(m)
print(f"{p:.2f}, {d[target]:.6f}")
s+=d[-1]
print(f"{s:.6f}")