差分进化算法 DE(Differential Evolution)

1.算法介绍

  差分进化算法是一种启发式方法,用于最优化可能的非线性和不可微的连续空间函数。通过一个广泛的测试平台,证明了新方法比许多其他著名的全局优化方法收敛得更快,且更有把握。新方法需要的控制变量少,鲁棒性好,且易于使用,非常适合进行并行计算。

2.算法实现步骤

2.1变异

  i是第几个个体,G是第几代,F是一个系数,取(0,1)时V减小,取(1,2)时放大。

根据这个公式可以看到 Vi,G+1是F*(Xr2,G-Xr3,G)+Xr1,G,根据向量的加减,可以在二维平面上大致画出Vi,G+1(变异向量)

2.2交叉

其中的两个比较的参数都是随机生成,判断条件可以使其选择不同的结果,确保参数的多样性

2.3选择

2.4DE其他变体

3.MATLAB 使用DE求解函数最优值

function DE(Gm,F0)  
  
t0 = cputime;  
%差分进化算法程序  
%F0是变异率 %Gm 最大迭代次数  
Gm = 10000;  
F0 = 0.5;  
Np = 100;  
CR = 0.9;  %交叉概率  
G= 1; %初始化代数  
D = 10; %所求问题的维数  
Gmin = zeros(1,Gm); %各代的最优值  
best_x = zeros(Gm,D); %各代的最优解  
value = zeros(1,Np);  
  
%产生初始种群  
%xmin = -10; xmax = 100;%带负数的下界  
xmin = -5.12;  
xmax = 5.12;  
function y = f(v)  
    %Rastrigr 函数  
y = sum(v.^2 - 10.*cos(2.*pi.*v) + 10);  
end  
  
X0 = (xmax-xmin)*rand(Np,D) + xmin;  %产生Np个D维向量  
XG = X0;  
  
%%%%%%%%%%%%%----这里未做评价,不判断终止条件----%%%%%%%%%%%%%%%%%%%%%%%%  
  
XG_next_1= zeros(Np,D); %初始化  
XG_next_2 = zeros(Np,D);  
XG_next = zeros(Np,D);  
  
while G <= Gm   
G   
%%%%%%%%%%%%%%%%%%%%%%%%----变异操作----%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
    for i = 1:Np  
        %产生j,k,p三个不同的数  
        a = 1;  
        b = Np;  
        dx = randperm(b-a+1) + a- 1;  
        j = dx(1);  
        k = dx(2);  
        p = dx(3);  
        %要保证与i不同  
        if j == i  
            j  = dx(4);  
            else if k == i  
                 k = dx(4);  
                else if p == i  
                    p = dx(4);  
                    end  
                end  
         end  
          
        %变异算子  
        suanzi = exp(1-Gm/(Gm + 1-G));  
        F = F0*2.^suanzi;  
        %变异的个体来自三个随机父代  
         
        son = XG(p,:) + F*(XG(j,:) - XG(k,:));         
        for j = 1: D  
            if son(1,j) >xmin  & son(1,j) < xmax %防止变异超出边界  
                XG_next_1(i,j) = son(1,j);  
            else  
                XG_next_1(i,j) = (xmax - xmin)*rand(1) + xmin;  
            end  
        end  
    end  
   %%%%%%%%%%%%%%%%%%%%%%%---交叉操作----%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
      
      
    for i = 1: Np  
        randx = randperm(D);% [1,2,3,...D]的随机序列     
        for j = 1: D  
              
            if rand > CR & randx(1) ~= j % CR = 0.9   
                XG_next_2(i,j) = XG(i,j);  
            else  
                XG_next_2(i,j) = XG_next_1(i,j);  
            end  
        end  
    end  
      
    %%%%%%%%%%%%%%%%%%----选择操作---%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
    for i = 1:Np  
        if f(XG_next_2(i,:)) < f(XG(i,:))  
              
            XG_next(i,:) = XG_next_2(i,:);  
        else  
            XG_next(i,:) = XG(i,:);  
        end  
    end  
      
    %找出最小值  
    for i = 1:Np  
        value(i) = f(XG_next(i,:));  
    end  
    [value_min,pos_min] = min(value);  
      
    %第G代中的目标函数的最小值  
    Gmin(G) = value_min;     
    %保存最优的个体  
    best_x(G,:) = XG_next(pos_min,:);     
      
    XG = XG_next;      
    trace(G,1) = G;  
    trace(G,2) = value_min;  
    G = G + 1;  
    
end  
  [value_min,pos_min] = min(Gmin);  
  best_value = value_min  
  best_vector =  best_x(pos_min,:)    
  fprintf('DE所耗的时间为:%f \n',cputime - t0);  
  %画出代数跟最优函数值之间的关系图    
  plot(trace(:,1),trace(:,2));  
    
end  

差分进化算法DE_hehainan_86的博客-CSDN博客

[1] Rainer Storn(1);Kenneth Price(2).Differential Evolution – A Simple and Efficient Heuristic for global Optimization over Continuous Spaces[J].Journal of Global Optimization.1997,Vol.11(NO.4):341-359.

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森屿~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值