代码之家  ›  专栏  ›  技术社区  ›  Brian MacKay

进化算法:最佳重新填充故障

  •  9
  • Brian MacKay  · 技术社区  · 17 年前

    它实际上都在标题中,但下面是对进化算法感兴趣的人的分类:

    在EA中,基本前提是随机生成一定数量的生物体(实际上只是一组参数),针对问题运行它们,然后让最优秀的执行者存活下来。

    然后,你再与幸存者的杂交品种,幸存者的突变,以及一定数量的新的随机有机体组合。

    这样做几千次,有效的有机体就出现了。

    有些人也会做一些事情,比如引进多个“岛屿”的有机体,它们是分开的种群,可以偶尔杂交一次。

    所以,我的问题是:最佳的再填充百分比是多少?

    我一直保持前10%的表现,并与30%的杂交品种和30%的突变重新填充。剩下的30%用于新生物。

    我也尝试过多岛理论,我对你的研究结果也很感兴趣。

    这正是EA可以解决的问题类型,这一点我并不迷茫。你知道有人在尝试吗?

    事先谢谢!

    8 回复  |  直到 14 年前
        1
  •  6
  •   davenpcj    17 年前

    我最初尝试模拟我认为有机系统是什么样的。最终决定这是不好的,并变得更积极,10%保持,20%变异,60%杂交,10%随机。

    然后我注意到我的前10%都大致相同。所以我把随机数增加到30%。这对一些人有帮助,但不多。

    我确实尝试过多个岛,代跳过,代重新播种,这给了更好的结果,但仍然非常不满意,非常小的变化在前10%,疯狂的漫长的代得到任何结果。大部分代码学习了如何破解我的健康评估。

    很容易找到优秀的员工,所以不要担心他们太多。杂交品种有助于减少积极和消极的特性,所以它们是有用的,但实际上你想要得到的是很多很好的随机繁殖。专注于突变和新的随机数来引入特性,让交叉品种和顶级执行者只需跟踪最佳并更慢地改进它们。即:基于上一代的东西只是找到一个更好的地方格言,兰多姆找到更好的全球格言。

    我仍然相信,通过观察自然现象可以找到你问题的最佳答案,比如最近一篇关于果蝇飞行路径随机性的文章,这样可能会找到答案。

    也许最好的解决办法就是运行它并对其进行调整,不要害怕对其进行非常大的调整,这样的人口数量就足够多了。确保实现了保存和继续的方法。

        2
  •  7
  •   Kyle Burton    17 年前

    我为GA和EA找到的最好的资源是John Koza的书 Genetic Programming . 他深入讨论了基因组编码、随机突变、育种、调节适应功能等技术。

    就我个人而言,我只写了一小部分用于教学目的的模拟器。我发现,我如何调整这些百分比与我使用的适应功能的细节有关,我引入了多少随机突变,以及我如何“聪明”地尝试进行突变和繁殖-我发现,我越不“聪明”地尝试进行突变和交叉逻辑,群体越快地改善了它。健身分数——我还发现我在变异概率方面过于保守——我的初始跑步达到了局部最大值,很难摆脱。

    这些都不能给你具体的答案,但我不认为有具体的答案,GA的性质是不可预测的,调整这些类型的参数可能仍然是一门艺术。当然,你可以尝试一个元遗传算法,使用这些参数作为染色体,搜索在你运行的基遗传算法中产生更快适应度的设置。

    取决于你想得到什么样的“meta”。

        3
  •  4
  •   Hynek -Pichi- Vychodil    17 年前

    这是一个激烈的辩论(在文学和 Melanie, et al books )主题似乎非常特定于领域。对于一个具有n个参数的类型的问题有效的方法,几乎不会适用于另一个问题、另一个域或另一个参数集。

    因此,正如创伤治疗建议的那样,针对你正在解决的每个问题自己调整它,或者写一些东西来优化它。你能做的最好的事情就是跟踪你所有的“旋钮旋转”和微调实验,这样你就可以绘制出解决方案的地形,并了解如何在这个空间内快速优化。也可以尝试其他的技巧,比如爬山,这样你就可以有一个底线。

    @凯尔·伯顿:交叉与变异率也 constantly debated 在每一类问题上都要交给天然气和全球定位系统。

        4
  •  2
  •   Mark Roddy    17 年前

    假设你有一种方法来量化前x%的执行者,我建议你不要使用硬编码的阈值,而是分析性能分布,并在性能的第一个主要下降范围内的某个地方设置临界点,然后调整交叉面包、突变和新的有机体来填补这个空白。这样,如果你有一个非常“富有成效”的运行,其中许多变化都是成功的,那么你不会抛出大量的高绩效者。此外,如果你有一个“非生产性”的运行,你可以放弃更多的现有的有机体,而更新的有机体应该取代他们。

        5
  •  2
  •   jamesh    16 年前

    我已经成功地通过设置来自父染色体的两个基因的突变和交叉来增加种群的多样性。

    这种方法一直有效,直到突变率降至零;因为很可能会有一个周期性的进化压力,所以你应该尝试确保这些基因的突变率最低。

    实际上,我选择了多染色体基因型。一条染色体编码另一条的生殖功能。较小的“生殖染色体”有一个敏感的突变和交叉固定率。

    我发现这将阻止典型的高原和人口聚集。

    作为旁白,我倾向于为每个孩子做交叉和变异。

    对于世代的气体,我试图完全避开精英主义,但是在多个岛屿的人口聚集地,我保留每个岛屿的精英。当这些岛屿聚集在一起时,精英们就可以一起繁殖了。

        6
  •  1
  •   JoeBloggs    16 年前

    似乎有一些答案建议使用第二个遗传算法来确定第一个遗传算法的最佳参数,而不提及如何确定第二个遗传算法的最佳参数。我禁不住想知道那些建议这种方法的人的宗教信仰…

        7
  •  1
  •   Jing    14 年前

    正如其他人提到的,最佳组合将取决于您的特定问题和其他特定于问题的因素,例如解决方案空间的大小。

    在我们讨论从一代到下一代的进化分解之前,考虑每一代的规模是很重要的。一般来说,我的方法是从相当多的人口(约10万至50万人)开始,这些人口相当多样化,这是Koza在他的一些工作中建议的。为了从一开始就获得这种多样性,您可以将解决方案空间划分为存储桶,然后确保每个存储桶中至少有一定数量的个人。(例如,如果每个人都有一个树表示,请确保创建的深度2、3、…、最大深度相等)

    至于你的实际问题,没有明确的方法来处理它,但根据你的问题,你可能想强调随机性或去强调它。当你想强调这一点时,你应该减少独立个体的完整性,并引入更多的新的随机个体。如果您的解决方案空间中存在许多本地最大值,并且您希望进行更广泛的搜索,那么您通常希望这样做。

    当你崩溃的时候,有一些事情要考虑…首先,重复(在近亲繁殖中有许多相同或新相同的个体)。为了减少这一点,你可能需要在几代人之间扫描你的种群,并用新的随机个体或杂交个体代替重复。

    也就是说,我目前的方法是保持排名前1%,将排名前20%的人杂交成新的20%,将排名前40%的人杂交成接下来的20%,将排名前90%的人杂交成接下来的20%,然后随机生成其余的人(39%)。如果有重复的,我会删除它们并用新的随机个体替换它们。

    我不使用突变,因为在接下来的杂交过程中,大量的随机个体应该注意添加“突变”。

        8
  •  0
  •   TraumaPony    17 年前

    你知道你能做什么…你可以写一个遗传算法来确定最优分布。

    但是,通常我会保持12%和28%的杂交品种,其他品种各占30%。