我已经实现了一个简单的遗传算法来生成基于Aesop寓言的短篇小说。 以下是我正在使用的参数:
突变:单字交换突变,测试率为0.01。
Crossover :在给定点交换故事句子。率 - 0.7
选择:轮盘赌选择 - https://stackoverflow.com/a/5315710/536474
健身功能:3种不同的功能。每个人的最高得分是1.0。所以最高健康分数是3.0。
人口规模:由于我使用了86个Aesop寓言,我测试了人口规模为50。
初始人口:所有86个寓言句子都被洗牌,以便完全废话。我的目标是从这些结构丢失的寓言中产生一些有意义的东西(至少在一定程度上)。
停止条件:3000代。 结果如下:
但是,这仍然没有产生有利的结果。我期待着几代人的情节。为什么我的GA表现更差的结果呢?
更新:正如大家所建议的那样,我已经将当前一代的10%的精英主义复制到了下一代。结果仍然保持不变:
我可能应该选择锦标赛。
答案 0 :(得分:4)
以上所有回复都很棒,我会调查一下。我会添加我的想法。
<强>突变强>
你的突变率似乎很好,尽管遗传算法突变率如果不正确会引起很多问题。我确保你要测试很多其他值才能确定。
对于突变,我可以使用两种类型的突变。一个用你的字典替换其他单词,一个用一个句子替换两个单词。这将鼓励整个人口多样化,并改变话语。
<强>交叉强>
我并不确切知道你是如何实现这一点的,但在这种情况下,单点交叉看起来并不是那么有效。我试着实现一个n点交叉,这样可以更好地改变你的句子。同样,我不确定它是如何实现的,但只是交换可能不是最好的解决方案。例如,如果一个单词位于第一个点,它是否有任何方式可以移动到另一个位置,或者它是否始终是第一个单词,如果它是通过选择选择的?
如果单词顺序对您选择的问题很重要,简单的交叉可能并不理想。
<强>选择强>
同样,这似乎很好,但我确保你测试其他选项。在过去,我发现基于排名的轮盘选择更加成功。
<强>健身强>
在任何遗传算法中,这始终是最重要的考虑因素,而且你遇到问题的复杂性,我会更加确定它是否有效。您是否测试过它与已知的“已知”相关问题
人口规模
您的价值似乎很小但我已经看到遗传算法在小群体中成功运作。尽管如此,我还是会尝试更多的人群,看看你的结果是否更好。
到目前为止,最受欢迎的建议是实施精英主义,我绝对推荐它。它不一定非常多,甚至只是每一代染色体中最好的一对(尽管和其他一切一样,我会尝试不同的值)。
另一个有时有用的操作符是剔除。摧毁一部分最弱的染色体,或一条与其他染色体相似的染色体,或用新的染色体代替染色体。这应该有助于阻止您的人群过去&#39;陈旧,从您的图表看起来可能正在发生。突变只会使人口多样化。
答案 1 :(得分:3)
你可能正在失去最好的组合,你应该保持每一代人的最佳状态而不穿越(精英)。此外,您的功能似乎相当稳定,尝试其他类型的突变,这应该改善。
答案 2 :(得分:3)
将5%到10%的人口减少为精英,这样你就不会失去最好的人数。
确保您的选择过程设置得很好,如果不好的候选人经常会经过它会破坏您的进化。 你可能也陷入局部最优,你可能需要在你的基因组中引入其他东西,否则你不会走得太远。
移动句子和单词不会让你走得太远,引入新的句子或单词可能会很有趣。
如果您将故事视为点x,y并将您的评估函数视为f(x,y),并且您尝试找到f(x,y)的最大值,但是您的变异和交叉 - 仅限于x - > y,y - &gt; y,你不会走得太远是有意义的。当然,在您的问题中存在更多变量,但如果没有引入新的东西,我认为您不能避免局部性。
答案 3 :(得分:3)
正如@GettnDer所说,精英主义可能会有很多帮助。
我建议使用不同的选择策略。轮盘赌选择有一个大问题:想象一下最好的独立性健身是例如所有适合度总和的90%。然后轮盘赌轮不太可能选择其他人(参见例如here)。我最喜欢的选择策略是tournament selection。它对健身值的巨大差异更加稳健,并且可以非常容易地控制选择压力。
新奇搜索
我也试试Novelty Search。这是进化计算中相对较新的方法,你不是根据实际的适应度进行选择,而是基于新颖性,它应该是个体在行为方面不同的一些指标。其他人(但你仍然计算出抓住好人的适合度)。特别感兴趣的可能是经典健身驱动算法和新奇驱动算法的组合,如J.-B的this one。穆雷。
答案 4 :(得分:2)
使用遗传算法时,为了反映优化过程中的实际知识,构建染色体是一种很好的做法。
在您的情况下,由于您打算生成由句子组成的故事,如果您将染色体转换为结构化短语,行<adjectives>* <subject> <verb> <object>* <adverbs>*
(此处大量简化),它可以改善您的结果。
然后可以为每个单词分配一个类。例如,Fox = subject,Looks = verb,grapes = object,然后你的交叉运算符将在染色体之间交换相同类别的元素。此外,您的变异运算符只能插入适当类别的新元素(例如,主语前的形容词)或替换同一类别中的随机单词。
通过这种方式,您可以最大限度地减少无意义染色体的数量(如 Fox美丽的葡萄日天空),并提高GA的话语生成能力。
此外,我同意之前的所有评论:如果你使用精英主义并且最佳表现减少,那么你的错误实施(注意在病态情况下它可能会在很长一段时间内保持不变)。
我希望它有所帮助。