目录
NSGA-II(Non-dominated Sorting Genetic Algorithm II)是由Deb等人在2002年提出的,它是遗传算法的一种改进版本,特别适用于解决多目标优化问题。双目标优化问题是指同时优化两个相互冲突的目标函数,例如最小化成本和最大化性能。
1. 非支配排序
非支配排序是NSGA-II的核心机制之一,用于区分解的优劣。一个解xi支配另一个解xj,如果对于所有目标函数fk(k=1,2,在双目标优化中),满足fk(xi)≤fk(xj)且至少存在一个k使得fk(xi)<fk(xj)。非支配解集合称为前沿面(Pareto前沿),按非支配等级(Fronts)排序,第一前沿面(Front 1)包含最优解,随后的前沿面依次包含次优解。
2. 繁殖选择
NSGA-II采用基于非支配等级的锦标赛选择,优先选择非支配等级低的解。在相同非支配等级内,通过计算拥挤距离来进一步排序,以保持解的多样性。拥挤距离Ci 衡量解在前沿面上的分布密集程度,计算公式如下:
其中,di 是解xi与其在同级前沿面的邻近解在目标空间中的欧氏距离,rmax 和rmin 分别为当前前沿面解集的目标函数最大值和最小值。拥挤距离大的解被认为在前沿面上分布较为稀疏,有利于保持解的多样性。
3. 遗传操作
NSGA-II的遗传操作包括选择、交叉(crossover)和变异(mutation)。
- 选择:采用二进制锦标赛选择,优先选择非支配等级低且拥挤距离大的解进入下一代。
- 交叉:常用的是单点交叉或均匀交叉。以单点交叉为例,选择两个父代染色体,在某一随机点进行切割,然后交换片段生成子代。
- 变异:对选中的个体进行随机变异,比如改变染色体上的某些位点,以引入新的遗传信息。变异概率通常较低,以保持种群的稳定性。
4. 精英保留策略
为了确保算法的收敛性,NSGA-II在每一代结束后,通过比较当前种群和新生成的子代,保留所有非支配解,并根据非支配等级和拥挤距离替换掉较劣的解。
5. 迭代与终止
NSGA-II通过多代迭代进行优化,直到达到预设的迭代次数或满足某种收敛条件(如连续几代最优解的改善微乎其微)。算法的伪代码如下:
- 初始化种群0P0
- 对种群P0进行非支配排序,计算拥挤距离
- 对于每一代t=1,2,...
- 选择操作,基于非支配等级和拥挤距离选择个体进行遗传操作
- 执行交叉和变异操作,生成子代种群
- 合并父代和子代种群
- 对合并后的种群进行非支配排序和拥挤距离计算
- 依据非支配等级和拥挤距离保留一定数量的个体进入下一代Pt
- 若达到终止条件,输出最优解;否则,返回步骤3
6. 性能评估与参数调整
NSGA-II的性能评估通常通过Pareto前沿的分布、收敛性和多样性指标来进行。收敛性衡量解集接近真实Pareto前沿的程度,而多样性则反映了解集覆盖Pareto前沿的广度。算法参数如种群大小、交叉率、变异率等,需根据问题特性进行细致调整以达到最优性能。
7. MATLAB程序
......................................................................
while t<=gen
t
%合并种群(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]=func_sort(combine_pop,m,n);
nsdc_pop=func_crowding_dist(gen_non_dominant_pop,m,n,rankinfo);
%选择下一代的产生(然后用于交叉变异)
ns_dc_pop=func_offsprings(nsdc_pop,m,n,popnum);
%显示下一代的情况
plot(ns_dc_pop(:,n+1),ns_dc_pop(:,n+2),'r*')
grid on;
text(0,0,0,['第 ',int2str(t),' 代']);
pause(0.1)
%收敛性计算
if t>=(gen*0.9)
%导入标准解
opt=load('paretoZDT1.dat');
%得到函数解
funcval=ns_dc_pop(:,n+1:n+m);
for j=1:m %求取最大最小值
maxfval(j)=max(funcval(:,j));
minfval(j)=min(funcval(:,j));
end
distance=zeros(1,size(funcval,1));
sumfval=zeros(1,size(opt,1));
dsum=0;
for i=1:size(funcval,1)
for j=1:size(opt,1)
for k=1:m
sumfval(j)= sumfval(j)+((funcval(i,k)-opt(j,k))/(maxfval(k)-minfval(k)))^2;
end
end
distance(i)=sqrt(min(sumfval));
sumfval(:)=0;
dsum=dsum+distance(i);
end
c=dsum/size(funcval,1)
end
%选择,交叉,变异产生下一个子代
poolsize=round(popnum/2);%选择进行交叉变异的个数
toursize=2;%选择锦标赛的元度
select_pop=func_select(ns_dc_pop,poolsize,toursize,m,n);
hc=20;%存储交叉变异相关参数
hm=20;
offspring=func_genetic(select_pop,m,n,hc,hm,xmax,xmin);
t=t+1;
end
%显示标题
title('MOP using NSGA-II with DCD');
xlabel('Function 1');
ylabel('Function 2');
up4083
8. 仿真结果
NSGA-II通过其高效的非支配排序和拥挤距离度量机制,在处理双目标乃至多目标优化问题上展现出卓越的性能。它不仅能够有效地搜索到Pareto前沿上的解,还能维护解的多样性,为决策者提供了丰富的选择空间。然而,其性能高度依赖于参数配置和问题特性,因此在实际应用中需要进行充分的实验验证和参数调优。