我正在尝试解决http://rosalind.info/上的“孟德尔第一定律”问题
我尝试了几种不同的方法,但是我无法获得解决方案以返回与他们页面上的示例问题相同的答案。我知道他们的样本输出是正确的。
这是我所拥有的:
traitProb :: Int -> Int -> Int -> Double
traitProb k m n = getProb list
where list = cartProd genotypes genotypes
genotypes = (replicate k Dominant) ++ (replicate m Heterozygous) ++ (replicate n Recessive)
getProb = sum . map ((flip (/)) total . getMultiplier)
total = fromIntegral $ length list
getMultiplier (Dominant, Dominant) = 1.0
getMultiplier (Recessive, Dominant) = 1.0
getMultiplier (Dominant, Recessive) = 1.0
getMultiplier (Dominant, Heterozygous) = 1.0
getMultiplier (Heterozygous, Dominant) = 1.0
getMultiplier (Heterozygous, Heterozygous) = 0.75
getMultiplier (Heterozygous, Recessive) = 0.5
getMultiplier (Recessive, Heterozygous) = 0.5
getMultiplier (Recessive, Recessive) = 0.0
我不确定代码是否错误,或者我计算概率的方法是否错误。本质上,这个想法是获取所有可能父母的列表,然后根据他们是纯合子,隐性还是杂合子,计算每对父母产一个至少有一个优势等位基因的孩子的概率。然后将每个结果除以父母对总数。之后,我只对列表进行汇总。但是我的回答有点错误。
谁能指出我正确的方向?
编辑:cartProd是传递给它的两个列表的“笛卡尔积”,如果可以的话。
cartProd :: [a] -> [a] -> [(a, a)]
cartProd xs ys = [ (x, y) | x <- xs, y <- ys ]
最佳答案
我建议分三步进行计算,以稍微改变您的想法:
第一代父母获得基因型X的概率是多少? (此外,X有多少种不同的选择?)
第二个父母获得基因型Y的概率是多少?
给定父母的基因型X和Y,孩子表现出显性基因型的概率是多少?
对每个(X,Y)对加总步骤1-3。
当我手动绘制树形图时,我发现更容易计算出一个孩子没有显性等位基因的可能性。求和的选项较少,然后可以从1中减去此总和。
关于haskell - 计算具有至少一个优势等位基因的后代的概率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23975467/