|
一、NSGA-II简介
NSGA-Ⅱ算法是Kalyanmoy Deb等人于 2002年在 NSGA 的基础上提出的,它比 NSGA算法更加优越:它采用了快速非支配排序算法,计算复杂度比 NSGA 大大的降低;采用了拥挤度和拥挤度比较算子,代替了需要指定的共享半径 shareQ,并在快速排序后的同级比较中作为胜出标准,使准 Pareto 域中的个体能扩展到整个 Pareto 域,并均匀分布,保持了种群的多样性;引入了精英策略,扩大了采样空间,防止最佳个体的丢失,提高了算法的运算速度和鲁棒性。
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。
二、算法求解
将NSGA-II用于求解9个多目标测试函数(ZDT1、ZDT2、ZDT3、ZDT4、ZDT6、Kursawe、Poloni、Viennet2、Viennet3)以及1个工程应用(盘式制动器设计)上实验,并采用IGD、GD、HV、SP进行指标评价。
close all;
clear ;
clc;
%% 博客地址
% https://blog.csdn.net/weixin_46204734/category_11458421.html?spm=1001.2014.3001.5482
% https://www.zhihu.com/people/li-ming-60-78-27/posts
%%
% TestProblem测试问题说明:
%一共10个多目标测试函数,详情如下:
%1-5:ZDT1、ZDT2、ZDT3、ZDT4、ZDT6
%6-9:Kursawe、Poloni、Viennet2、Viennet3
%10 盘式制动器设计 https://blog.csdn.net/weixin_46204734/article/details/124051747
%%
TestProblem=10;%1-10(可以修改测试函数)
MultiObj = GetFunInfo(TestProblem);
MultiObjFnc=MultiObj.name;%问题名
% Parameters
params.Np =100; % Population size 种群大小
params.maxgen =30; % Maximum number of generations 最大迭代次数
[Xbest,Fbest]=nsga2(MultiObj,params);
%% 画结果图
figure(2)
if(size(Fbest,2)==2)
h_rep = plot(Fbest(:,1),Fbest(:,2),'ok'); hold on;
if(isfield(MultiObj,'truePF'))
h_pf = plot(MultiObj.truePF(:,1),MultiObj.truePF(:,2),'.r'); hold on;
legend('NSGA2','TruePF');
else
legend('NSGA2');
end
grid on; xlabel('f1'); ylabel('f2');
end
if(size(Fbest,2)==3)
h_rep = plot3(Fbest(:,1),Fbest(:,2),Fbest(:,3),'ok'); hold on;
if(isfield(MultiObj,'truePF'))
h_pf = plot3(MultiObj.truePF(:,1),MultiObj.truePF(:,2),MultiObj.truePF(:,3),'.r'); hold on;
legend('NSGA2','TruePF');
else
legend('NSGA2');
end
grid on; xlabel('f1'); ylabel('f2'); zlabel('f3');
end
title(MultiObjFnc)
Obtained_Pareto=Fbest;
if(isfield(MultiObj,'truePF'))%判断是否有参考的PF
True_Pareto=MultiObj.truePF;
%% Metric Value
% ResultData的值分别是IGD、GD、HV、Spacing (HV越大越好,其他指标越小越好)
ResultData=[IGD(Obtained_Pareto,True_Pareto),GD(Obtained_Pareto,True_Pareto),HV(Obtained_Pareto,True_Pareto),Spacing(Obtained_Pareto)];
else
%计算每个算法的Spacing,Spacing越小说明解集分布越均匀
ResultData=Spacing(Obtained_Pareto);%计算的Spacing
end
实验结果:
Kursawe:
Poloni:
Viennet2:
盘式制动器设计:
三、参考代码
文件夹内包含所有代码及参考文献,可以直接点击main.m运行。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|