• matlab实现多目标优化求解-NSGA-II 算法


    1、内容简介


    592-20220630\NSGAII可以交流、咨询、答疑

    2、内容说明

    NSGA-Ⅱ是最流行的多目标遗传算法之一,它降低了非劣排序遗传算法的复杂性,具有运行速度快,解集的收敛性好的优点,成为其他多目标优化算法性能的基准。

    NSGA-Ⅱ算法是 Srinivas 和 Deb 于 2000 年在 NSGA 的基础上提出的,它比 NSGA算法更加优越:它采用了快速非支配排序算法,计算复杂度比 NSGA 大大的降低;采用了拥挤度和拥挤度比较算子,代替了需要指定的共享半径 shareQ,并在快速排序后的同级比较中作为胜出标准,使准 Pareto 域中的个体能扩展到整个 Pareto 域,并均匀分布,保持了种群的多样性;引入了精英策略,扩大了采样空间,防止最佳个体的丢失,提高了算法的运算速度和鲁棒性。
    NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
    ①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
    ②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
    ③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。

    3、仿真分析

    1. clc
    2. clear
    3. close all
    4. %% 定义自变量范围
    5. nvar = 3;
    6. nobj = 2;
    7. npop = 50;
    8. maxit = 5;
    9. pc = 0.8;
    10. nc = round(pc * npop / 2) * 2;
    11. mu = 0.05;
    12. varmin = [0.5, 0.5, 30];
    13. varmax = [15, 1.5, 60];
    14. step = [0.29, 0.02, 0.6];
    15. len = (varmax - varmin) ./ step;
    16. var = [varmin;step;varmax;round(len, 0)];
    17. %% 定义结果存放模板
    18. empty.position = [];
    19. empty.cost = [];
    20. empty.rank = [];
    21. empty.domination = [];
    22. empty.dominated = 0;
    23. empty.crowdingdistance = [];
    24. pop = repmat(empty, npop, 1);
    25. %% 初始化种群
    26. for i = 1 : npop
    27. pop(i).position = create_x(var);
    28. pop(i).cost = costfunction(pop(i).position);
    29. end
    30. %% 非支配排序
    31. [pop,F] = nondominatedsort(pop);
    32. %% 拥挤度计算
    33. pop = calcrowdingdistance(pop,F);
    34. %% 主程序
    35. for it = 1 : maxit
    36. popc = repmat(empty, nc/2,2);
    37. for j = 1 : nc / 2
    38. p1 = tournamentsel(pop);
    39. p2 = tournamentsel(pop);
    40. [popc(j, 1).position, popc(j, 2).position] = crossover(p1.position, p2.position);
    41. end
    42. popc = popc(:);
    43. for k = 1 : nc
    44. popc(k).position = mutate(popc(k).position, mu, var);
    45. popc(k).cost = costfunction(popc(k).position);
    46. end
    47. newpop = [pop; popc];
    48. % 排序
    49. pop = Sortpop(pop);
    50. % 淘汰
    51. pop = pop(1: npop);
    52. % 更新第1等级
    53. F1 = pop(F{1});
    54. % 显示迭代信息
    55. disp(['Iteration ' num2str(it) ': Number of F1 Members = ' num2str(numel(F1))]);
    56. % 绘图
    57. figure(1);
    58. plotcosts(F1);
    59. % pause(0.01);
    60. end

    Iteration 1: Number of F1 Members = 19
    Iteration 2: Number of F1 Members = 27
    Iteration 3: Number of F1 Members = 44
    Iteration 4: Number of F1 Members = 50
    Iteration 5: Number of F1 Members = 50

     

    4、参考论文

  • 相关阅读:
    去注释和宏替换——深入理解预处理
    Array reduce() 如何计算元素内数值总合,计算总合
    【LeetCode】【字符串】【位运算实现字母大小写转换】709. 转换成小写字母 Java实现
    C++ 强制类型转换
    【机器学习】数据预处理与特征工程
    Vue2.7 + Vite3.2 + Rollup 组件库开发指南
    手机浏览器风生水起,多御安全浏览器手机版升级上线
    2022年全网最全最细最流行的自动化测试工具有哪些?
    中国智能马桶行业未来发展及投资可行性建议报告2022-2028年版
    处理streamlit库上传的图片文件
  • 原文地址:https://blog.csdn.net/qingfengxd1/article/details/127414857