NSGA-II算法的学习笔记

1.    算法优劣性(相较于第一代NSGA)

① NSGA-II添加了精英策略,即保存群体中适应度在第一层级的个体。

②NSGA-II提出了新的给群体按照非支配关系排序的方法,提高了算法速度。其中又使用了拥挤度概念来对非支配层级中同一级的个体进行排序。

2.    算法流程

Began

初始化父代种群P0


给P0中的所有个体按非支配关系排序

 

按照排序给所有个体分配适应度,最佳适应度值设为1

 

进行遗传算法操作(选择、交叉、变异)生成子代种群Q0

 

   △Then

R0 = P0 ∪ Q0

 

给R0按非支配关系(一种偏序关系)排序,并按照个体的支配个数分级F1、F2、F3..

描述该偏序关系的哈斯图的最高点为F1,以此类推。

 

对于每一级Fi 计算每个个体的拥挤度 并依此排序

 

至此,得到R0集合中所有个体的排序

 

    △   After

按照顺序从R0选择个体作为下一代的父代

R1 = ∅

R1 = R1 ∪ F1

如果R1个体数小于种群数量限制N

R1 = R1 ∪ F2

如果R1个体数M大于种群数量限制N

 

则从F2中按照拥挤度排序将M-N的个体放入到R1中。

 

Then

 

对R1进行遗传算法操作(选择、交叉、变异)生成子代种群Q1

 

重复操作,直到达到种群的迭代次数或得到最优解。


Postscript:每次遗传操作后都要记录种群情况。

3. 流程图

4.NSGAII算法的三个关键步骤

排序算法的伪代码如下:

def  fast_nondominated_sort( P ):
    F 
=  [ ]
    
for  p  in  P:
        Sp 
=  [ ]
         np 
=  0
         
for  q  in  P:
             
if  p  >  q:                 # 如果p支配q,把q添加到Sp列表中
                 Sp.append( q )
             
else   if  p  <  q:         # 如果p被q支配,则把np加1
                 np  +=   1

        
if  np  ==  0:
            p_rank 
=   1          # 如果该个体的np为0,则该个体为Pareto第一级
      F1.append( p )
    F.append( F1 )
    i 
=  0
    
while  F[i]:
        Q 
=  [ ]
        
for  p  in  F[i]:
            
for  q  in  Sp:         # 对所有在Sp集合中的个体进行排序
                nq  -=   1
                
if  nq  ==  0:      # 如果该个体的支配个数为0,则该个体是非支配个体
                    q_rank  =  i + 2      # 该个体Pareto级别为当前最高级别加1。此时i初始值为0,所以要加2
                    Q.append( q )
        F.append( Q )
        i 
+=   1

    在上面伪代码中,第一部分循环为二重循环,时间复杂度为O(N2),第二部分循环中,我们可以假设共有x个级别,而每个级别中最多有(N-N/x)各个体,每个个体的支配集合中也最多有(N- N/x)各个体。由此可得出循环次数为x*(N-N/x)*(N-N/x)=((x-1)2/x2)N2M,即时间复杂度为O(MN2)。

具体方法如下面伪代码:

def  crowding_distance_assignment( I )
        nLen 
=  len( I )         # I中的个体数量
     for  i  in  I:
                i.distance 
=  0     # 初始化所有个体的拥挤距离
     for  objFun  in  M:         # M为所有目标函数的列表
                I  =  sort( I, objFun )     # 按照目标函数objFun进行升序排序
                I[0]  =  I[ len[I] - 1  ]  =  ∞     # 对第一个和最后一个个体的距离设为无穷大
                 for  i  in  xrange(  1 , len(I)  -   2  ):
                        I[i].distance 
=  I[i].distance  +  ( objFun( I[i + 1 ] )  -  objFun( I[i - 1 ] ) ) / (Max(objFun())  -  Min(objFun()) )
  

        伪代码中的objFun( i )是对个体i求其目标函数值。Max(objFun())为目标函数objFun()的最大值,Min(objFun())为目标函数objFun的最小值。其复杂度为O(MNlogN)。


  • 5
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
R-NSGA-II算法的优点可以从以下几个方面来讨论。首先,R-NSGA-II算法是基于NSGA-II算法的改进版本,它引入了参考点的概念,能够更好地处理多目标优化问题。通过使用参考点,R-NSGA-II算法可以在非支配排序中更好地选择个体,并生成更具多样性和均匀性的解集。这样可以帮助决策者在决策偏好方面提供更多的选择。 其次,R-NSGA-II算法使用参考点来选择个体,可以有效地解决拥挤度选择缺陷。传统的NSGA-II算法使用拥挤度来选择个体,但当解集中的个体数量较多时,拥挤度选择可能导致解集中的个体过于拥挤,缺乏多样性。而R-NSGA-II算法通过参考点的选择方法,可以在保持均匀性的同时提供更大的多样性。 最后,R-NSGA-II算法在处理二目标优化问题时,能够更好地区分支配关系。在二目标优化问题中,支配关系是非常重要的,它决定了解集中哪些解是优于其他解的。R-NSGA-II算法通过使用参考点来确定支配关系,可以更准确地判断解集中个体之间的优劣关系。 综上所述,R-NSGA-II算法具有更好的多样性和均匀性、解决了拥挤度选择缺陷以及更准确地确定支配关系的优点。它在多目标优化问题中能够提供更好的解集选择和决策支持。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [多目标非支配排序遗传算法-NSGA-II(二)](https://blog.csdn.net/ztzi321/article/details/110823444)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [NSGA-II 算法详解](https://blog.csdn.net/qq_40491534/article/details/120767436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值