差分进化算法相对于遗传算法而言,相同点都是通过随机生成初始种群,以种群中每个个体的适应度值为选择标准,主要过程也都包括变异、交叉和选择三个步骤,和遗传算法几乎一致流程,只是细微变异选择操作不同。
不同之处在于遗传算法是根据适应度值来控制父代杂交,变异后产生的子代被选择的概率值,在最大化问题中适应值大的个体被选择的概率相应也会大一些。而差分进化算法变异向量是由父代差分向量生成,并与父代个体向量交叉生成新个体向量,直接与其父代个体进行选择。显然差分进化算法相对遗传算法的逼近效果更加显著。
种群初始化:
在每个维度的区间内,随机的产生相应初始解
变异:
在第g次迭代中,从种群中随机选择23个个体(策略不同有所不同):Xp1(g),Xp2(g),Xp3(g)且p1≠p2≠p3≠i,生成的变异向量为:
通常还会依据适应度优越,对Xp1(g),Xp2(g),Xp3(g)进行排序,得到最好:Xb,最差Xw,中等Xm,然后这样计算:
F缩放因子,可以是随机的[0,2]数,也可以按照如下自适应计算:
其它变异策略:(Xbest当前全局最好)
交叉:
其中hi,j是上面变异步骤产生的Hi解的第j维的值,cr为一个取值率,既对第i=1,2,....N维上的值,以<=cr的概率取Hi中的第i维值,以>cr的概率取原先xi的值。最终产生新的解Vi,后面会用有产生的新解Vi,与原先父代解Xi进行对比,淘汰差的。
cr也可以有自适应计算形式:
选择:
既计算适应度/函数值,不失一般性,这里求极小值,f(Vi)<f(Xi)我们就贪心的保留Vi而替换Xi,既Xi的g+1代解Xi(g+1)为Vi(g),否则不变保留:
附经典伪代码:
附自己实现的代码: