【问题标题】:Understanding basic recursion in Haskell了解 Haskell 中的基本递归
【发布时间】:2016-05-12 14:02:46
【问题描述】:

我正在为我的人工智能课程编写一个遗传算法作为项目。我熟悉 GA 背后的概念,但我对 Haskell 的经验有限。程序中只剩下一件事要做,那就是创建一个循环我的其他函数的函数。我将介绍我的功能并更详细地解释问题:

这是第二代的功能。我得到父母,将他们交配并突变基因组,然后将新的基因组传递到一个列表中:

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

这很好用。我可以创建新一代并重复:

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

因此,对于每一代,我都离目标基因组更近了一步(在我的例子中是一个字符串)。我想生成新一代,直到达到目标字符串。我认为基本递归可以解决这个问题,如下所示:

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

这适用于我的笔记本电脑,最高可达 g (3),但计算需要很长时间。我的问题是我真的不明白为什么。我认为 Haskell 递归的工作方式如下:

-- 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 函数一样。如果对 Haskell 有更多了解的人可以解释为什么我能够运行“第 15 代”功能而没有任何麻烦,但不超过“g (3)”功能,我将不胜感激,然后我必须强制退出控制台。

谢谢!

【问题讨论】:

    标签: haskell recursion


    【解决方案1】:

    问题是g n 没有被记忆 - 它会在你的列表理解中重新计算为 2 * 1000

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

    function 然后你可以做类似的事情:

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

    带着希望

    best = find initialPopulation
    

    (请注意,也许你应该在很多代之后也有一个退出策略 - 所以你可能想要包含一个代数计数器或类似的东西)

    【讨论】:

    • 谢谢卡斯滕!我认为这与我处理列表的方式有关,但现在我确定了!我有一个“maximumGen”Int,它应该为它应该通过多少代设定一个屋顶:)
    猜你喜欢
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2019-12-03
    相关资源
    最近更新 更多