2016-05-12 13 views
3

私は人工知能クラスのプロジェクトとして遺伝的アルゴリズムを書いています。私はGAのコンセプトに精通していますが、ハスケルの経験は限られています。プログラムに残されていることは1つだけです。それは他の機能をループする機能を作ることです。私は私の機能を説明し、問題をより詳細に説明します:ハスケルでの基本的な再帰の理解

これは第2世代のための機能です。私は両親を取得し、それらを交配し、ゲノムを変異させ、その後、リストに新しいゲノムを渡す:

generation1 = initialPopulation 
generation2 = [(mutate (mate (fTTS generation1) (sTTS generation1))) | x <- [1..100]] 

これは素晴らしい作品。私は、新しい世代を作成して繰り返すことができます:

generation3 = [(mutate (mate (fTTS generation2) (sTTS generation2))) | x <- [1..100]] 

だから、それぞれの新しい世代のために、私は一歩近づい(私の場合は文字列である)標的ゲノムへのです。私は目標の文字列に達するまで新しい世代を生成したい。これは、(3)までのgの私のラップトップ上で動作しますが、その後の計算は年齢を取る

g 0 = initialPopulation 
g n = [(mutate (mate (fTTS (g (n - 1))) (sTTS (g (n - 1))))) | x <- [1..100]] 

:私はのように、基本的な再帰は、この問題を解決するだろうと思いました。私の問題は、なぜ私は本当に理解できないということです。私はハスケルの再帰が次のように働いていると思った:

-- g 0 = [(mutate (mate (fTTS initialPopulation) (sTTS initialPopulation))) | x <- [1..100]] = ["N4kiT","Tu1RT","Tu1R<"] 
-- g 1 = [(mutate (mate (fTTS (g 0)) (sTTS (g 0)))) | x <- [1..100]] 
-- g 2 = [(mutate (mate (fTTS (g 1)) (sTTS (g 1)))) | x <- [1..100]] 
-- g 3 = [(mutate (mate (fTTS (g 2)) (sTTS (g 2)))) | x <- [1..100]] 

私の頭は上記のgeneration3関数と同じでなければならない。ハスケルについてもっと知っている人がなぜ「世代15」関数を何の問題もなく「g(3)」関数を超えて実行できる理由を説明できるのであれば、私は感謝します。コンソール。

ありがとうございます!

答えて

5

問題はg nがメモ化ではないということです - それは、再計算されます* 1000年2リスト・理解に

g 0 = initialPopulation 
g n = 
    let prev = g (n-1) 
    in [(mutate (mate (fTTS prev) (sTTS prev))) | x <- [1..100]] 

は、物事を改善する必要があります(私はそれを得るための良い問題だろうと思います厳格過ぎる値 - それはおそらく別の問題だ)


が、私はそのように使用することはありません - 代わりに書き込み:

nextGen prev = [(mutate (mate (fTTS prev) (sTTS prev))) | x <- [1..100]] 

機能と、あなたのような何かを行うことができます:有望

best = find initialPopulation 

find gen = if goodEnough gen then gen else find (nextGen gen) 

を(多分あなたはあまりにも多くの世代にした後、出口戦略を持つべきであることに注意してください - あなたは世代カウンタなどを含めることができます)

+1

ありがとうCarsten!私はそれが私がリストを扱う方法と関係があると思ったが、今私は確かに知っている! 私は "maximGen" Intを持っています。何世代にもわたる屋根を設定する必要があります:) –