Я пытаюсь решить задачу «Первый закон Менделя» на сайте 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 ]
getMultiplier
также можно уменьшить, сопоставив0.75
,0.5
и0.0
, а все остальное пусть будет1.0
:getMultiplier (_, _) = 1.0
. Как ни странно, я сделал то же упражнение сегодня. Мое решение можно найти здесь, если вам нужно вдохновение. :) - person Shoe   schedule 01.06.2014cartProd
. Я предполагаю, что это декартово произведение. Если бы вы могли опубликовать SSCCE, это увеличило бы вероятность получения вашего ответа. - person Shoe   schedule 01.06.2014