NSGA2主要是对NSGA算法的改进。NSGA是N. Srinivas 和 K. Deb在1995年发表的一篇名为《Multiobjective function optimization using nondominated sorting genetic algorithms》的论文中提出的。该算法在快速找到Pareto前沿和保持种群多样性方面都有很好的效果,不过在这么多年的应用中也出现了如下的一些问题:

1。非支配排序的时间复杂的很大,为O(MN3)。其中M为目标函数的数量,N为种群规模。

2。不支持精英策略。精英策略在保持好的个体及加速向Pareto前沿收敛方面都有很好的表现。

3。需要自己指定共享参数。该参数将对种群的多样性产生很大的影响。

NSGA2算法将在以下方面进行改进:

1。快速的非支配排序

在NSGA进行非支配排序时,规模为N的种群中的每个个体都要针对M个目标函数和种群中的N-1个个体进行比较,复杂度为O(MN),因此种群中的N个个体都比较结束的复杂度为O(MN2),即每进行一次Pareto分级的时间复杂度为O(MN2)。在最坏的情况下,每个Pareto级别都只含有一个个体,那么需要进行N次分级所需要的时间复杂度则会上升为O(MN3)。鉴于此,论文中提出了一种快速非支配排序法,该方法的时间复杂度为O(MN2)。

该算法需要保存两个量:

(1).支配个数np。该量是在可行解空间中可以支配个体p的所以个体的数量。

(2).被支配个体集合SP。该量是可行解空间中所有被个体p支配的个体组成的集合。

排序算法的伪代码如下:

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)。

2。种群中个体多样性的保留

原始的NSGA算法中使用共享函数的方法来维持物种的多样性,这种方法包含一个共享参数,该参数为所求解问题中所期望的共享范围。在该范围内,两个个体共享彼此的适应度。但是该方法有两个难点:

(1).共享函数方法在保持多样性的性能很大程度上依赖于所选择的共享参数值。

(2).种群中的每个个体都要与其余的个体相比较,因此该方法的全局复杂度为O(N2)。

在NSGA2中使用了排挤算法和精英策略来代替共享函数算法。而要实现这两种方法,首先我们需要定义两个操作:密度估算和排挤算子。

(1).密度估算

要对拥挤距离进行计算,则需要根据每个目标函数对种群中的所有个体按升序进行排序。第一个和最后一个个体的拥挤距离设为无穷大,第i个个体的拥挤距离则设为第i+1和第i个体的所有目标函数值之差的和。具体方法如下面伪代码:

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)。

3。主体循环部分

(1).随机初始化开始种群P0。并对P0进行非支配排序,初始化每个个体的rank值。

(2). t = 0

(3).通过二进制锦标赛法从Pt选择个体,并进行交叉和变异操作,产生新一代种群Qt

(4).通过合并Pt 和 Qt 产生出组合种群Rt =  PUQt

(5).对Rt进行非支配排序,并通过排挤和精英保留策略选出N个个体,组成新一代种群Pt+1

(6).跳转到步骤3,并循环,直至满足结束条件。

步骤5的具体操作可见下图:

伪代码如下:

while  condition:
    Rt  =  Pt  +  Qt
    F  =  fast_nondominate_sort( Rt )
    Pt + 1   =  [ ]
    i  =  0
     while  len(Pt + 1 )  +  len( F[i] )  <  N:
        crowding_distance_assignment( F[i] )
        Pt + 1   +=  F[i]
        i  +=   1
    Pt + 1   +=  F[i][0:N - len(Pt + 1 )]
    Qt + 1   =  make_new_generation( Pt + 1  )
    t  =  t + 1

下面分析NSAG2算法的整体复杂度,以下为该算法中的基本操作和其最差复杂度:

(1).非支配排序,最差复杂度为O(M(2N)2)。

(2).拥挤距离估算赋值,最差复杂度为O(M(2N)log(2N))。

(3).拥挤操作排序,最差复杂度为O(2Nlog(2N))。

NSGA-2学习笔记相关推荐

  1. NSGA 2 学习笔记 -- crowding distance

    NSGA-II基于Pareto占优关系对种群中的个体分级,在每一级中计算每个个体在种群中的密度指标,根据占优关系和密度指标对种群中全部个体排序,然后选择相对较好的个体进入下一代迭代循环.常用的密度指标 ...

  2. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  3. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  5. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  6. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  7. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  8. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  9. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  10. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

最新文章

  1. 按下回车键指向下一个位置的一个函数
  2. 明文存密码成惯例?Facebook 6 亿用户密码可被 2 万员工直接看
  3. 驱动调试(二)-环形缓冲区到文件
  4. django view
  5. saltstack批量加用户脚本
  6. js plugin--headroom
  7. linux ccenteros 部署 redis
  8. 将对象映射到多个XML模式–天气示例
  9. 高中必背88个数学公式_高中数学:必修+选修全部知识点精华!附高考必背203个公式...
  10. 后序遍历(非递归)☆
  11. 雷鸟邮件查找所有星标邮件_雷鸟的4种轻量级电子邮件替代品
  12. saltstack系列2之zabbix-agent自动化部署
  13. 图文详细解说DevExpress 2015新版亮点【附文档下载】
  14. GBK字符串转Unicode字符串
  15. 觅知网ppt模板_有哪些相见恨晚的PPT模板网站?
  16. Logback设置property参数
  17. 使用squid内网代理百度地图
  18. Web mfw Writeup
  19. 游戏俄罗斯方块(c语言)
  20. 基于JAVA图书商城购物系统的设计与实现

热门文章

  1. Android自带的人脸识别
  2. 微信小程序 - 获取用户当前位置信息(用于定位地址及获取地址等需求)
  3. Cyber_monitor的使用
  4. MySQL5.7找到data文件夹
  5. 作为一位软件测试工程师,应当需要哪些能力?
  6. Android逆向:通过Xposed解密柠某直播本地数据
  7. QT之Tableview
  8. epoll源码探秘(epoll_create)
  9. Vue+高德地图API的使用(插件的使用)
  10. base64图片压缩到指定大小