• JADE: Adaptive Differential Evolution withOptional External Archive


    0、论文背景

    本文在DE的基础上,提出了一种新的差分进化(DE)算法JADE,通过实现一种新的突变策略DE/current-to-pbest,采用可选的外部存档参数的自适应更新,来提高优化性能。上述两种操作使种群多样化,并提高了收敛性能。

    Zhang J, Sanderson A C. JADE: adaptive differential evolution with optional external archive[J]. IEEE Transactions on evolutionary computation, 2009, 13(5): 945-958.

     

     1、JADE

    JADE是在DE的基础上提出来的,有关DE,参见博客:DE。JADE采用了DE/current-to-pbest的突变策略,F和CR的值采用外部存档的方式动态自适应更新,JADE算法流程图如下所示。

     

    1.1 DE/current-to-pbest

    DE/current-to-pbest是在DE/current-to-best/1的基础上改进得到的,DE/current-to-best/1:

    \mathbf{v}_{i, g}=\mathbf{x}_{i, g}+F_{i} \cdot\left(\mathbf{x}_{\text {best }, g}-\mathbf{x}_{i, g}\right)+F_{i} \cdot\left(\mathbf{x}_{r 1, g}-\mathbf{x}_{r 2, g}\right)

    但是它有个问题,会出现收敛过早的情况。为了解决这个问题,为了增加突变后种群的多样性,提出了DE/current-to-pbest:

    \mathbf{v}_{i, g}=\mathbf{x}_{i, g}+F_{i}\left(\mathbf{x}_{\text {best }, g}^{p}-\mathbf{x}_{i, g}\right)+F_{i}\left(\mathbf{x}_{r 1, g}-\tilde{\mathbf{x}}_{r 2, g}\right)

    其中x_{\text {best, } g}^{p}被随机选择为当前种群中前100p%的个体之一,p∈(0,1],p决定了突变策略的贪婪性,p越大,突变后种群的多样性越高。而\tilde{\mathbf{x}}_{r 2, g}是从P∪A中随机选择的,引入A也是想提高突变后种群的多样性。

    A为存档的次等解的集合,P为当前的总体。在迭代过程中,在选择过程中失败的种群将被添加到A中。如果存档大小超过了一定的阈值(NP),那么将从存档中随机删除一些解决方案,以保持A(存档)大小在NP。

    1.2 F和CR的自适应

    CR采用正太分布随机数,\mu_{C R}的初始值设置为0.5:

    C R_{i}=\operatorname{randn}_{i}\left(\mu_{C R}, 0.1\right)

    \mu_{C R}的更新为:

    \mu_{C R}=(1-c) \cdot \mu_{C R}+c \cdot \operatorname{mean}_{A}\left(S_{C R}\right)

    其中c是0和1之间的正数,c控制参数自适应的速率。meanA(·)是通常的算术平均值。S_{CR}是每次选择成功后的种群的CR值集合。

    F采用柯西分布随机数,因为与正态分布相比,柯西分布更有利于使突变因子多样化,从而避免了贪婪突变策略中经常发生的过早收敛,\mu _{F}的初始值设置为0.5:

    \mu_{F}=(1-c) \cdot \mu_{F}+c \cdot \operatorname{mean}_{L}\left(S_{F}\right)

    meanL(·)是Lehmer的平均值:

    \operatorname{mean}_{L}\left(S_{F}\right)=\frac{\sum_{F \in S_{F}} F^{2}}{\sum_{F \in S_{F}} F}

    Lehmer均值有助于传播更大的突变因子,而F越大,有助于增加种群多样性,防止过早收敛

    2、算法的复现和简单实验

    有关SaNSDE,请参见博客:SaNSDE

    JADE复现代码:

    1. function [globalBest, globalBestFitness, FitnessHistory] = JADE(popsize, maxIteration,dim, LB, UB, Fun)
    2. Sol(popsize, dim) = 0; % 种群的初始化和计算适应度值
    3. Fitness(popsize) = 0;
    4. for i = 1 : popsize
    5. Sol(i, :) = LB + (UB - LB) .* rand(1, dim);
    6. Fitness(i) = Fun(Sol(i, :));
    7. end
    8. [fbest, bestIndex] = min(Fitness); % 获得全局最优值以及对应的种群向量
    9. globalBest = Sol(bestIndex, :);
    10. globalBestFitness = fbest;
    11. muCR = 0.5; % 相关变量的初始化
    12. muF = 0.5;
    13. A = [];
    14. p = 0.05;
    15. c = 0.2;
    16. for time = 1 : maxIteration
    17. SF = [];
    18. SCR = [];
    19. for i = 1 : popsize
    20. CR = normrnd(muCR, 0.1); % 正太随机数
    21. %pd = makedist('tLocationScale', 'mu', muF, 'sigma', 0.1, 'nu', 1);
    22. % F = random(pd, 1, 1);
    23. F = Cauchy_rand(muF, 0.1); % 柯西随机数
    24. [~, sortIndex] = sort(Fitness); % 随机选择前 popsize * p 对应的 xPBest
    25. sortSol = Sol(sortIndex, :);
    26. xPBest = sortSol(randi(p * popsize), :);
    27. r1 = randi(popsize);
    28. while r1 == i
    29. r1 = randi(popsize);
    30. end
    31. SolA = [Sol; A];
    32. r2 = randi(size(SolA, 1));
    33. while r2 == r1 || r2 == i
    34. r2 = randi(size(SolA, 1));
    35. end
    36. mutantPos = Sol(i, :) + F * (xPBest - Sol(i, :)) + F * (Sol(r1, :) - SolA(r2, :)); % 突变
    37. jj = randi(dim); % 选择至少一维发生交叉
    38. for d = 1:dim
    39. if rand() < CR || d == jj
    40. crossoverPos(d) = mutantPos(d);
    41. else
    42. crossoverPos(d) = Sol(i,d);
    43. end
    44. end
    45. crossoverPos(crossoverPos>UB) = UB(crossoverPos>UB); % 检查是否越界
    46. crossoverPos(crossoverPos
    47. evalNewPos = Fun(crossoverPos); % 将突变和交叉后的变量重新评估
    48. if evalNewPos < Fitness(i) % 小于原有值就更新
    49. A = [A; Sol(i,:)];
    50. if size(A, 1) > popsize
    51. A(randi(size(A, 1)), :) = []; % 保持A的数目不超过popsize
    52. end
    53. SCR = [SCR; CR];
    54. SF = [SF; F];
    55. Sol(i,:) = crossoverPos;
    56. Fitness(i) = evalNewPos;
    57. end
    58. end
    59. muCR = (1 - c) * muCR + c * mean(SCR);
    60. muF = (1 - c) * muF + c * (sum(SF .* SF) / sum(SF));
    61. [fbest, bestIndex] = min(Fitness);
    62. globalBest = Sol(bestIndex,:);
    63. globalBestFitness = fbest;
    64. FitnessHistory(time) = fbest; % 存储每次迭代的最优值
    65. end
    66. end
    1. clc;clear;clearvars;
    2. addpath('CEC2008\');
    3. global initial_flag
    4. initial_flag = 0;
    5. % 初始化变量维度,种群数,最大迭代次数,搜索区间,F,CR
    6. dim = 30;
    7. popsize = 100;
    8. maxIteration = 1000;
    9. LB = -100 * ones(1, dim);
    10. UB = 100 * ones(1, dim);
    11. F = 1;
    12. CR = 0.9;
    13. [globalBest, globalBestFitness, FitnessHistory] = DE(popsize, maxIteration,dim, LB, UB, F, CR, @(x)benchmark_func(x,1));
    14. [globalBest1, globalBestFitness1, FitnessHistory1] = JADE(popsize, maxIteration,dim, LB, UB, @(x)benchmark_func(x,1));
    15. [globalBest2, globalBestFitness2, FitnessHistory2] = SaNSDE(popsize, maxIteration,dim, LB, UB, @(x)benchmark_func(x,1));
    16. plot(FitnessHistory);
    17. hold on;
    18. plot(FitnessHistory1);
    19. hold on;
    20. plot(FitnessHistory2);
    21. legend('DE','JADE','SaNSDE','Location', 'northeast');

    函数1测试结果:

    函数2测试结果:

     

    函数3测试结果:

     

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

  • 相关阅读:
    我的创作纪念日
    【 React 】受控组件和非受控组件的理解?应用场景?
    【iOS】JSONModel的基本使用
    MyBatis
    开源办公OA平台教程:SmartBI集成版快速部署及使用(O2OA容器化部署)
    postgresql数据库|wal日志的开启以及如何管理
    Cy3 diacid/bis-carboxylic acid,Cy3-COOH/carboxylic acid/羧基羧酸(bis)
    通过AWS S3快速低成本部署静态网站,九河云一文详细教程
    Linux 下以其他用户运行程序
    Vuex的使用
  • 原文地址:https://blog.csdn.net/qq_42148307/article/details/127945532