基于NSGAII的双目标优化算法matlab仿真

目录

1. 非支配排序

2. 繁殖选择

3. 遗传操作

4. 精英保留策略

5. 迭代与终止

6. 性能评估与参数调整

7. MATLAB程序

8. 仿真结果


       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通过多代迭代进行优化,直到达到预设的迭代次数或满足某种收敛条件(如连续几代最优解的改善微乎其微)。算法的伪代码如下:

  1. 初始化种群0P0​
  2. 对种群P0​进行非支配排序,计算拥挤距离
  3. 对于每一代t=1,2,...
    1. 选择操作,基于非支配等级和拥挤距离选择个体进行遗传操作
    2. 执行交叉和变异操作,生成子代种群
    3. 合并父代和子代种群
    4. 对合并后的种群进行非支配排序和拥挤距离计算
    5. 依据非支配等级和拥挤距离保留一定数量的个体进入下一代Pt​
    6. 若达到终止条件,输出最优解;否则,返回步骤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前沿上的解,还能维护解的多样性,为决策者提供了丰富的选择空间。然而,其性能高度依赖于参数配置和问题特性,因此在实际应用中需要进行充分的实验验证和参数调优。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值