差异进化(DE)和遗传算法(GA)之间的区别之一是DE丢弃一个新的候选人,除非它比它所得到的旧候选人更合适,而GA允许"不太适合" ;候选人以一定的概率生存。最初DE的方法听起来是个好主意,但我相信这可以防止它解决以下类别的问题。
想象一下,我们正努力将健身得分最大化:
A - [max(0, A - 50) * B] + [max(0, A - 75) * 2 * B]
其中参数范围从0
到100
。
A
是有益的,直到达到50
。B
设置为零是有益的。A
增加到75是有益的。B
和A
。最后一点非常重要:如果A
或B
相互独立地增加,则健身分数会下降。
回到差分进化算法,我不知道如何解决上述问题,因为最初我们只想改变每一代的一个参数,但最终我们想要改变每代的多个参数。如果我们过早地改变每代的多个参数,我们就会降低生存概率,从而降低进化速度。但是,如果我们一次改变一个参数,我们永远不会找到全局最大值。
我的问题如下:
我不是要求解决上面提到的具体功能。我问的是,差异进化是否有可能解决你不知道在任何给定时间需要改变多少参数并且你想要尽可能接近全局最大值的问题。
答案 0 :(得分:1)
DE是一种流行的优化元启发式,具有大量变体(一些示例here)。
第一个DE是由于R. Storn和K. Price(1997)。从那以后,人们提出了主要运营商,杂交,自动参数调整,自适应方案,结构化群体等方面的许多变化。
因此,对问题的准确答案需要更多关于您所指的DE风味的详细信息。
无论如何,DE的典型方案是:
g = 0 // Generation 0
P(g) = {x_1(g), ... , x_n(g)} // Population initialization
while (!stop()) // Some stop condition
for i = 1 to n
y_i = new_mutant(X(g))
z_i = crossover(x_i(g), y_i)
if f(z_i) < f(x_i(g))
x_i(g + 1) = z_i
else
x_i(g + 1) = x_i(g)
++g
crossover()
函数的常见选择是二项式交叉(类似于GA uniform crossover):
if (random(0,1) < CR || j == 0)
z_i[j] = y_i[j]
else
z_i[j] = x_i[j]
(所描述的策略通常称为 rand1bin )
通常从突变体载体中取出一种以上的组分(和至少一种)。
从进化的开始到结束,DE产生的后代有一个或两个参数A
/ B
变异(这是通过CR
控制的)
这不是一个问题,因为DE是基于人口的算法:个人的“最终”是另一个人的“初始”。
rand1bin ,尤其是一个很好的探索策略,初始人口利用参数的完整数值范围(例如示例中的[0, 100]
)避免描述的问题。
在我看来,修改的顺序可能仅适用于人口较少或人口初始受到不必要限制的人群。
使用 rand1bin / best1bin 和少数人群(20个人,即10 x number of parameters
)的各种模拟确认特定功能不是“硬”且全球最大值定期在120代内发现。