DE–A Simple and Efficient Heuristic for Global Optimization over Continuous Spaces
0、论文背景
本文探讨了在非线性且不可微的连续空间中寻求最小化目标函数可能性的一种新启发式优化策略,并具体而言即为差分进化算法。
Differential evolution represents a straightforward and highly effective approach for achieving global optimization within continuous domains. It is featured in the journal "Journal of Global Optimization," published in the year 1997, issue number four of volume eleven, spanning pages three hundred forty-one to three hundred fifty-nine.

1、介绍
本文主要阐述了差分进化算法的核心理念,并对其它全局优化方法进行了系统性对比分析。通过对比分析发现,在解决复杂优化问题时,该方法展现出显著的优势。本文着重对差分进化的原理和应用进行了深入探讨,并未涉及其它优化算法的详细解读。
用户通常要求一个实用的最小化技术应该满足五个要求:
- 支持处理不可微、非线性和多模态的成本函数。
 - 通过并行计算实现对计算密集型任务的成本函数处理。
 - 采用少量控制参数来进行优化,并且这些参数具有稳定性且易于选择。
 - 具有良好的收敛性。
 
Differential evolution:
- 为了满足要求1而使DE采用一种随机直接搜索的方法。
 - DE借助一个种群向量得以实现对要求2的满足,并且其中进行随机扰动的操作能够独立完成。
 - DE采用了自组织机制,在使用两个被随机选择出来的种群个体计算其差分后形成的差分子空间中进行操作,并且对每一个存在的种群个体都进行了这样的处理。
 - 经过一系列后续实验测试后发现,在收敛速度和优化效果等方面均表现优异。
 
2、Differential evolution
差分进化(DE)是一种基于N个D维编码个体的平行直接搜索技术,其中G代表迭代代数。

DE通过调整两个输入向量之间的加权差异并将其添加到第三个向量中以实现新的参数向量 的更新。其名称被称为突变
变异算子
2.1 突变
对于每一个向量:

生成一个突变向量:


r1、r2和r3选择为与i不同 ;F是[0,2]之间,主要是控制参数向量的突变程度。
还有一种形式:

当种群向量NP的数量达到一定程度时,在采用两个差分向量的过程中可能会显著提升种群的多样性水平
2.2 交叉
为了增加突变向量的多样性,引入了交叉的方法。得到试验向量:

试验向量通过如下方式获得:

randb(j)属于区间[0,1]。交叉常量CR属于区间[0,1]。为了确保在迭代过程中u_{i,G+1}至少继承v_{i,G+1}中的一个参数值,在定义rnbr(i)时我们设定了rnbr(i)∈{1,2,…,D}。
图形的形象表示:

2.3 选择
当向量所产生的成本函数值低于x_{i,G}时,则令x_{i,G+1}=u_{i,G+1};否则,则维持原值不变。
整个算法的伪代码流程图:

3、算法的个人复现和简单实验
 clear;clc;clearvars;
    
 % 初始化变量维度,种群数,最大迭代次数,搜索区间,F,CR
    
 dim = 5;
    
 popsize = 50;
    
 maxIteration = 1000;
    
 LB = -5.12 * ones(1, dim);
    
 UB = 5.12 * ones(1, dim);
    
 F = 1;
    
 CR = 0.9;
    
 [globalBest, globalBestFitness, FitnessHistory] = DE(popsize, maxIteration,dim, LB, UB, F, CR, @(x)Fun(x));
    
 disp(globalBestFitness);
    
 disp(globalBest);
    
 plot(FitnessHistory);
         function y = Fun(x)
    
 %d = length(x);%[-30,30]
    
 %y = -20*exp(-0.02*sqrt((sum(x.^2))/d)) - exp(sum(cos(2*pi*x))./d)+20+exp(1);  
    
 y = sum(x.^2);%[-5.12,5.12]
    
 end
         function [globalBest, globalBestFitness, FitnessHistory] = DE(popsize, maxIteration,dim, LB, UB, F, CR, Fun)
    
 % 种群的初始化和计算适应度值
    
 Sol(popsize, dim) = 0; % Declare memory.
    
 Fitness(popsize) = 0;
    
 for i = 1:popsize
    
     Sol(i,:) = LB+(UB-LB).* rand(1, dim);
    
     Fitness(i) = Fun(Sol(i,:));
    
 end
    
  
    
 % 获得全局最优值以及对应的种群向量
    
 [fbest, bestIndex] = min(Fitness);
    
 globalBest = Sol(bestIndex,:); 
    
 globalBestFitness = fbest; 
    
  
    
 % 开始迭代
    
 for time = 1:maxIteration
    
     for i = 1:popsize
    
     % 突变
    
     %r = randperm(popsize, 3);  
    
     r = randperm(popsize, 5);   %在1~pop中随机选择5个数组成一个数组,使用两个差分变量进行扰动
    
     mutantPos = Sol(r(1),:) + F * (Sol(r(2),:) - Sol(r(3),:)) ...
    
         + F * (Sol(r(4),:) - Sol(r(5),:));
    
     
    
     % 交叉
    
     jj = randi(dim);  % 选择至少一维发生交叉
    
     for d = 1:dim
    
         if rand() < CR || d == jj
    
             crossoverPos(d) = mutantPos(d);
    
         else
    
             crossoverPos(d) = Sol(i,d);
    
         end
    
     end
    
     
    
     % 检查是否越界.
    
     crossoverPos(crossoverPos>UB) = UB(crossoverPos>UB); 
    
     crossoverPos(crossoverPos<LB) = LB(crossoverPos<LB);
    
     
    
     evalNewPos = Fun(crossoverPos);% 将突变和交叉后的变量重新评估
    
     % 小于原有值就更新
    
     if evalNewPos < Fitness(i)
    
         Sol(i,:) = crossoverPos;
    
         Fitness(i) = evalNewPos;
    
     end
    
     end
    
     [fbest, bestIndex] = min(Fitness);
    
     globalBest = Sol(bestIndex,:);
    
     globalBestFitness = fbest;
    
     
    
     % 存储每次迭代的最优值.
    
     FitnessHistory(time) = fbest;
    
 end
    
 end
        

如有错误还请批评改正!
