NSGAII算法多目标优化的matlab仿真

UP目录

一、理论基础

二、核心程序

三、测试结果


一、理论基础

NSGA-II适合应用于复杂的、多目标优化问题。是K-Deb教授于2002在论文:A Fast and Elitist Multiobjective Genetic Algorithm:NSGA-II,中提出。在论文中提出的NSGA-II解决了NSGA的主要缺陷,实现快速、准确的搜索性能。NSGA的非支配排序的时间复杂度为O(MN3)O(MN3),在种群规模N较大时排序的速度会很慢。NSGA-II使用带精英策略的快速非支配排序,时间复杂度为O(M(2N)2)O(M(2N)2),排序速度有大幅的提升。而且使用了精英策略,保证了找到的最优解不会被抛弃,提高了搜索性能。另一方面NSGA使用共享函数来使解分布均匀,该函数依赖于共享参数σshareσshare的选择,而且共享函数的复杂度高达O(N2)O(N2)。NSGA-II从新定义了拥挤距离来代替共享参数。

NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:

①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;

②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;

③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。

​在NSGA-中,将进化群体按支配时关系分为若干层,第一层为进化群体的非支配个体集合,第二层为在进化群体中去掉第一层个体后所求得的非支配个体集合,第三层为在进化群体中去掉第一层和第二层个体后所求得的非支配个体集合,依此类推。选择操作首先考虑第一层非支配集,按照某种策略从第一层中选取个体;然后再考虑在第二层非支配个体集合中选择个体,依此类推,直至满足新进化群体的大小要求。

NSGA-II算法引入了精英策略,达到保留优秀个体淘汰劣等个体的目的。精英策略通过将父代与子代个体混合形成新的群体,扩大了产生下一代个体时的筛选范围。以图所示的例子进行分析,图中P表示父代种群,设其中的个体数量为n,Q表示子代种群,具体步骤如下:

(1)将父代种群和子代种群合并形成新的种群。之后对新种群进行非支配排序,本例中将种群分成了6个Pareto等级。

(2)进行新的父代的生成工作,先将Pareto等级为1的非支配个体放入新的父代集合当中,之后将Pareto等级为2的个体放入新的父代种群中,以此类推。

(3)若等级为k的个体全部放入新的父代集合中后,集合中个体的数量小于n,而等级为k+1的个体全部放入新的父代集合中后,集合中的个体数量大于n,则对第k+1等级的全部个体计算拥挤度并将所有个体按拥挤度进行降序排列,之后将等级大于k+1的个体全部淘汰。本例中可以看出k为2,所以对Pareto等级为3的个体计算拥挤度并按其进行降序排序,等级为4~6的个体全部淘汰。

(4) 将等级k+1中的个体按步骤2中排好的顺序逐个放入新的父代集合中,直到父代集合中的个体数量等于n,剩余的个体被淘汰。

综上所述NSGA-Ⅱ其算法流程如下:

二、核心程序

................................................................
initpop=rand(popnum,n)*(xmax-xmin)+xmin;
init_value_pop=value_objective(initpop,m,n);
%画图显示初始图
plot(init_value_pop(:,n+1),init_value_pop(:,n+m),'B+')
pause(.1)
%非支配排序和聚集距离计算
[non_dominant_sort_pop, rankinfo]=non_dominant_sort(init_value_pop,m,n);
ns_dc_pop=crowding_distance(non_dominant_sort_pop,m,n,rankinfo);
%选择,交叉,变异产生下一个子代
poolsize=round(popnum/2);%选择进行交叉变异的个数
toursize=2;%选择锦标赛的元度
select_pop=selection(ns_dc_pop,poolsize,toursize,m,n);
hc=20;%存储交叉变异相关参数
hm=20;
offspring=genetic_operate(select_pop,m,n,hc,hm,xmax,xmin);
%循环开始
t=1;
while t<=gen
%合并种群(2N),进入循环
combine_pop(1:popnum,1:m+n+2)=ns_dc_pop;
[xsize ysize]=size(offspring);
combine_pop(popnum+1:popnum+xsize,1:m+n+2)=offspring;
%重新进行非支配排序和聚焦距离计算
[gen_non_dominant_pop,rankinfo]=non_dominant_sort(combine_pop,m,n);
nsdc_pop=crowding_distance(gen_non_dominant_pop,m,n,rankinfo);
%选择下一代的产生(然后用于交叉变异)
ns_dc_pop=generate_offsprings(nsdc_pop,m,n,popnum);
%显示下一代的情况N_decision_var
if m==2
plot(ns_dc_pop(:,n+1),ns_dc_pop(:,n+2),'r*')
elseif m==3
plot3(ns_dc_pop(:,n+1),ns_dc_pop(:,n+2),ns_dc_pop(:,n+3),'kd')
xlabel('Function 1');
ylabel('Function 2');
zlabel('Function 3');
end
grid on;
text(0,0,0,['第 ',int2str(t),' 代']);
pause(0.1)

%选择,交叉,变异产生下一个子代
poolsize=round(popnum/2);%选择进行交叉变异的个数
toursize=2;%选择锦标赛的元度
select_pop=selection(ns_dc_pop,poolsize,toursize,m,n);
hc=20;%存储交叉变异相关参数
hm=20;
offspring=genetic_operate(select_pop,m,n,hc,hm,xmax,xmin);
t=t+1;
end
%显示标题
title('MOP using NSGA-II with DCD');
xlabel('f(x_1)');
ylabel('f(x_2)');
up85

三、测试结果

通过matlab2021a仿真结果如下:

 

 

 

 

 

 

 

posted @ 2023-02-17 14:18  fpga和matlab  阅读(265)  评论(0编辑  收藏  举报