【问题标题】:breeding parents for multiple children in genetic algorithm遗传算法中多个孩子的育种父母
【发布时间】:2011-07-07 15:13:34
【问题描述】:

我正在使用一系列教程在 javascript 中构建我的第一个遗传算法。

我正在为这个调度教程http://www.codeproject.com/KB/recipes/GaClassSchedule.aspx#Chromosome8 构建一个更简单的结构,但是我遇到了育种问题。

我得到了 60 个人的种群,现在我要挑选前两名进行繁殖,然后随机选择其他一些个人与前两名进行繁殖,我不会以相当小的数量结束相当快的父母数量?

我认为,如果我将前两个结果与接下来的 20 个结果中的每一个相结合,我将不会在解决方案上取得太大进展。

正确吗?有没有普遍接受的方法来做到这一点?

【问题讨论】:

  • 你的意思是遗传的而不是通用的?
  • 是的,遗传的,不是通用的。抱歉,最近几晚没睡好。
  • 如果我正确地解释了您的问题,您担心会用完个人,因为您只从人群中挑选了几个父母。关键是你的父母需要尽可能多的孩子来保持人口规模不变。因此,如果您从 60 个人中挑选 5 位父母,那么每个父母需要得到 11-12 个孩子,因此您最终会在下一代中产生 60 个新的(或 55 个新的和 5 个旧的)个体。

标签: algorithm artificial-intelligence genetic-algorithm


【解决方案1】:

我有一个 Javascript here 中的遗传算法样本。

你的方法的一个问题是你总是通过与前 2 个个体交配来杀死种群中的多样性。这永远不会很好地工作,因为它太贪心了,而且你实际上会破坏首先拥有遗传算法的目的。

这就是我实现与精英主义交配的方式(这意味着我保留了一定比例的未改变的最合适的个体并随机交配所有其他人),我会让代码来说话:

// save best guys as elite population and shove into temp array for the new generation
for(var e = 0; e < ELITE; e++) {
   tempGenerationHolder.push(fitnessScores[e].chromosome); 
}

// randomly select a mate (including elite) for all of the remaining ones
// using double-point crossover should suffice for this silly problem
// note: this should create INITIAL_POP_SIZE - ELITE new individualz
for(var s = 0; s < INITIAL_POP_SIZE - ELITE; s++) {
   // generate random number between 0 and INITIAL_POP_SIZE - ELITE - 1
   var randInd = Math.floor(Math.random()*(INITIAL_POP_SIZE - ELITE));

   // mate the individual at index s with indivudal at random index
   var child = mate(fitnessScores[s].chromosome, fitnessScores[randInd].chromosome);

   // push the result in the new generation holder
   tempGenerationHolder.push(child);
}

评论很好,但如果您需要任何进一步的指示,只需询问(here 是 github 存储库,或者您可以在上面的 url 上查看源代码)。我多次使用这种方法(精英主义),对于基本场景,它通常效果很好。

希望这会有所帮助。

【讨论】:

  • 谢谢约翰,我刚刚浏览了你的代码,关于“达尔文错了”,查看完整的解决方案让它变得容易多了。您在评论和说明方面做得很好。我不能说我的 GA 工作正常,但我认为你的帮助让我坚定地走在正确的道路上。谢谢。
【解决方案2】:

保持绝对最适合的个体被称为精英主义,它确实往往会导致更快的收敛,这取决于问题的适应度,可能是也可能不是你想要的。更快的收敛是好的,如果它减少了寻找可接受的解决方案所花费的努力,但如果这意味着你最终得到一个局部最优而忽略更好的解决方案,那就不好了。

完全随机挑选其他父母不会很有效。你需要一些机制,使更适合的候选人比更弱的候选人更有可能被选中。您可以使用几种不同的选择策略,每种策略都有不同的优缺点。一些主要的描述在here。通常您会使用轮盘赌选择或锦标赛选择。

至于将精英个体与其他父母中的每一个结合起来,这是破坏种群变异(以及消除先前保存的最佳候选者)的秘诀。

如果您采用精英主义,请保持精英个体不变(这是精英主义的重点),然后与其他父母配对(可能包括也可能不包括部分或全部精英个体,取决于他们是否也被选中通过选择策略作为父母退出)。每个亲本只能交配一次,除非它被选择策略多次挑选出来。

【讨论】:

  • 精英主义不是我认为的问题(实际上几乎总是可以将它用于所有实际目的),问题是他通过总是与其中之一交配来扼杀多样性前 2 名
【解决方案3】:

当我过去实现遗传算法时,我所做的是总是以概率方式选择父母 - 也就是说,您不一定会选择获胜者,但您会根据概率选择获胜者他们比其他人好多少(基于适应度函数)。

我不记得论文的名称来支持它,但有一个数学证明表明“排名”选择比“比例”选择收敛得更快。如果您尝试四处寻找“遗传算法选择策略”,您可能会发现一些相关信息。

编辑: 更具体地说,自从pedalpete问起,有两种选择算法:一种基于等级,一种基于适应度比例。考虑具有 6 个解决方案和以下适应度值的总体:

Solution   Fitness Value
A          5
B          4
C          3
D          2
E          1
F          1

在排名选择中,您将选取前 k 个(例如,2 或 4)并将它们用作下一代的父母。在比例排序中,为了形成每个“孩子”,你根据适应度值随机选择一个概率的父母:

Solution   Probability
A          5/16
B          4/16
C          3/16
D          2/16
E          1/16
F          1/16

在这个方案中,F 最终可能成为下一代的父母。对于较大的人口规模(例如 100 - 可能更大或更小,具体取决于搜索空间),这将意味着底部解决方案最终将在某些时候成为父解决方案。这没关系,因为即使是“坏”的解决方案也有一些“好的”方面。

【讨论】:

  • 谢谢詹姆斯,我不确定我是否理解其中的区别。如果最好的就是最好的,第二好的就是第二好的,如果第二比第三有什么关系呢?在什么情况下你会选择第三而不是第二?还是第五?
  • @pedalpete 选择可能是任何选择算法中最关键的部分。你不能只选择最优秀的人——需要差异,就像在现实世界中一样。想象一下,一个本来很坏的个体的突变可能使它变得非常好(或两个坏个体的交叉)。当然,您的选择必须侧重于更好的个人,但您仍然必须有差异。试验你的参数,它们是针对特定问题的。
【解决方案4】:

您的方法可能会受到premature convergence 的影响。不过,还有许多其他选择技术可供选择。您可能希望考虑的比较流行的一种是Tournament selection

不同的选择策略提供不同程度的“选择压力”。选择压力是策略坚持选择最佳程序的强度。如果每次都选择绝对最佳的程序,那么您的算法实际上就变成了hill-climber;它将陷入局部最优,无法导航到健身景观中的其他峰值。在规模的另一端,完全没有适应度压力意味着算法会盲目地随机地在适应度环境中跌跌撞撞。因此,挑战在于尝试为您要解决的问题选择具有足够(但不是过度)选择压力的操作员。

锦标赛选择操作符的优点之一是,只需修改锦标赛的规模,您就可以轻松调整选择压力的水平。大型赛事压力更大,小型赛事压力更小。

【讨论】:

    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2012-12-10
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多