何时以及为什么交叉有利于差异进化?

时间:2014-01-19 18:43:57

标签: r optimization evolutionary-algorithm differential-evolution

我为我正在做的边项目实现了差分进化算法。因为交叉步骤似乎涉及许多参数选择(例如交叉概率),所以我决定跳过它并仅使用突变。该方法似乎工作正常,但我不确定如果我引入交叉,我是否会获得更好的性能。

主要问题:将分频引入差异进化背后的动机是什么?你能提供一个玩具示例,其中引入交叉优于纯变异吗?

我的直觉是,交叉会在二维中产生类似下面的内容。说 我们有两个父矢量(红色)。均匀交叉可以在其中一个蓝点产生新的试验载体。

我不确定为什么这种探索预计会有益。事实上,如果高适应度解决方案遵循一些线性趋势,这似乎会使性能变差。在下图中,假设红点是当前的总体,最佳解决方案是在右下角。人口正在山谷中行进,使得右上角和左下角产生不良解决方案。左上角产生“好”但不是最理想的解决方案。注意均匀交叉如何产生与改进方向正交的试验(蓝色)。我使用了1的交叉概率和忽略的变异来说明我的观点(见代码)。我想这种情况可能会在优化问题中频繁出现,但可能会误解某些内容。

注意:在上面的例子中,我隐含地假设群体在这个空间中被随机初始化(均匀),并且开始收敛到中央山谷下方的正确解(左上角)到右下角。)

这个玩具示例是凸的,因此差异演化甚至不是合适的技术。然而,如果这个主题嵌入在多模态健身景观中,那么交叉似乎可能是有害的。虽然交叉确实支持探索,这可能是有益的,但我不确定为什么人们会选择在这个特定的方向进行探索。

以上示例的R代码:

N = 50

x1 <- rnorm(N,mean=2,sd=0.5)
x2 <- -x1+4+rnorm(N,mean=0,sd=0.1)
plot(x1,x2,pch=21,col='red',bg='red',ylim=c(0,4),xlim=c(0,4))

x1_cx = list(rep(0, 50))
x2_cx = list(rep(0, 50))
for (i in 0:N) {
  x1_cx[i] <- x1[i]
  x2_cx[i] <- x2[sample(1:N,1)]
}

points(x1_cx,x2_cx,pch=4,col='blue',lwd=4)

后续问题:如果在某些情况下交叉是有益的,是否有合理的方法来a)确定您的特定问题是否会受益于交叉,以及b)如何调整交叉参数优化算法?

相关的stackoverflow问题(我正在寻找更具体的内容,例如玩具示例):what is the importance of crossing over in Differential Evolution Algorithm?

一个类似的问题,但不是特定于差异进化:Efficiency of crossover in genetic algorithms

3 个答案:

答案 0 :(得分:6)

我对DE算法的具体细节并不是特别熟悉,但一般来说,交叉点是如果你有两个非常不同的高适应度的个体,它会产生一个介于它们之间的后代而不是特别相似。突变只探讨每个人的当地社区,而不考虑其他人口。如果您将基因组视为某些高维向量空间中的点,则突变会随机方向移动。因此,突变需要采取一些小步骤,因为如果你从一个明显优于随机的位置开始,随机方向的长步骤几乎肯定会使事情变得更糟,因为它基本上只是将熵引入进化的基因组。您可以将交叉视为从父母一方到另一方的一个步骤。由于另一个父母也比随机更好,因此更有希望在这个方向上迈出更长的一步。这样可以更快地探索健身景观的有希望的部分。

在真实的生物有机体中,基因组通常以这样的方式组织,即彼此依赖的基因在同一条染色体上紧密相连。这意味着交叉不太可能破坏协同基因组合。真正的进化实际上会移动基因来实现这一点(虽然这比单个基因的进化要慢得多),有时基因组的高阶结构(DNA的三维形状)也会发展,以防止特别敏感区域的交叉。这些机制很少在进化算法中建模,但如果您以一种可能相互接近的基因的方式对基因组进行排序,您将获得更多的交叉。

答案 1 :(得分:1)

正如Daniel所说,跨越是一种在问题环境中采取更大步骤的方法,允许您逃避单个突变无法实现的局部最大值。

是否合适将取决于问题空间的复杂性,基因型如何 - >表型表达起作用(将相关基因紧密结合在一起)等。

更正式地说,这是本地搜索算法中“连接”的概念,提供足够强大的运算符,使本地搜索邻域足够大以逃避本地最小值。

答案 2 :(得分:0)

没有。交叉无用。在那里我说了。 :P

我从未发现需要交叉。人们似乎认为它确实有某种魔力。但它没有(也不能)做任何比简单变异更有用的事情。大突变可用于探索整个问题空间,小突变可用于开发利基。

我读过的所有解释都是(温和地说)令人不满意。交叉只会使您的算法复杂化。尽快放下它。你的生活会更简单。 ....恕我直言。