Algorithm 遗传算法-新一代变得更糟

Algorithm 遗传算法-新一代变得更糟,algorithm,genetic-algorithm,python-2.x,fitness,roulette-wheel-selection,Algorithm,Genetic Algorithm,Python 2.x,Fitness,Roulette Wheel Selection,我已经实现了一个简单的遗传算法来生成基于伊索寓言的短篇故事。 以下是我正在使用的参数: 突变:检测率为0.01的单字交换突变 交叉:在给定点交换故事句子。比率-0.7 选择:轮盘赌轮选择- 健身功能:3种不同的功能。每个项目的最高分数为1.0分。所以总的最高健身分数是3.0 人口规模:因为我使用了86个伊索寓言,所以我用50个测试了人口规模 初始人口:所有86个寓言句子顺序都被洗牌,以便完全胡说八道。我的目标是从这些结构丢失的寓言中产生一些有意义的东西(至少在一定程度上) 停止条件:3000代。

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

突变:检测率为0.01的单字交换突变

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

选择:轮盘赌轮选择-

健身功能:3种不同的功能。每个项目的最高分数为1.0分。所以总的最高健身分数是3.0

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

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

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

然而,这仍然没有产生有利的结果。我期待着这一情节能延续几代人。你知道为什么我的GA表现更差吗

更新:正如你们所有人所建议的,我已经用精英主义将当前一代的10%复制到了下一代。结果仍然是一样的:


也许我应该使用锦标赛选择

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

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

确保你的选择过程已经准备好了,如果不好的候选人经常经过,这会破坏你的进化。 你也可能陷入局部最优,你可能需要在你的基因组中引入其他东西,否则你就走不远了

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


如果你认为故事是一个点x,y,你的评价函数是f(x,y),你试图找到f(x,y)的最大值,但你的变异和交叉仅限于x->y,y->y,这是有道理的,你不会走远。诚然,在你的问题中有更多的变量,但如果不引入新的东西,我认为你无法避免局部性。

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

我的建议是使用不同的选择策略。轮盘赌轮盘的选择有一个大问题:想象一下,最好的个人适合度是所有适合度总和的90%。然后轮盘赌轮不太可能选择其他个体(参见示例)。我最喜欢的选择策略是。它对适应值的巨大差异更具鲁棒性,并且选择压力可以很容易地控制

新颖性搜索


我也会尝试一下。这在进化计算中是一种相对较新的方法,在进化计算中,你不是根据实际的适应度来选择,而是根据新奇度来选择,新奇度是衡量一个人在行为上与其他人有什么不同的指标(但你仍然计算适应度来捕捉好的个体)。特别感兴趣的可能是经典的适应度驱动算法和新颖性驱动算法的组合,如J.-B.Mouret所做的。

以上所有的回答都很好,我会研究它们。我会补充我的想法

突变

你的变异率看起来不错,尽管使用遗传算法,如果变异率不正确,可能会引起很多问题。我会确保你测试了很多其他的值

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

交叉

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

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

选择

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

健身

在任何一个遗传算法中,这都是最重要的考虑因素,而且随着问题的复杂性,我会加倍确定它是可行的。您是否测试过它是否适用于“已知”问题

人口规模

你的价值看起来很小,但我看到遗传算法在小群体中成功地工作。尽管如此,我还是会尝试更多的人群,看看你的结果是否更好

到目前为止,最流行的建议是实行精英主义,我绝对推荐。它不需要太多,即使是每一代染色体中最好的一对(尽管和其他任何东西一样,我会尝试不同的值)


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

当使用遗传算法时,这是一个好方法