• Self-adaptive Differential Evolution Algorithm for Numerical Optimization


    0、论文背景

    本文在DE算法的基础上,提出了一种自适应的差分进化算法(SaDE)。其中学习策略的选择和两个控制参数F和CR不需要预先指定

    Qin A K, Suganthan P N. Self-adaptive differential evolution algorithm for numerical optimization[C]//2005 IEEE congress on evolutionary computation. IEEE, 2005, 2: 1785-1791.

    1、SaDE

    DE算法相关知识参见博客:DE 。

    1.1 learning strategy

    这里主要针对突变操作采用了两个策略:

    \large \begin{array}{l} \mathbf{V}_{i, G}=\mathbf{X}_{r_{1}, G}+F \cdot\left(\mathbf{X}_{r_{2}, G}-\mathbf{X}_{r_{3}, G}\right) \\ \mathbf{V}_{i, G}=\mathbf{X}_{i, G}+F \cdot\left(\mathbf{X}_{\text {best }, G}-\mathbf{X}_{i, G}\right)+F \cdot\left(\mathbf{X}_{r_{1}, G}-\mathbf{X}_{r_{2}, G}\right) \end{array}

    上述两个策略侧重点不一样,其中,策略1通常表现出良好的多样性,而策略2则表现出良好的收敛性, 为了平衡全局搜索和局部搜索,本文采用两种方式组合的方式。

    该策略的思路:

    • 首先初始化两个策略被采用的概率,p1 = 0.5,p2 = 0.5,ns1 = 0,ns2 = 0,nf1 = 0,nf2 = 0。
    • rand()函数随机产生一个数,小于p1,采用策略1对该个体进行突变操作;否则,采用策略2。
    • 在选择操作完成后,运用策略1产生的突变个体保留了下来,ns1加1,没有保留下来,nf1加1;运用策略2产生的突变个体保留了下来,ns2加1,没有保留下来,nf2加1。
    • 算法迭代50次后,更新p1和p2;同时重置:ns1 = 0,ns2 = 0,nf1 = 0,nf2 = 0。

    \large p_{1}=\frac{n s 1 \cdot(n s 2+n f 2)}{n s 2 \cdot(n s 1+n f 1)+n s 1 \cdot(n s 2+n f 2)}, p_{2}=1-p_{1}

    1.2 自适应F值

    F值设置需要有一个较大的灵活性,因为F值与收敛性有关,F值越大,种群多样性越好;F值越小收敛性越好。在这里F值是采用正态分布随机生成的:

    \large F = N(0.5,0.3),F\epsilon (0,2]

    1.3 自适应CR值

    良好的CR参数值通常在较小的范围内,因此,我们考虑在一定的生成间隔内积累以往的学习经验,从而动态调整CR值到一个合适的范围。CR值的产生也是采用正态分布随机产生的:

    \large CR = N(CRm,0.1)

    该策略的思路:

    • 首先初始化CRm参数,CRm = 0.5。
    • 然后根据正态分布产生每个个体交叉过程中的CR。
    • 在选择过程完成后,记录成功进入下一代的个体对应的CR值。
    • 在迭代5次之后,在CRm不变的情况下,根据正态分布重新产生每个个体交叉过程中的CR。
    • 在迭代25次之后,更新CRm为所有成功进入下一代后的个体对应的CR值的均值,同时清空所有记录的CR值。

    2、算法的实现以及简单实验

    DE和NSDE相关实现在博客中有展示:NSDE

    1. function [globalBest, globalBestFitness, FitnessHistory] = SaDE(popsize, maxIteration,dim, LB, UB, 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. p1 = 0.5;
    15. ns1 = 0;
    16. ns2 = 0;
    17. nf1 = 0;
    18. nf2 = 0;
    19. CRm = 0.5;
    20. CRQ = normrnd(CRm,0.1,[popsize,1]);
    21. CRRecord = [];
    22. % 开始迭代
    23. for time = 1:maxIteration
    24. for i = 1:popsize
    25. % 突变
    26. F = normrnd(0.5,0.3); %正太分布随机数
    27. if F < 0
    28. F = 0.0001;
    29. elseif F > 2
    30. F = 2;
    31. end
    32. if rand() <= p1
    33. r = randperm(popsize, 3); %策略1
    34. mutantPos = Sol(r(1),:) + F * (Sol(r(2),:) - Sol(r(3),:));%在1~pop中随机选择3个数组成一个数组
    35. tag = 1;
    36. else
    37. r = randperm(popsize, 2); %策略2
    38. mutantPos = Sol(i,:) + F * (globalBest - Sol(i,:)) + F * (Sol(r(1),:) - Sol(r(2),:));
    39. tag = 2;
    40. end
    41. % 交叉
    42. jj = randi(dim); % 选择至少一维发生交叉
    43. CR = CRQ(i,1);
    44. for d = 1:dim
    45. if rand() < CR || d == jj
    46. crossoverPos(d) = mutantPos(d);
    47. else
    48. crossoverPos(d) = Sol(i,d);
    49. end
    50. end
    51. % 检查是否越界.
    52. crossoverPos(crossoverPos>UB) = UB(crossoverPos>UB);
    53. crossoverPos(crossoverPos
    54. evalNewPos = Fun(crossoverPos);% 将突变和交叉后的变量重新评估
    55. % 小于原有值就更新,同时更新ns1,ns2,nf1,nf2
    56. if evalNewPos < Fitness(i)
    57. Sol(i,:) = crossoverPos;
    58. Fitness(i) = evalNewPos;
    59. if tag == 1
    60. ns1 = ns1 + 1;
    61. elseif tag == 2
    62. ns2 = ns2 + 1;
    63. end
    64. CRRecord = [CRRecord;CR];
    65. else
    66. if tag == 1
    67. nf1 = nf1 + 1;
    68. elseif tag == 2
    69. nf2 = nf2 + 1;
    70. end
    71. end
    72. end
    73. [fbest, bestIndex] = min(Fitness);
    74. globalBest = Sol(bestIndex,:);
    75. globalBestFitness = fbest;
    76. % 存储每次迭代的最优值.
    77. FitnessHistory(time) = fbest;
    78. % 策略的学习
    79. if mod(time,50) == 0
    80. p1 = (ns1 * (ns2 + nf2)) / (ns2 * (ns1 + nf1) + ns1 * (ns2 + nf2));
    81. ns1 = 0;
    82. ns2 = 0;
    83. nf1 = 0;
    84. nf2 = 0;
    85. end
    86. % CR的更新
    87. if mod(time,25) == 0
    88. CRm = mean(CRRecord);
    89. CRRecord = [];
    90. end
    91. if mod(time,5) == 0
    92. CRQ = normrnd(CRm,0.1,[popsize,1]);
    93. end
    94. end
    95. 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)Griewank(x));
    11. [globalBest1, globalBestFitness1, FitnessHistory1] = NSDE(popsize, maxIteration,dim, LB, UB, CR, @(x)Griewank(x));
    12. [globalBest2, globalBestFitness2, FitnessHistory2] = SaDE(popsize, maxIteration,dim, LB, UB, @(x)Griewank(x));
    13. plot(FitnessHistory);
    14. hold on;
    15. plot(FitnessHistory1);
    16. hold on;
    17. plot(FitnessHistory2);
    18. legend('DE','NSDE','SaDE','Location', 'northeast');

    Griewank函数测试结果:

     Rastrigin函数测试结果:

    Ackley 函数测试结果:

    可以看出SaDE和NSDE在性能上均比DE有不小的提升,可以看出自适应参数确实在搜索和收敛上有非常大的帮助。

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

  • 相关阅读:
    秋招知识点总结-FPGA基础知识
    【无标题】
    【C++】C++11—— 包装器
    CF Round 479 (Div. 3)--E. Cyclic Components(DFS求无向图中独立环的个数)
    Linux学习笔记(7)
    【项目】扫雷小游戏(C语言)
    在MicroPython中启用基于spiflash的LFS挂载文件系统
    精心整理高频js手写题请查收
    一文读懂——全局注意力机制(global attention)详解与代码实现
    使用RestTemplate 进行远程接口调用工具类
  • 原文地址:https://blog.csdn.net/qq_42148307/article/details/127739518