【问题标题】:Generating the next generation of a Genetic Algorithm生成下一代遗传算法
【发布时间】:2015-02-16 03:24:20
【问题描述】:

几个月前我做了一个遗传算法,但结果证明我在解决任何类型的问题方面都非常周到。我最初的目标是在游戏应用程序中使用遗传算法

现在我正在重新创建整个事物并尝试从另一个角度看待问题。

现在我要定义设置下一代的步骤了。

我最后的想法是:

  • 从当前一代中取出评分最高的基因,并在下一代中复制它们(数量由精英设定)

  • 随机取两个基因进行交叉(被选中的几率与基因等级相关),我做了几种交叉方法(一点,两点,三亲,平均,制服...)

  • 用上面的方法给新生代填充基因

  • 对基因应用一些突变(被选中的机会由突变率决定),它只会改变部分DNA(排除最高评分的基因)

这被证明是非常低效的(我不知道为什么),而且由于交叉过程多次循环遍历所有基因,因此对计算的要求也很高。

现在我正在考虑一种新方法。

基本上我的目标是保持基因并去除“坏”基因,并用交叉基因填充基因库。

在拥有 1000 个人的基因库中,我会:

  • 丢弃排名最低的 500 个。

  • 复制最高评分(在 10% 的精英主义中,它是 100)

  • 使用交叉生成 400 个新基因。

  • 应用突变

我太从字面上理解“世代”的概念,让他们都死去(期待最高评价的那些),现在我会让他们都活下去,期待坏的。并根据需要重新填充。

我错过了什么吗?这种新方法会更好吗?

【问题讨论】:

  • 你的想法 1 和 2 的概念算法对我来说看起来不错。如果您遇到效率低下的问题,我会调查这些想法的实施。请记住,遗传算法不是万无一失的解决方案。由于“最佳”遗传算法没有神奇的数字,因此必须调整所有控制参数。也许增加种群规模,也许看看停止标准(你进化了太多代而收获很少?),也许更多的突变,也许更少。
  • 也许我的实现是问题的原因,但我不太确定,我重写了几次代码。 GA 的问题在于难以调试,因为唯一改变的是基因,而且它们都是“随机的”。关于调整,是的,我没有对此进行太多实验,我遵循了我在互联网上找到的一些指导方针。
  • 放弃最差的一半人口并不是最好的主意。这会很快导致过早收敛。我建议看一下选择算法。我在锦标赛选择方面有很好的经验。它非常容易实现,并且通常比普通的健身比例选择效果更好。它还具有最坏的人无法生存的特性。
  • 另一个可能导致性能不佳的因素是基因型-表型映射。如果您的解决方案的遗传编码非常间接,那么 GA 可能很难找到解决方案。如果基因型的微小变化导致表型发生巨大变化(实际解决方案),那么交叉和突变就不能很好地发挥作用。

标签: genetic-algorithm concept


【解决方案1】:

有一种替代垂直基因转移(传统的世代概念)的方法,即水平基因转移(参见this paper)。通过水平基因转移,种群大小在整个模拟过程中保持不变。

此外,当您培育基因型时(无论您选择哪种方法),您绝对不应该在几代人中保留最适合的候选者。如果这样做,您找到的解决方案很可能是local optimum。每个基因型都应该有一定的机会传给下一代,适者有更好的机会(请参阅this answer 关于线性等级选择)。

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多