zoukankan      html  css  js  c++  java
  • DE-Differential Evolution差分进化算法

    差分进化算法相对于遗传算法而言,相同点都是通过随机生成初始种群,以种群中每个个体的适应度值为选择标准,主要过程也都包括变异、交叉和选择三个步骤,和遗传算法几乎一致流程,只是细微变异选择操作不同。

    不同之处在于遗传算法是根据适应度值来控制父代杂交,变异后产生的子代被选择的概率值,在最大化问题中适应值大的个体被选择的概率相应也会大一些。而差分进化算法变异向量是由父代差分向量生成,并与父代个体向量交叉生成新个体向量,直接与其父代个体进行选择。显然差分进化算法相对遗传算法的逼近效果更加显著

    种群初始化:

    在每个维度的区间内,随机的产生相应初始解

    变异:

    在第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),否则不变保留:

    附经典伪代码:

    附自己实现的代码:

    https://github.com/425776024/DE/tree/master/src

  • 相关阅读:
    mysql 往表中insert的时候如何让主键id按当前表的最大值自动增长?
    visual studio 2013 win7安装笔记
    mysql奇葩之旅
    java JVM常见的四大异常及处理方案
    DDR3_旧版(2):初始化
    DDR3_旧版(1):IP核调取
    【转】AXI_Lite 总线详解
    ZYNQ笔记(7):AXI从口自定义IP封装
    ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断
    ZYNQ笔记(5):软中断实现核间通信
  • 原文地址:https://www.cnblogs.com/onenoteone/p/12441768.html
Copyright © 2011-2022 走看看