作为即将到来的生物信息学课程的准备,我正在做一些来自 rosalind.info 的作业。我目前被困在“孟德尔第一定律”的作业中。
我想我可以通过这个蛮力强迫自己,但不知何故,我的想法一定太复杂了。我的方法是这样的:
建立一个具有三个级别的概率树。有两种生物交配,生物 A 和生物 B。第一级是,选择生物 A 纯合显性 (k)、杂合 (m) 或纯合隐性 (n) 的概率是多少。似乎以纯合显性为例,因为总共有 (k+m+n) 个生物,其中 k 个是纯合显性的,所以概率是 k/(k+m+n)。
然后在这棵树中,假设我们知道 A 被选为什么生物,那么在每一个下面都会出现生物 B 为 k / m / n 的概率。例如,如果生物 A 被选为杂合子 (m),那么生物 B 也是杂合子的概率为 (m-1)/(k+m+n-1),因为现在剩下的杂合子少了一个。
这将给出两个级别的概率,并且会涉及大量代码以达到这一点,因为我实际上是在构建一个树形结构,并且每个分支都为该部分手动编写了代码。
现在选择生物 A 和 B 后,他们每个人都有两条染色体。这些染色体之一可以随机挑选。所以对于 A 染色体 1 或 2 可以被挑选出来,对于 B 来说也是一样的。所以有 4 种不同的选择:挑选 A 的 1,挑选 B 的 1。挑选 A 的 2,挑选 B 的 1。挑选 A 的 1,挑选 B 的 2。挑选A 中的 2 个,B 中的 2 个。这些中的每一个的概率都是 1/4。所以最后这棵树会有这些叶子概率。
然后从那里以某种方式通过魔术我将所有这些概率加起来,看看两种生物产生具有显性等位基因的生物的概率是多少。
我怀疑这项任务是否旨在花费数小时来解决。我在想什么?
更新:
以最荒谬的蛮力方式解决了这个问题。只需运行数千次模拟交配并找出最终具有显性等位基因的部分,直到有足够的精度来通过分配。
import random
k = 26
m = 18
n = 25
trials = 0
dominants = 0
while True:
s = ['AA'] * k + ['Aa'] * m + ['aa'] * n
first = random.choice(s)
s.remove(first)
second = random.choice(s)
has_dominant_allele = 'A' in [random.choice(first), random.choice(second)]
trials += 1
if has_dominant_allele:
dominants += 1
print "%.5f" % (dominants / float(trials))