• Self-adaptive Differential Evolution with Neighborhood Search


    0、论文背景

    本文是在SaDE和NSDE的基础上,结合二者的特点,提出了SaNSDE算法

    Yang Z, Tang K, Yao X. Self-adaptive differential evolution with neighborhood search[C]//2008 IEEE congress on evolutionary computation (IEEE World Congress on Computational Intelligence). IEEE, 2008: 1110-1116.

    1、SaNSDE

     有关SaDE和NSDE,请参见博客:NSDESaDE

    SaNSDE与NSDE、SaDE不同点在于以下几个方面:

    • 突变策略自适应。SaNSDE采用了与SaDE相同的方法。提供选择的策略有两个:DE/rand/1 和 DE/current to best/2。
    • F值自适应。采用了NSDE里面获取F值的方式,但不同的地方是,这里的fp不是固定值0.5,而是通过突变策略自适应中调整p值的方式来调整fp值的。

    \large F_{i}=\left\{\begin{array}{ll} N_{i}(0.5,0.3), & \text { if } U_{i}(0,1)<f p \\ \delta_{i}, & \text { otherwise } \end{array}\right.

    •  CR值自适应。采用了SaDE里面自适应调整CR值的方式来获取CR值,但是这里给每个向量的CR值前面乘了一个权重系数,每个权重系数与成功保留到下一代的点与之前点对应的适应度值差值成正比。

    \large \Delta f_{r e c}(k)=f(k)-f_{n e w}(k)

    \large \begin{array}{l} C R m=\sum_{k=1}^{\left|C R_{r e c}\right|} w_{k} * C R_{r e c}(k) \\ w_{k}=\Delta f_{r e c}(k) /\left(\sum_{k=1}^{\left|\Delta f_{r e c}\right|} \Delta f_{r e c}(k)\right) \end{array}

    2、算法的实现与简单实验

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

    Griewank函数的测试结果:

    Ackley函数的测试结果:

     

    Rastrigin函数的测试结果:

     

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

  • 相关阅读:
    Nginx -3
    MS17010(永恒之蓝)漏洞实战
    html静态网站简单的学生网页作业源码 基于游戏网站设计与实现共计10个页面 (仿地下城与勇士游戏网页)
    A-level化学知识点(二):一般原则——General Properties
    vue用vite配置代理解决跨域问题(target、rewrite和changeOrigin的使用场景)
    计算机基础——内存
    ESP32用作经典蓝牙串口透传模块与手机进行串口通信
    Word发布到分类内测试1
    HTTP1.1强制缓存和协商缓存
    C语言小项目 -- 通讯录(静态版+动态版+文件版)
  • 原文地址:https://blog.csdn.net/qq_42148307/article/details/127777878