新冠病毒的演化的进化算法推演

自从新冠病毒爆发以来,疫情的发展就一直牵动着全国人民的心。但随着近两个月疫情的飞速发展,可以说新冠病毒的传播速度已经超出了所有人的预料!

而年前因工作需要,刚研究过进化算法,所以新冠病毒是如何快速进化出来的,引起了我的兴趣。

1.基因总量

从网上的公开数据可以查到,新冠病毒的基因序列全长约3万,基因片段是长这个样子的:
新冠病毒的演化的进化算法推演

数据来自:https://bigd.big.ac.cn/ncov/variation/analysis

2.变异概率

我们知道,病毒变异主要来自RNA的复制错误,而一段形如“ATTAAAGGTT”的基因序列,有多少种可变异的组合形式呢?

已知RNA和DNA的基础组成即为:5种碱基——腺嘌呤A,胞嘧啶C,鸟嘌呤G,胸腺嘧啶T,尿嘧啶U
而根据碱基配对法则,我们能得出:A <-> T, C <-> G,所以正常情况下,RNA可以正确的复制
新冠病毒的演化的进化算法推演

而复制出错,例如,A 错配 C 或 G,(实际每个序列段和碱基位错配概率都不同,为计算方便,假设错配概率都相同)

所以假设,每个碱基位,在一次复制的过程中,有 2/3 的概率配错,而配错后能再正确组织到一起的概率为50%

来自碱基配对法则:https://baike.baidu.com/item/%E7%A2%B1%E5%9F%BA%E9%85%8D%E5%AF%B9%E6%B3%95%E5%88%99/15735422?fr=aladdin

3.变异基因

目前并未找到新冠病毒与SARS的同源祖先,我们暂用SARS假设作为新冠的祖先估计

从公开数据可知,最初的研究结果表明,新冠病毒与SARS病毒的相似度约为96%

而前不久,华南农业大学发现有一种穿山甲身上携带的病毒相似度约99%(未找到确切来源,姑且以99%计算)

中国新闻网:http://www.chinanews.com/gn/2020/01-24/9068832.shtml

那么得到推断,发生变异的基因序列有约 30000 * (1 - 0.99) = 300 个碱基

4.变异周期

我们知道病毒在只有进入宿主细胞后,才会不断复制,而复制错误就会产生变异,形成新的病毒序列,而新的病毒只有感染了新的宿主,才算完成了一轮变异迭代

那么,可以看出一轮成功的变异周期,取决于病毒感染周期,从目前公开的人传人感染情况可以看出,感染周期在约3-7天
新冠病毒的演化的进化算法推演
从上图可以看出,不同的时间地点采样,病毒已经发生了变异

如果病毒是在人传人之前演化完成,那也需要一种与人体相似的哺乳动物载体(目前还没有找到这种动物,我们先以动物X代替),假设动物X新陈代谢足够快,感染周期我们可以缩短到1-3天,为了计算方便就用1天代替

5.种群选择

我们也知道,病毒只有演化特定的S蛋白,直到动物X的肺部细胞ACE2蛋白受体稳定结合的情况下,才能被细胞接受,进而复制和变异,也就是说,需要排除掉大部分无效的变异,而S蛋白在冠状病毒的全基因组区为 21492-25259,也就是大概有 3767 个碱基

意味着病毒在演化过程中,这3767个碱基要么维持不动 要么演化出更具亲和力类型,我们可以假设,这种更具亲和力的结果占演化结果的50%

数据来自:http://www.biofeng.com/zaiti/dachang/pRSET%20A/Spike%20protein.html

6.演化时长

先从单线程的角度思考,假设每次只有1个X动物感染,发生1个碱基位的变异,并且只传播给1个后代,那么需要的迭代次数:

n * 2/3 * 50% - n * (3767/30000) * 50% = 300

求得迭代次数约 n = 1109 次

也就意味着,在这种理想状态下,X动物单代单传需要大概1109天,约3年时间即可命中结果

7.现实因素

考虑到现实中,动物大多群居,而且目前距离非典已有10多年了,所以在这么长时间的自然演化后,确实有可能发生这种变异(3~9年)

只是我们目前还需要继续搞清楚的是 X动物到底是什么?X动物和人之间的界限到底是怎么被突破的?第一个被感染的人是怎么发生的?

8.进化算法的思考

上文中用到了很多假设,而这些假设实际可能都不太恰当,但由此我们可以发现了自然进化的强大,只要是系统中略有漏洞或者微弱的薄弱环节,在种群大规模的演化下,都会被发现和攻破

所谓魔高一尺道高一丈,希望人类能通过自己的聪明智慧,身体也能快速演化出超级细胞,来应对大自然的挑战!

总结

起初我也是开始有点相信阴谋论的,但我想凡事还是自己推倒下,谣言就会不攻自破。

里面的推导逻辑有错漏的地方,还请不吝赐教!

上一篇:如何建构知识体系?


下一篇:Java Native Interface 五 JNI里的多线程与JNI方法的注册