找回密码
 立即注册
查看: 179|回复: 0

多目标优化算法:NSGA-III求解多目标优化问题

[复制链接]
发表于 2022-11-15 11:44 | 显示全部楼层 |阅读模式
一、NSGA-III简介

NSGA-III算法由Kalyanmoy Deb和Himanshu Jain于 2014年提出。
参考文献:Deb K , Jain H . An Evolutionary Many-Objective Optimization Algorithm Using Reference Point-Based Nondominated Sorting Approach, Part I: Solving Problems With Box Constraints[J]. IEEE Transactions on Evolutionary Computation, 2014, 18(4):577-601.


二、算法求解

将NSGA-III用于求解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]=nsga3(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('NSGA3','TruePF');
       else
           legend('NSGA3');
       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('NSGA3','TruePF');
      else
          legend('NSGA3');
      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:


盘式制动器设计:


三、参考代码

文件夹内包含所有代码(NSGA-III求解9个多目标测试函数(ZDT1、ZDT2、ZDT3、ZDT4、ZDT6、Kursawe、Poloni、Viennet2、Viennet3)以及1个工程应用(盘式制动器设计),同时包含评价指标IGD、GD、HV、SP)及参考文献,可以直接点击main.m运行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-21 20:54 , Processed in 0.110226 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表