引言
NSGA-II和NSGA-III都是非支配排序遗传算法的变种,用于解决多目标优化问题,但它们在多个方面存在差异。
相同点
-
基本框架相似:两者都基于遗传算法的框架,包括初始化种群、非支配排序、选择、交叉和变异等操作
-
非支配排序:都采用非支配排序技术,将种群中的个体划分为不同的前沿,识别非支配解集
不同点
-
适用目标数量不同:
-
NSGA-II:适用于相对较少的目标数量,通常在2到4个目标之间,在处理较少目标的问题上表现出色
-
NSGA-III:是为更复杂的多目标问题设计的,特别适用于目标数量较多的情况,可以有效地处理5个或更多的优化目标
-
-
选择策略不同:
-
NSGA-II:根据拥挤度来选择个体,拥挤度是一个数值,用于衡量个体在目标空间中的邻近个体数量,以此来保持种群的多样性但当目标数量较多时,拥挤度的计算变得复杂且难以有效保持多样性
-
NSGA-III:根据参考点来选择个体,通过在目标空间中均匀选择参考点位置,将个体与参考点关联,根据个体与参考点之间的距离来选择出最优解集,这种选择策略有助于更好地探索前沿解集的不同部分,提高算法的收敛性和搜索效率
-
-
多样性保持机制不同:
-
NSGA-II:主要通过拥挤度来维持解的多样性,但随着目标数量的增加,其多样性保持效果会变差
-
NSGA-III:引入了超立方体划分的概念,将目标空间划分为多个超立方体,每个超立方体对应一个参考点,通过在不同的超立方体中选择个体,促进解决方案集的多样性,确保在多目标优化问题中涵盖不同的权衡解决方案此外,NSGA-III还采用了小生境保留操作,每个参考点及其周围关联的个体构成一个小生境,在选择操作中从不同的小生境中选择个体,进一步维持多样性。
-
-
计算开销不同:由于NSGA-III引入了超立方体划分和参考点等机制,其计算开销可能会比NSGA-II略高,尤其在目标数量较多的情况下
-
性能表现不同:
-
NSGA-II:在较少目标的情况下表现良好,并且在某些问题上可能更高效
-
NSGA-III:通常在处理复杂的多目标优化问题时能够生成更高质量的非支配解决方案,特别是在目标数量较多的情况下,更适合于挖掘多目标问题的更精细的帕累托前沿实验对比也显示,在多目标优化中,NSGA-III在结果质量和优化程度方面有一定优势,且随着目标函数数量的增加,NSGA-III的计算时间相对更少,种群多样性保护效果也在提升。
-
参考文献
%
% 请关注微信公众号:优化算法侠,发现更多精彩
% NSGA-II
clc;clear;close all;
%% Problem Definition
CostFunction=@(x) MOP4(x); % Cost Function
nVar=3; % Number of Decision Variables
VarSize=[1 nVar]; % Size of Decision Variables Matrix
VarMin=-5; % Lower Bound of Variables
VarMax= 5; % Upper Bound of Variables
% Number of Objective Functions
nObj=numel(CostFunction(unifrnd(VarMin,VarMax,VarSize)));
%% NSGA-II Parameters
MaxIt=100; % Maximum Number of Iterations
nPop=50; % Population Size
pCrossover=0.7; % Crossover Percentage
nCrossover=2*round(pCrossover*nPop/2); % Number of Parnets (Offsprings)
pMutation=0.4; % Mutation Percentage
nMutation=round(pMutation*nPop); % Number of Mutants
mu=0.02; % Mutation Rate
sigma=0.1*(VarMax-VarMin); % Mutation Step Size
%% Initialization
empty_individual.Position=[];
empty_individual.Cost=[];
empty_individual.Rank=[];
empty_individual.DominationSet=[];
empty_individual.DominatedCount=[];
empty_individual.CrowdingDistance=[];
pop=repmat(empty_individual,nPop,1);
for i=1:nPop
pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
pop(i).Cost=CostFunction(pop(i).Position);
end
% Non-Dominated Sorting
[pop, F]=NonDominatedSorting(pop);
% Calculate Crowding Distance
pop=CalcCrowdingDistance(pop,F);
% Sort Population
[pop, F]=SortPopulation(pop);
%% NSGA-II Main Loop
for it=1:MaxIt
% Crossover
popc=repmat(empty_individual,nCrossover/2,2);
for k=1:nCrossover/2
i1=randi([1 nPop]);
p1=pop(i1);
i2=randi([1 nPop]);
p2=pop(i2);
[popc(k,1).Position, popc(k,2).Position]=Crossover(p1.Position,p2.Position);
popc(k,1).Cost=CostFunction(popc(k,1).Position);
popc(k,2).Cost=CostFunction(popc(k,2).Position);
end
popc=popc(:);
% Mutation
popm=repmat(empty_individual,nMutation,1);
for k=1:nMutation
i=randi([1 nPop]);
p=pop(i);
popm(k).Position=Mutate(p.Position,mu,sigma);
popm(k).Cost=CostFunction(popm(k).Position);
end
% Merge
pop=[pop
popc
popm]; %#ok
% Non-Dominated Sorting
[pop, F]=NonDominatedSorting(pop);
% Calculate Crowding Distance
pop=CalcCrowdingDistance(pop,F);
% Sort Population
pop=SortPopulation(pop);
% Truncate
pop=pop(1:nPop);
% Non-Dominated Sorting
[pop, F]=NonDominatedSorting(pop);
% Calculate Crowding Distance
pop=CalcCrowdingDistance(pop,F);
% Sort Population
[pop, F]=SortPopulation(pop);
% Store F1
F1=pop(F{1});
% Show Iteration Information
disp(['Iteration ' num2str(it) ': Number of F1 Members = ' num2str(numel(F1))]);
% Plot F1 Costs
figure(1);
PlotCosts(F1);
pause(0.01);
end
Matlab代码下载
微信搜索并关注-优化算法侠(英文名:Swarm-Opti),或扫描下方二维码关注,以算法名字搜索历史文章即可下载。
可能用的到!多目标优化算法之NSGA-II、NSGA-III(附Matlab免费代码)
点击链接跳转:
375种群优化算法免费下载-matlab
https://mp.weixin.qq.com/s/AsFTBmaZ8UOgES9TQuL0Kg?token=1339859150&lang=zh_CN
求解cec测试函数-matlab
cec2022测试函使用教程及matlab代码免费下载
绘制cec2017/018/2019/2020/2021/2022函数的三维图像教程,SO EASY!