有人可以解释差异进化方法吗?维基百科definition非常技术性。
一个简单的例子后面会有一个简单的例子,我们将不胜感激:)
答案 0 :(得分:14)
这是一个简化描述。 DE是一种优化技术,它迭代地修改一组候选解决方案,使其收敛到您的最佳功能。
您首先随机初始化您的候选解决方案。然后在每次迭代时,对于每个候选解x,您执行以下操作:
(注意上面的算法非常简单;不要从中编码,在其他地方找到合适的规范)
不幸的是,维基百科的文章缺乏插图。通过图形表示更容易理解,您可以在这些幻灯片中找到一些:http://www-personal.une.edu.au/~jvanderw/DE_1.pdf。
它类似于遗传算法(GA),不同之处在于候选解不被视为二进制字符串(染色体),而是(通常)被视为实数向量。 DE的一个关键方面是突变步长(参见突变的步骤1)是动态的,即它适应您的群体的配置,并且当它收敛时趋于零。这使得DE比GA更不易受遗传漂移的影响。
答案 1 :(得分:9)
回答我自己的问题......
NP
名候选人组成。Xi
=来自当前一代的索引i
(索引范围从0
到NP-1
)的父候选人。也称为目标矢量。D
个参数。Xi(j)
=候选人Xi
中的 j 参数。Xa
,Xb
,Xc
=三位随机家长候选人。(Xb - Xa)
F
=决定人口进化速度的权重。
CR
=发生交叉的可能性。
Xc`
=通过差异突变操作获得的突变载体。也称为供体载体。Xt
= Xi
和Xc`
的孩子。也称为试用载体。for (int i = 0; i<NP; ++i)
i
)do
{
a = random.nextInt(NP);
} while (a == i)
do
{
b = random.nextInt(NP);
} while (b == i || b == a);
do
{
c = random.nextInt(NP);
} while (c == i || c == b || c == a);
Xc` = Xc + F * (Xb - Xa)
Xi
中的每个变量,应用概率为CR
的{{3}}来继承Xc`
;否则,继承自Xi
。必须至少从Xc`
int R = random.nextInt(D);
for (int j=0; j < D; ++j)
{
double probability = random.nextDouble();
if (probability < CR || j == R)
Xt[j] = Xc`[j]
else
Xt[j] = Xi[j]
}
Xt
优于Xi
,则Xt
会替换下一代Xi
。否则,Xi
将保持不变。答案 2 :(得分:4)
DE算法的工作非常简单。 考虑您需要在给定范围内优化(最小化,例如)ΣXi^ 2 (球体模型),例如 [ - 100,100] 。我们知道最小值为0.让我们看看DE的工作原理。
DE是一种基于人口的算法。对于群体中的每个个体,将存在固定数量的染色体(将其视为一组人类和染色体或每个染色体中的基因)。 让我解释一下DE w.r.t上面的函数
我们需要确定种群大小和染色体或基因的数量(命名为参数)。例如,让我们考虑一个大小为4的人群,每个人都有3条染色体(或基因或参数)。让我们称呼个人R1,R2,R3,R4。
第1步:初始化人口
我们需要随机初始化[-100,100]范围内的人口
G1 G2 G3 objective fn value
R1 -> |-90 | 2 | 1 | =>8105
R2 -> | 7 | 9 | -50 | =>2630
R3 -> | 4 | 2 | -9.2| =>104.64
R4 -> | 8.5 | 7 | 9 | =>202.25
使用给定的目标函数计算目标函数值。在这种情况下,它的ΣXi^ 2 。因此对于R1,obj fn值将 -90 ^ 2 + 2 ^ 2 + 2 ^ 2 = 8105 。同样,它适用于所有人。
第2步:突变
修复目标载体,比如说R1,然后随机选择三个其他载体(个体)说例如.R2,R3,R4并执行突变。突变如下进行,
MutantVector = R2 + F(R3-R4)
(矢量可以随机选择,不需要任何顺序)。 F(比例因子/突变常数)在[0,1] 范围内是DE拥有的少数控制参数之一简单来说,它描述了变异向量的不同之处。让我们保持F = 0.5。
| 7 | 9 | -50 |
+
0.5 *
| 4 | 2 | -9.2|
+
| 8.5 | 7 | 9 |
现在执行Mutation将提供以下Mutant Vector
MV = | 13.25 | 13.5 | -50.1 | =>2867.82
第3步:交叉
现在我们有一个目标载体(R1)和一个由R2,R3和R形成的突变载体MV。 R4,我们需要做一个交叉。将R1和MV视为两个父母,我们需要这两个父母的孩子。进行交叉以确定从父母那里获取多少信息。它由交叉率(CR)控制。儿童的每个基因/染色体确定如下,
0和0之间的随机数如果它大于CR,则生成1,然后从突变体(MV)继承目标(R1)的基因。
设置CR = 0.9。由于我们有3条个体染色体,我们需要在0和1之间生成3个随机数。例如,这些数字分别为0.21,0.97,0.8。第一个和最后一个小于CR值,因此孩子的向量中的那些位置将由MV的值填充,第二个位置将由从目标(R1)中获取的基因填充。
靶&GT; |-90 | 2 | 1 |
突变体 - &gt; | 13.25 | 13.5 | -50.1 |
random num - 0.21, => `Child -> |13.25| -- | -- |`
random num - 0.97, => `Child -> |13.25| 2 | -- |`
random num - 0.80, => `Child -> |13.25| 2 | -50.1 |`
Trial vector/child vector -> | 13.25 | 2 | -50.1 | =>2689.57
第4步:选择
现在我们有了孩子和目标。比较两者的obj fn,看哪哪个更小(最小化问题)。选择下一代中的那个人
R1 -> |-90 | 2 | 1 | =>8105
Trial vector/child vector -> | 13.25 | 2 | -50.1 | =>2689.57
显然,孩子更好,所以用孩子替换目标(R1)。所以新的人口将成为
G1 G2 G3 objective fn value
R1 -> | 13.25 | 2 | -50.1 | =>2689.57
R2 -> | 7 | 9 | -50 | =>2500
R3 -> | 4 | 2 | -9.2 | =>104.64
R4 -> | -8.5 | 7 | 9 | =>202.25
此过程将持续到达到所需的世代数或直到我们达到所需的值。希望这会给你一些帮助。