• Making a Difference to Differential Evolution


    0、论文背景

    差分进化(Differential Evolution)和进化规划(Evolutionary Programming)是进化计算中的两种主要算法。它们已成功地应用于许多真实世界的数值优化问题。社区搜索(Neighborhood Search)是支撑EP的主要策略,目前已经对不同的NS操作符(高斯随机数和柯西随机数)的特征进行了分析。虽然DE可能与EP的进化过程相似,但它缺乏邻域搜索的相关概念。本章提出了基于邻域搜索的NSDE。NSDE中的NS操作符可以显著提高NSDE的搜索步长和种群的多样性,而不依赖于任何关于搜索空间的先验知识 。

    Yang Z, Yao X, He J. Making a difference to differential evolution[M]//Advances in metaheuristics for hard optimization. Springer, Berlin, Heidelberg, 2007: 397-414.

    1、EP

    进化规划(EP)进行的优化可以归纳为两个主要步骤:首先突变当前种群中的解,然后从突变的解和当前的解中选择下一代。

    传统进化规划(CEP)的突变过程如下:

    \large \begin{array}{c} \boldsymbol{x}_{i}^{\prime}(j)=\boldsymbol{x}_{i}(j)+\boldsymbol{\eta}_{i}(j) N_{j}(0,1) \\ \boldsymbol{\eta}_{i}^{\prime}(j)=\boldsymbol{\eta}_{i}(j) \exp \left(\tau^{\prime} N(0,1)+\tau N_{j}(0,1)\right) \end{array}

    其中,i{1,,μ}i{1,,μ}μμ是种群大小;j{1,,n}j{1,,n},n是种群变量维度。上述也称古典进化规划(CEP)。

    将柯西突变代替高斯突变,得到了快速进化规划(FEP):

    \large \boldsymbol{x}_{i}^{\prime}(j)=\boldsymbol{x}_{i}(j)+\boldsymbol{\eta}_{i}(j) \delta_{j}

    其中,对于每一个个体的每一维变量,δj是一个尺度参数t=1的柯西随机变量。使用柯西突变的EP被称为快速进化规划(FEP)。

    2、NSDE

    有关DE,参见博客:DE,有关柯西分布,参见博客:柯西分布

    DE的流程如下:

    有n维向量xii{1,,NP},NP是种群的大小。

    第一步:变异。

    \large \mathbf{v}_{\mathbf{i}}=\mathbf{x}_{\mathbf{i}_{1}}+F \cdot\left(\mathbf{x}_{\mathbf{i}_{2}}-\mathbf{x}_{\mathbf{i}_{3}}\right)

    \large i, i_{1}, i_{2}, i_{3} \in[1, N P]

    一个较大的F值会增加逃离局部最优的概率。然而,它也增加了突变的扰动,从而降低了DE的收敛速度。 

    第二步:交叉。

    \large \mathbf{u}_{\mathbf{i}}(j)=\left\{\begin{array}{ll} \mathbf{v}_{\mathbf{i}}(j), & \text { if } U_{j}(0,1)<C R \text { or } j=j_{\text {rand }} \\ \mathbf{x}_{\mathbf{i}}(j), & \text { otherwise. } \end{array}\right.

    第三步:选择。

    \large \mathbf{x}_{\mathbf{i}}^{\prime}=\left\{\begin{array}{ll} \mathbf{u}_{\mathbf{i}}, & \text { if } f\left(\mathbf{u}_{\mathbf{i}}\right)<f\left(\mathbf{x}_{\mathbf{i}}\right) \\ \mathbf{x}_{\mathbf{i}}, & \text { otherwise } \end{array}\right.

    而本文提出的NSDE,与之前DE唯一不同的地方在于变异这一过程。DE中固定的常量变为了NS操作符(高斯随机数和柯西随机数):

    \large \boldsymbol{y}_{i}=\boldsymbol{x}_{i_{1}}+\left\{\begin{array}{ll} \boldsymbol{d}_{i} \cdot N(0.5,0.5), & \text { if } U(0,1)<0.5 \\ \boldsymbol{d}_{i} \cdot \delta, & \text { otherwise } \end{array}\right.

    为什么要采用NS操作符代替F呢?简而言之:显著提高NSDE的搜索步长和种群的多样性,而不依赖于任何关于搜索空间的先验知识 。最终达到寻得更好的全局最优值以及加快收敛的目的。

    那么高斯随机数和柯西随机数有什么特点呢?

    \large \begin{array}{l} P(l<L)=\int_{-L}^{+L} f_{\psi}(x) \mathrm{d} x \\ P(l>L)=\int_{-\infty}^{-L} f_{\psi}(x) \mathrm{d} x+\int_{+L}^{+\infty} f_{\psi}(x) \mathrm{d} x \end{array}

    fψ(x)就是各自的概率密度函数。

    柯西随机数与高斯随机数最大的不同在于,柯西随机数产生的值范围更广,产生较大值的概率比高斯随机数高;而高斯随机数产生的值范围较窄,相对局部。 

    所以一般情况下,柯西算子在远离全局最优时表现更好,而高斯算子在一个较好的区域内寻找局部最优时表现更好。而为了结合上述二者的特点,由此提出了上述变异等式。

    3、算法的个人实现以及简单实验

    DE的实现上述DE有关的博客有提到过,就不展示了。

    NSDE代码实现:

    1. function [globalBest, globalBestFitness, FitnessHistory] = NSDE(popsize, maxIteration,dim, LB, UB, CR, Fun)
    2. % 种群的初始化和计算适应度值
    3. Sol(popsize, dim) = 0; % Declare memory.
    4. Fitness(popsize) = 0;
    5. for i = 1:popsize
    6. Sol(i,:) = LB+(UB-LB).* rand(1, dim);
    7. Fitness(i) = Fun(Sol(i,:));
    8. end
    9. % 获得全局最优值以及对应的种群向量
    10. [fbest, bestIndex] = min(Fitness);
    11. globalBest = Sol(bestIndex,:);
    12. globalBestFitness = fbest;
    13. % 开始迭代
    14. for time = 1:maxIteration
    15. for i = 1:popsize
    16. % 突变
    17. r = randperm(popsize, 3); %在1~pop中随机选择5个数组成一个数组
    18. r1 = rand();
    19. if r1 > 0.5
    20. pd = makedist('tLocationScale','mu',0,'sigma',1,'nu',1);
    21. F = random(pd,1,1);%生成1个柯西随机数
    22. else
    23. F = normrnd(0.5,0.5);%生成1个高斯随机数
    24. end
    25. mutantPos = Sol(r(1),:) + F * (Sol(r(2),:) - Sol(r(3),:));
    26. % 交叉
    27. jj = randi(dim); % 选择至少一维发生交叉
    28. for d = 1:dim
    29. if rand() < CR || d == jj
    30. crossoverPos(d) = mutantPos(d);
    31. else
    32. crossoverPos(d) = Sol(i,d);
    33. end
    34. end
    35. % 检查是否越界.
    36. crossoverPos(crossoverPos>UB) = UB(crossoverPos>UB);
    37. crossoverPos(crossoverPos
    38. evalNewPos = Fun(crossoverPos);% 将突变和交叉后的变量重新评估
    39. % 小于原有值就更新
    40. if evalNewPos < Fitness(i)
    41. Sol(i,:) = crossoverPos;
    42. Fitness(i) = evalNewPos;
    43. end
    44. end
    45. [fbest, bestIndex] = min(Fitness);
    46. globalBest = Sol(bestIndex,:);
    47. globalBestFitness = fbest;
    48. % 存储每次迭代的最优值.
    49. FitnessHistory(time) = fbest;
    50. end
    51. end

    进行简单的实验:

    1. clear;clc;clearvars;
    2. % 初始化变量维度,种群数,最大迭代次数,搜索区间,F,CR
    3. dim = 20;
    4. popsize = 100;
    5. maxIteration = 1000;
    6. LB = -5.12 * ones(1, dim);
    7. UB = 5.12 * ones(1, dim);
    8. F = 1;
    9. CR = 0.9;
    10. [globalBest, globalBestFitness, FitnessHistory] = DE(popsize, maxIteration,dim, LB, UB, F, CR, @(x)Rastrigin(x));
    11. [globalBest1, globalBestFitness1, FitnessHistory1] = NSDE(popsize, maxIteration,dim, LB, UB, CR, @(x)Rastrigin(x));
    12. plot(FitnessHistory);
    13. hold on;
    14. plot(FitnessHistory1);
    15. legend('DE','NSDE','Location', 'northeast');

    Rastrigin函数的测试结果:

    Grtiewank函数的测试结果:

    Ackley函数的测试结果:

    综上所述,NSDE无论在优化效果上,还是在收敛性上,均远远优于DE。

    如有错误,还望批评改正, 

  • 相关阅读:
    Transformer
    BGP路由协议学习一
    iOS_Crash 四:的捕获和防护
    GE IS420UCSBH1A 自动化控制模块
    centos7基础操作
    java-php-net-python-代驾网站计算机毕业设计程序
    用Java写一个贪吃蛇游戏
    【基础】Springboot处理事务@Transactional
    web网页设计——体育气步枪射击主题(5页面)带图片轮播特效(HTML+CSS) ~学生网页设计作业源码
    GEE错误——Tile error: Arrays must have same lengths on all axes but the cat axis
  • 原文地址:https://blog.csdn.net/qq_42148307/article/details/127691635