9

我已经实现了一个简单的遗传算法来生成基于伊索寓言的短篇小说。以下是我正在使用的参数:

突变:单个单词交换突变,测试率为 0.01。

交叉:在给定点交换故事句子。率 - 0.7

选择:轮盘选择 - https://stackoverflow.com/a/5315710/536474

健身功能:3种不同的功能。每一项的最高分是1.0。所以总的最高健身得分是3.0。

人口规模:因为我使用了 86 个伊索寓言,所以我用 50 个测试人口规模。

初始人口:所有86个寓言句子顺序都被打乱了,以便完全胡说八道。我的目标是从这些结构失落的寓言中产生一些有意义的东西(至少在一定程度上)。

停止条件:3000 代。结果如下:

在此处输入图像描述

然而,这仍然没有产生有利的结果。我期待着世代相传的情节。关于为什么我的 GA 表现更差的任何想法?

更新:正如你们所有人所建议的那样,我已经将 10% 的当代精英复制到下一代。结果还是一样: 在此处输入图像描述

可能我应该使用锦标赛选择。

4

5 回答 5

5

以上所有回复都很棒,我会研究一下。我会补充我的想法。

突变

您的突变率似乎很好,尽管使用遗传算法突变率如果不正确会导致很多问题。我会确保你测试很多其他值来确定。

对于突变,我可能会使用两种类型的突变。一种是用字典中的单词替换单词,另一种是在句子中交换两个单词。这将鼓励整体人口多样化,并改组措辞。

分频器

我不确切知道您是如何实现的,但是在这种情况下,单点交叉似乎不会那么有效。我会尝试实现一个 n 点交叉,这将更好地改组你的句子。同样,我不确定它是如何实现的,但仅仅交换可能不是最好的解决方案。例如,如果一个词在第一个点,有没有办法让它移动到另一个位置,或者如果它是通过选择选择的,它总是第一个词?

如果词序对您选择的问题很重要,那么简单的交叉可能并不理想。

选择

同样,这看起来不错,但我会确保您测试其他选项。在过去,我发现基于等级的轮盘选择要成功得多。

健康

这始终是任何遗传算法中要考虑的最重要的事情,并且由于您遇到的问题的复杂性,我会加倍确保它有效。您是否测试过它是否适用于“已知”问题?

人口规模

您的价值似乎很小,但我已经看到遗传算法在小群体中成功运行。尽管如此,我还是会尝试更多的人群,看看你的结果是否更好。

到目前为止,最受欢迎的建议是实施精英主义,我绝对会推荐它。它不必太多,即使只是每一代最好的一对染色体(尽管与其他一切一样,我会尝试不同的值)。

另一个有时有用的操作符是剔除。破坏你最弱的染色体的一部分,或者与其他(或两者)相似的染色体,并用新的染色体替换它们。这应该有助于阻止您的人口“过时”,从您的图表看来,这可能正在发生。突变只能使人口多样化。

于 2015-07-03T08:21:08.323 回答
3

你可能会失去最好的组合,你应该保持每一代中最好的而不交叉(精英)。另外,您的功能似乎很稳定,尝试其他类型的突变,应该会有所改善。

于 2015-07-03T02:10:41.263 回答
3

减少 5% 到 10% 的人口成为精英,这样你就不会失去你所拥有的最好的。

确保你的选择过程设置得很好,如果糟糕的候选人经常通过,它会毁掉你的进化。你也可能陷入局部最优,你可能需要将其他东西引入你的基因组,否则你不会走得太远。

移动句子和单词可能不会让你走得太远,引入新的句子或单词可能会很有趣。

如果您将故事视为点 x,y 并将评估函数视为 f(x,y),并且您试图找到 f(x,y) 的最大值,但您的突变和交叉仅限于x -> y, y ->y,你不会移动太远是有道理的。当然,在您的问题中还有更多变量,但是如果不引入新的东西,我认为您不能避免局部性。

于 2015-07-03T03:34:58.580 回答
3

正如@GettnDer 所说,精英主义可能会有很大帮助。

我建议使用不同的选择策略。轮盘赌的选择有一个大问题:假设最好的个人的适应度是所有适应度总和的 90%。那么轮盘赌轮不太可能选择其他人(参见例如here)。我最喜欢的选择策略是锦标赛选择。它对适应度值的巨大差异更加稳健,并且可以很容易地控制选择压力。

新奇搜索

我也会尝试一下Novelty Search。这是进化计算中相对较新的方法,您不是根据实际适应度进行选择,而是基于新颖性,这应该是衡量一个人的行为与其他人的不同之处(但您仍然计算抓住好人的能力)。特别感兴趣的可能是经典的适应度驱动算法和新颖性驱动算法的组合,比如J.-B. 穆雷。

于 2015-07-03T06:02:51.123 回答
2

使用遗传算法时,构建染色体结构是一种很好的做法,以反映优化过程中的实际知识。

在您的情况下,由于您打算生成由句子组成的故事,因此如果您将染色体转换为结构化的短语、行<adjectives>* <subject> <verb> <object>* <adverbs>*(此处非常简化),它可以改善您的结果。

然后可以为每个单词分配一个类。例如, Fox=subject 、looks=verb 、grapes=object ,然后您的交叉运算符将在染色体之间交换来自同一类别的元素。此外,您的变异算子只能插入适当类别的新元素(例如,主语前的形容词)或用同一类别中的随机词替换词。

通过这种方式,您可以最大限度地减少无意义染色体的数量(如Fox beautiful grape day sky)并提高您的 GA 的话语生成能力。

此外,我同意之前的所有评论:如果您使用的是精英主义并且最佳性能下降,那么您实施它是错误的(请注意,在病态情况下,它可能会在很长一段时间内保持不变)。

我希望它有所帮助。

于 2015-07-07T18:15:27.953 回答