我已经实施了许多遗传算法来解决各种问题。然而,我仍然对交叉/重组的有用性持怀疑态度。
我通常在实现交叉之前首先实现变异。在我实施交叉之后,与简单地使用突变并在每一代中引入一些随机个体以确保遗传相比,我通常不会看到产生良好候选解决方案的速率显着提高。
当然,这可能是由于交叉函数和/或概率的选择不当,但我想得到一些具体的解释/证据,说明为什么/交叉是否能改善GA。有没有关于此的研究?
我理解其背后的原因:交叉允许将两个人的优势合并为一个人。但对我来说,就像说我们可以交配科学家和美洲虎来获得智能和快速的混合动力。
编辑:在mcdowella的回答中,他提到了如何找到一个案例,从多个起点爬山可以改善交叉是非常重要的。有人可以详细说明这一点吗?
答案 0 :(得分:17)
强烈取决于搜索空间的平滑度。如果每个“基因组”在用于生成“现象”之前进行哈希处理,那么你就会进行随机搜索。
不太极端的情况,这就是为什么我们经常在GA中使用灰色代码整数。
您需要根据编码定制交叉和变异函数。如果你对它们进行无情的计算,那么很容易衰变。如果A和B的交叉不会产生像A样和B样的东西那么它就没用了。
基因组长3位,位0确定它是陆地栖息还是海洋居住。比特1-2描述了陆栖生物的消化功能和海栖生物的视觉能力。
考虑两个陆居生物。
| bit 0 | bit 1 | bit 2
----+-------+-------+-------
Mum | 0 | 0 | 1
Dad | 0 | 1 | 0
他们可能会在第1和第2位之间交叉,从而产生一个孩子,其消化功能在妈妈和爸爸之间有所妥协。大。
如果位0没有改变,这种交叉似乎是明智的。如果是,那么你的交叉功能已经将某种胆量变成某种眼睛。呃......哇?它可能也是随机突变。
提出DNA如何解决这个问题的问题。嗯,它既是模态的又是层次的。有大部分可以改变很多而没有太大影响,在其他部分,单个突变可以产生剧烈的影响(如上面的第0位)。有时,X的值会影响由Y引导的行为,并且X的所有值都是合法的并且可以被探索,而对Y的修改会使动物发生段错误。
GA的理论分析通常使用极粗编码,并且它们比语义更容易受到数值问题的影响。
答案 1 :(得分:8)
我的印象是,从多个随机开始爬山是非常有效的,但试图找到交叉可以改善的情况是非常重要的。一个参考文献是DavidIcl˘anzan的“Crossover:The Divine Afflatus in Search”,其中指出
传统的GA理论以构建模块假设为支柱 (BBH)指出遗传算法(GA)通过发现工作, 强调和重新组合高质量的低阶图式 字符串,以强烈的并行方式。历史上,尝试 捕捉拓展健身景观的特征,这是一个例证 这个直观直接的过程,大部分都是 不成功。已有基于人群的重组方法 在特别设计的抽象测试套件上反复表现优异, 通过基于突变的算法的不同变体。
一篇相关的论文是“通过爬山来克服等级难度” 建筑砌块结构“由DavidIclănzan和Dan Dumitrescu撰写,其中说明了
构建模块假设表明遗传算法(GA) 非常适合有效解决的等级问题 需要适当的问题分解和解决方案的组装 具有强非线性相互依赖性的子解决方案。论文 提出了一个在积木(BB)空间运行的登山者 这可以有效地解决分层问题。
答案 2 :(得分:8)
你对交叉操作持怀疑态度是正确的。有一篇论文叫做 “关于交叉在模拟进化优化中的有效性”(Fogel和Stayton,Biosystems 1994)。它在1免费提供。
顺便说一下,如果你还没有我推荐一种名为“差异进化”的技术。它可以很好地解决许多优化问题。
答案 3 :(得分:4)
通过交叉和再现......那些具有高于平均水平的性能和短定义长度的模式将以指数级增长率进行采样。
另一个很好的参考可能是Ankenbrandt的“对趋同理论的扩展和遗传算法的时间复杂性的证明”(在Rawlins的“遗传算法的基础”中)。
我很惊讶你在工作中对交叉的力量并不明显;当我开始使用遗传算法并看到有力的“定向”交叉看起来如何时,我觉得我已经深入了解了进化,这推翻了我在学校所教的内容。所有关于“突变怎么会导致这个和那个?”的问题。并且“好吧,在这么多代人的过程中......”似乎从根本上被误导了。
答案 4 :(得分:1)
交叉和变异!!实际上两者都是必要的。 Crossover是一个探索性的算子,但突变是一种剥削性的算法。考虑到解决方案的结构,问题和优化率的可能性,选择Pc和Pm的正确值(交叉和突变的概率)非常重要。
检查此GA-TSP-Solver,它使用了许多交叉和变异方法。您可以测试任何交叉以及给定概率的突变。
答案 5 :(得分:0)
它主要取决于搜索空间和您使用的交叉类型。对于一些问题,我发现在开始时使用交叉,然后突变,它将加快寻找解决方案的过程,但这不是一个很好的方法,因为我最终会找到类似的解决方案。如果我们同时使用交叉和变异,我通常会获得更好的优化解决方案。然而,对于某些问题,交叉可能是非常具有破坏性的。
单独的遗传算子不足以解决大型/复杂问题。当您的操作员不改进您的解决方案时(因此当他们不提高适应度值时),您应该开始考虑其他解决方案,例如渐进式演变等。