我为我正在做的一个副项目实现了一个差分进化算法。因为交叉步骤似乎涉及很多参数选择(例如交叉概率),所以我决定跳过它,只使用突变。该方法似乎工作正常,但我不确定如果我引入交叉是否会获得更好的性能。
主要问题:将交叉引入差异进化的动机是什么?您能否提供一个玩具示例,其中引入交叉优于纯突变?
我的直觉是交叉会在二维中产生类似下面的东西。假设我们有两个父向量(红色)。均匀交叉可以在其中一个蓝点产生一个新的试验向量。
我不确定为什么这种探索会是有益的。事实上,如果高适应度解决方案遵循某种线性趋势,这似乎会使性能变得更糟。在下图中,假设红点是当前人口,最优解在右下角。人口正在沿着山谷移动,因此右上角和左下角会产生不好的解决方案。左上角产生“好的”但次优的解决方案。注意均匀交叉如何产生正交试验(蓝色)向改进的方向发展。我使用了 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问题(我正在寻找更具体的东西,例如一个玩具示例):在差分进化算法中交叉的重要性是什么?
一个类似的问题,但不是特定于差分进化:遗传算法中的交叉效率