基于遗传优化GA的三目标优化仿真

目录

1.加权综合方法原理

2.遗传算法流程

3.MATLAB程序

4.仿真结果


      遗传算法(Genetic Algorithm, GA)是一种模拟自然界生物进化过程的全局优化搜索方法,广泛应用于解决多目标优化问题。在多目标优化中,每个解通常对应多个目标函数的值,而这些目标往往相互冲突,难以同时达到最优。三目标优化是指在优化过程中同时考虑三个相互独立的目标函数,寻求在这三个维度上的帕累托最优解集。为了将这三个目标综合为一个单一的目标值以适应遗传算法的框架,通常采用加权和的方法,这要求对每个目标赋予一定的权重,反映了决策者对不同目标重要性的主观判断。

1.加权综合方法原理

       设三个目标函数分别为f1​(x),f2​(x),f3​(x),其中x表示解决方案向量。为了将这三个目标合并成一个单一的评价函数,可以定义一个加权综合函数F(x):

       F(x)=w1​⋅f1​(x)+w2​⋅f2​(x)+w3​⋅f3​(x)

       其中,w1​,w2​,w3​是正实数,且满足w1​+w2​+w3​=1,代表各个目标的相对重要性权重。通过调整这些权重,可以反映决策者对不同目标的不同偏好。

2.遗传算法流程

       在应用遗传算法解决三目标优化问题时,基本流程包括初始化、评估、选择、交叉(杂交)、变异和终止等步骤。

  1. 初始化:随机生成一个初始种群P0​,每个个体代表一个解向量x,即一个三目标问题的可能解决方案。

  2. 评估:计算每个个体在三个目标函数上的值,即计算1​(x),f2​(x),f3​(x),然后根据上述加权综合函数F(x)计算每个个体的适应度值。

  3. 选择:基于轮盘赌选择法或锦标赛选择法等策略,从当前种群中按照适应度值挑选出一部分个体进入下一代,确保优良基因得以传承。

  4. 交叉(杂交):从被选中的个体中随机选取两个作为父母,通过某种交叉方式(如单点交叉、多点交叉等)生成新的后代,以引入多样性。

  5. 变异:以小概率对某些个体的部分基因进行变异操作,进一步增加种群多样性,避免早熟收敛。

  6. 终止条件:当达到预设的迭代次数、种群内解的质量不再显著提升或达到特定的收敛准则时,算法终止,并输出当前最优解或近似帕累托前沿的解集。

3.MATLAB程序

.....................................................................
while gen < MAXGEN;   
      gen
      %目标1
      FitnV1 = ranking(Objv1);    
      Selch1 = select('sus',Chrom(1:NIND/3,:),FitnV1); 
      %目标2
      FitnV2 = ranking(Objv2);    
      Selch2 = select('sus',Chrom(NIND/3+1:2*NIND/3,:),FitnV2);  
      %目标3
      FitnV3 = ranking(Objv3);    
      Selch3 = select('sus',Chrom(2*NIND/3+1:end,:),FitnV3);       
      Selch  = [Selch1;Selch2;Selch3];  
      
      Selch  = recombin('xovsp', Selch,0.9);   
      Selch  = mut( Selch,0.1);   
      phen   = bs2rv(Selch,FieldD);   
      
      
      ind1  = 0;
      for a=1:NIND/3  
          ind1 = ind1 + 1;             
          else
              tmps    = [phen(a,1),phen(a,2),phen(a,3)];
              [VS,IS] = max(tmps);
              VV      = zeros(1,3);
              VV(IS)  = 1;
              
              w1_NIND(ind1)         = VV(1);      
              w2_NIND(ind1)         = VV(2);     
              w3_NIND(ind1)         = VV(3); 
              
              
              tmps    = [phen(a,4),phen(a,5),phen(a,6)];
              [VS,IS] = max(tmps);
              VV      = zeros(1,3);
              VV(IS)  = 1;
              
              w4_NIND(ind1)         = VV(1);      
              w5_NIND(ind1)         = VV(2);     
              w6_NIND(ind1)         = VV(3); 
              
              tmps    = [phen(a,7),phen(a,8),phen(a,9)];
              [VS,IS] = max(tmps);
              VV      = zeros(1,3);
              VV(IS)  = 1;
              
              w7_NIND(ind1)         = VV(1);      
              w8_NIND(ind1)         = VV(2);     
              w9_NIND(ind1)         = VV(3);  
              
              tmps    = [phen(a,10),phen(a,11),phen(a,12)];
              [VS,IS] = max(tmps);
              VV      = zeros(1,3);
              VV(IS)  = 1;
              
              w10_NIND(ind1)         = VV(1);      
              w11_NIND(ind1)         = VV(2);     
              w12_NIND(ind1)         = VV(3);                
              
              tmps    = [phen(a,13),phen(a,14),phen(a,15)];
              [VS,IS] = max(tmps);
              VV      = zeros(1,3);
              VV(IS)  = 1;
              
              w13_NIND(ind1)         = VV(1);      
              w14_NIND(ind1)         = VV(2);     
              w15_NIND(ind1)         = VV(3);               
              
          end

          xij = [w1_NIND(ind1), w2_NIND(ind1), w3_NIND(ind1);
                 w4_NIND(ind1), w5_NIND(ind1), w6_NIND(ind1);
                 w7_NIND(ind1), w8_NIND(ind1), w9_NIND(ind1);
                 w10_NIND(ind1), w11_NIND(ind1), w12_NIND(ind1);
                 w13_NIND(ind1), w14_NIND(ind1), w15_NIND(ind1)];
          %为0-1变量,取1时,表示任务Ti和Tj分到了同一个节点上
          rij = zeros(M,M);
          for i = 1:M
              t1   = xij(i,:);
              ind1 = find(t1 == 1); 
              for j = 1:M
                  t2   = xij(j,:);
                  ind2 = find(t2 == 1); 
                  if ind1 == ind2
                     rij(i,j) = 1; 
                  end
              end
          end
          %计算对应的目标值
          MINX               = func_object1(Ci,v,fai,rij,Cij,M);
          J1(ind1,1)           = 1/(MINX+0.001);
      end 
      
      
      
      ind2  = 0;
      for a=NIND/3+1:2*NIND/3  
          ind2 = ind2 + 1;
          if  gen == 1
              w1_NIND(ind1)         = xij(1,1);      
              w2_NIND(ind1)         = xij(1,2);  
              w3_NIND(ind1)         = xij(1,3);  
              w4_NIND(ind1)         = xij(2,1);        
              w5_NIND(ind1)         = xij(2,2);    
              w6_NIND(ind1)         = xij(2,3);        
              w7_NIND(ind1)         = xij(3,1);  
              w8_NIND(ind1)         = xij(3,2);  
              w9_NIND(ind1)         = xij(3,3);      
              w10_NIND(ind1)        = xij(4,1);                 
              w11_NIND(ind1)        = xij(4,2);        
              w12_NIND(ind1)        = xij(4,3);  
              w13_NIND(ind1)        = xij(5,1);  
              w14_NIND(ind1)        = xij(5,2);       
              w15_NIND(ind1)        = xij(5,3);      
          else
              tmps    = [phen(a,1),phen(a,2),phen(a,3)];
              [VS,IS] = max(tmps);
              VV      = zeros(1,3);
              VV(IS)  = 1;
              
              w1_NIND(ind1)         = VV(1);      
              w2_NIND(ind1)         = VV(2);     
              w3_NIND(ind1)         = VV(3); 
              
              
              tmps    = [phen(a,4),phen(a,5),phen(a,6)];
              [VS,IS] = max(tmps);
              VV      = zeros(1,3);
              VV(IS)  = 1;
              
              w4_NIND(ind1)         = VV(1);      
              w5_NIND(ind1)         = VV(2);     
              w6_NIND(ind1)         = VV(3); 
              
              tmps    = [phen(a,7),phen(a,8),phen(a,9)];
              [VS,IS] = max(tmps);
              VV      = zeros(1,3);
              VV(IS)  = 1;
              
              w7_NIND(ind1)         = VV(1);      
              w8_NIND(ind1)         = VV(2);     
              w9_NIND(ind1)         = VV(3);  
              
              tmps    = [phen(a,10),phen(a,11),phen(a,12)];
              [VS,IS] = max(tmps);
              VV      = zeros(1,3);
              VV(IS)  = 1;
              
              w10_NIND(ind1)         = VV(1);      
              w11_NIND(ind1)         = VV(2);     
              w12_NIND(ind1)         = VV(3);                
              
              tmps    = [phen(a,13),phen(a,14),phen(a,15)];
              [VS,IS] = max(tmps);
              VV      = zeros(1,3);
              VV(IS)  = 1;
              
              w13_NIND(ind1)         = VV(1);      
              w14_NIND(ind1)         = VV(2);     
              w15_NIND(ind1)         = VV(3);   
          end

          xij = [w1_NIND(ind1), w2_NIND(ind1), w3_NIND(ind1);
                 w4_NIND(ind1), w5_NIND(ind1), w6_NIND(ind1);
                 w7_NIND(ind1), w8_NIND(ind1), w9_NIND(ind1);
                 w10_NIND(ind1), w11_NIND(ind1), w12_NIND(ind1);
                 w13_NIND(ind1), w14_NIND(ind1), w15_NIND(ind1)];
          %为0-1变量,取1时,表示任务Ti和Tj分到了同一个节点上
          rij = zeros(M,M);
          for i = 1:M
              t1   = xij(i,:);
              ind1 = find(t1 == 1); 
              for j = 1:M
                  t2   = xij(j,:);
                  ind2 = find(t2 == 1); 
                  if ind1 == ind2
                     rij(i,j) = 1; 
                  end
              end
          end
          %计算对应的目标值
          MINY     = func_object2(Ci,lemda1,lemda2,rij,Cij,M);
          J2(ind2,1) = 1/(MINY+0.001);
      end      
      
      
      ind3  = 0;
          xij = [w1_NIND(ind1), w2_NIND(ind1), w3_NIND(ind1);
                 w4_NIND(ind1), w5_NIND(ind1), w6_NIND(ind1);
                 w7_NIND(ind1), w8_NIND(ind1), w9_NIND(ind1);
                 w10_NIND(ind1), w11_NIND(ind1), w12_NIND(ind1);
                 w13_NIND(ind1), w14_NIND(ind1), w15_NIND(ind1)];
          %为0-1变量,取1时,表示任务Ti和Tj分到了同一个节点上
          rij = zeros(M,M);
          for i = 1:M
              t1   = xij(i,:);
              ind1 = find(t1 == 1); 
              for j = 1:M
                  t2   = xij(j,:);
                  ind2 = find(t2 == 1); 
                  if ind1 == ind2
                     rij(i,j) = 1; 
                  end
              end
          end
          %计算对应的目标值
          MAXZ     = func_object3(wj,ECTLj,Ci,lemda1,xij,lemda2,rij,Cij,M,N);
          J3(ind3,1) = 1/MAXZ;
      end         

      Objvsel1     = J1;  
      Objvsel2     = J2;  
      Objvsel3     = J3;  
      %多目标优化
      Objvsel      =[Objvsel1 ;Objvsel2 ;Objvsel3];
      [Chrom,Objv] = reins(Chrom,Selch,1,1,Objv,Objvsel);   
      gen          = gen+1; 

      %多目标收敛效果
      fitness1(gen)= mean(Objv(1:NIND/3));
      fitness2(gen)= mean(Objv(NIND/3+1:2*NIND/3));
      fitness3(gen)= mean(Objv(2*NIND/3+1:end));
end 
 

figure;
plot(fitness1(4:end),'b','linewidth',2);
hold on;
plot(fitness2(4:end),'r','linewidth',2);
hold on;
plot(fitness3(4:end),'k','linewidth',2);
hold on;
grid on;
xlabel('迭代次数');
ylabel('最优值变化');
legend('目标X','目标Y','目标Z');

save GA.mat fitness1 fitness2 fitness3
up4092

4.仿真结果

       遗传算法在解决三目标优化问题时,通过加权综合目标函数值,简化了多目标优化问题到单目标优化问题的过程,但同时也引入了权重分配的主观性和可能的优化偏见。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fpga和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值