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
コードが間違っているのか、確率を計算する方法が間違っているのかわかりません。基本的には、考えられるすべての親のリストを取得し、それらが優性ホモ接合体、劣性接合体、またはヘテロ接合体のいずれであるかに基づいて、親の各ペアが少なくとも 1 つの優性対立遺伝子を持つ子供を生み出す確率を計算します。次に、各結果を親のペアの総数で割ります。その後、リストを合計するだけです。しかし、私の答えは少し間違っています。
誰かが私を正しい方向に向けることができますか?
EDIT:cartProdは、渡された2つのリストの「デカルト積」です。
cartProd :: [a] -> [a] -> [(a, a)]
cartProd xs ys = [ (x, y) | x <- xs, y <- ys ]