3

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 ]
4

1 に答える 1