标准差分进化算法(DE)

一、前言
之前提到过PSO算法,它作为进化算法的入门算法,具有参数少,实现简单,收敛性强的特点。但是,“早熟”这一特点在PSO算法中最为致命,它使得算法极容易陷入局部最优,算法性能也会因此而急剧下降。因此,差分进化算法(DE)应运而生,同样的,DE也是一种基础算法,但是它的多样性更强,不容易出现早熟现象,在一般优化中更加实用。

二、算法流程
1.初始化种群,评价出适应度值,并找出全局最优位置与最优适应度值。
2.进入优化,generation+1。
3.变异。为了保证多样性,变异中需要选择的随机粒子不应与当前更新粒子相同。变异策略通常有以下5种:
变异向量V,F为缩放因子,通常设置为0.5。
(1)DE/rand/1
在这里插入图片描述
上式中有三个随机位置,r1,r2,r3是不等于i的不相同的随机数,种群多样性提高,相应的,其收敛性会降低。

(2)DE/best/1
在这里插入图片描述
Xbest是种群最优位置,在上式中有着指导作用,能够提升粒子的收敛性。

(3)DE/rand-to-best/1
在这里插入图片描述
个人认为,上式在多样性和收敛性之间的制衡效果较好。两个随机位置用于开发,最优位置用来指导。它能适用于一般优化问题,但是对于大规模优化这种需要强收敛效果的问题可能不太适用。

(4)DE/best/2
在这里插入图片描述
(5)DE/rand/2
在这里插入图片描述
上式包含5个不同的随机粒子,种群的开发能力较强,提高了种群多样性。

4.交叉。U为交叉向量,CR是交叉概率。CR的值越大,发生交叉的概率越大,通常CR=0.3。
(1)二项式交叉

      %NP:种群个数;Dim:维度;V:变异向量;U:交叉向量;
        for i=1:NP         
            jRand=randi([1,Dim]);  %jRand∈[1,Dim]
            for j=1:Dim
                k=rand;
                if k<=CR||j==jRand 
                 %j==jRand是为了确保至少有一个U(i,j)=V(i,j)
                    U(i,j)=V(i,j);
                else
                    U(i,j)=X(i,j);
                end     
            end    
        end

(2)指数交叉

       for i=1:NP
            j=randi([1,Dim]);%j∈[1,Dim]
            L=0;
            U(i,:)=X(i,:);
            k=rand;
            while(k<CR && L<Dim)
                U(i,j)=V(i,j);
                j=j+1;
                if(j>Dim)
                    j=1;
                end
                L=L+1;
            end
       end

5.评价进化的新粒子U,适应度值为fitnessU,根据U的适应度值的高低载进行以下筛选。

        if fitnessU(i)<fitnessX(i)
            X(i,:)=U(i,:);
            fitnessX(i)=fitnessU(i);
       end

6.更新最佳位置及适应度值,进入下一代循环stesp2。

三、总结
DE算法的实现比较简单,算法的灵活性较强,不同方法的变异交叉会有不同的实验效果。对于DE算法的改进也非常多,很多改进方法使得其性能突飞猛进,个人认为是一个比较普遍且适应性强的一个基础算法。

发布了7 篇原创文章 · 获赞 8 · 访问量 2529
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览