差分进化算法

差异演化(Differential Evolution,DE)是一种基于群体差异的演化算法,该算法是Rainer Storn和Kenneth Price在1996年为求解切比雪夫多项式而提出的。差异演化算法在当年首届IEEE演化计算大赛中表现超群,随后在各个领域得到了广泛应用。差分算法的基本思想:应用当前种群个体的差异来重组得到中间种群,然后应用子代个体与父代个体竞争来获得新一代种群。

差异演化算法最新颖的特征是它的变异操作。当选定一个个体后,算法通过在该个体上加上两个个体带权的差来完成变异。算法迭代初期,种群中个体差异大,这样的变异操作会使算法具有较强全局搜索能力;到迭代后期,当趋于收敛,种群中个体差异小,也使得算法具有较强局部搜索能力。这种新颖的变异操作,主要优点有:待定参数少;不易陷入局部最优;收敛速度快。

差分进化算法的主要步骤包括:

(1)群体初始化
(2)变异操作
(3)交叉操作
(4)选择操作

差分算法的过程如下:


举例说明:

求函数f(x,y)=3cos(xy)+x+y的最小值,其中x的取值范围为[-4,4], y的取值范围为[-4,4](多个局部极值的函数)

首先在matlab中绘制出该函数的图像,如下:

x=[-4:0.1:4];
y=x;
[X,Y]=meshgrid(x,y);
[row,col]=size(X);
for l=1:col
    for h=1:row
        z(h,l)=3*cos(X(h,l)*Y(h,l))+X(h,l)+Y(h,l);
    end
end
surf(X,Y,z);
shading interp
绘图如下:


MATLAB实现差分进化算法:

第一步:定义适应度函数

  function value=func2(x)  
  value=3*cos(x(1)*x(2))+x(1)+x(2);  
  end  

第二步:MATLAB主函数程序

%初始化参数设置
clear all;
close all;
clc;
NP=20;     %种群数量
D=2;       %变量的维数
G=100;     %最大进化代数
F=0.5;     %变异算子
CR=0.1;    %交叉算子
Xs=4;      %上限
Xx=-4;     %下限

x=zeros(D,NP);       %初始种群
v=zeros(D,NP);       %变异种群
u=zeros(D,NP);       %选择种群
x=rand(D,NP)*(Xs-Xx)+Xx;  %赋初值

%计算适应度函数值
for m=1:NP
   Ob(m)=func2(x(:,m));
end
trace(1)=min(Ob);
%差分操作
for gen=1:G
     %变异操作
     %r1,r2,r3和m互不相同
     for m=1:NP
        r1=randi([1,NP],1,1);
        while(r1==m)
          r1=randi([1,NP],1,1);
        end
         r2=randi([1,NP],1,1);
         while(r2==m)|(r2==r1)
          r2=randi([1,NP],1,1);
         end
        r3=randi([1,NP],1,1);
         while((r3==m)|(r3==r1)|(r3==r2))
          r3=randi([1,NP],1,1);
         end
         v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3));
     end
     
     %交叉操作
     r=randi([1,NP],1,1);
     for n=1:D
         cr=rand(1);
         if(cr<CR)|(n==r)
           u(n,:)=v(n,:);
         else
            u(n,:)=x(n,:);
         end
     end
     
     %边界条件处理
     %边界吸收
     for n=1:D
       for m=1:NP
           if u(n,m)<Xx
               u(n,m)=Xx;
           end
           if u(n,m)>Xs
               u(n,m)=Xs;
           end
       end
     end
     %选择操作
     for m=1:NP
         Ob1(m)=func2(u(:,m));
     end
     
    for m=1:NP
        if Ob1(m)<Ob(m)      %小于先前的目标值
            x(:,m)=u(:,m);
        end
    end
    for m=1:NP
       Ob(m)=func2(x(:,m));
    end
    trace(gen+1)=min(Ob);
end
    [SortOb,Index]=sort(Ob);
    x=x(:,Index);
    X=x(:,1);          %最优变量
    Y=min(Ob);         %最优值
   disp('最优变量');
   disp(X);
   disp('最优值');
   disp(Y);
  %绘图
  figure
  plot(trace);
  %plot(X,Y,'-ro');
  xlabel('迭代次数');
  ylabel('目标函数值');
  title('DE目标函数曲线');
  

运行结果:



最优变量
   -4.0000
   -3.9467

最优值
  -10.9374


参考文章:

http://blog.csdn.net/zuochao_2013/article/details/71514058

http://blog.csdn.net/u010480899/article/details/73795669

  • 11
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
混沌差分进化算法是一种基于混沌理论和进化算法的优化算法。它结合了混沌搜索的全局搜索能力和差分进化的局部搜索能力,具有较强的优化性能。 首先,混沌差分进化算法引入了混沌序列作为搜索起点,通过混沌序列的无序、周期性和敏感性等特点,可以有效地遍历搜索空间,并实现全局搜索。混沌序列的产生可以根据混沌映射或混沌方程进行,通过不同的混沌参数设置,可以得到不同的混沌序列。 其次,混沌差分进化算法基于差分进化算法,通过提取种群中个体之间的差异信息来进行局部搜索,并实现逐代进化。在算法的每一代中,根据当前的种群信息,通过选择、交叉和变异等操作,生成新的个体,并用新的个体替换原来种群中的个体。通过这样的迭代过程,逐步优化目标函数的值,最终找到最优解。 混沌差分进化算法在多个领域中得到了广泛应用。在工程优化中,它可以用于解决诸如函数优化、参数估计、模型辨识等问题。在机器学习和数据挖掘领域,它可以用于特征选择、参数调优等任务。此外,在信号处理、图像处理、控制系统设计等领域,混沌差分进化算法也展现出了很好的性能。 总的来说,混沌差分进化算法通过结合混沌搜索和差分进化,充分发挥了它们各自的优势,具有较强的全局搜索和局部搜索能力。在优化问题中,它是一种有效的算法,具有较好的性能和应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值