NSGA2算法中文版详细介绍

2023-05-16

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) 计算新种群的obj值,

(5).通过合并Pt 和 Qt 产生出组合种群Rt =  Pt UQt 。

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

(7).跳转到步骤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))。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSGA2算法中文版详细介绍 的相关文章

  • 《汇编语言程序设计教程》人民邮电出版社第二版习题及参考答案

    网上的答案是第一版的 xff0c 重新整理了一下 汇编语言程序设计教程 人民邮电出版社第二版 刘慧婷 xff0c 王庆生 主编 习题及参考答案 更多汇编内容请访问 xff1a omegaxyz com 第一章至第五章 核对及编辑 xff1a
  • JavaScript和HTML及CSS的通俗解释

    1 什么是HTML xff08 超文本标记语言 Hyper Text Markup Language xff09 xff0c HTML 是用来描述网页的一种语言 2 CSS 层叠样式表 Cascading Style Sheets 样式定义
  • 计算机系统概论基本知识

    目录 chapter0 chapter1 binary system chapter2 chapter3 chapter4 chapter5 Pseudo Code or Program Design Language way to use
  • NSGA-Ⅱ算法C++实现(测试函数为ZDT1)

    在看C 43 43 实现之前 xff0c 请先看一下NSGA II算法概述 http www omegaxyz com 2017 04 14 nsga iiintro NSGA 就是在第一代非支配排序遗传算法的基础上改进而来 xff0c 其
  • 数据结构Huffman树及编码

    欢迎关注我的网站 xff1a http www omegaxyz com 一 实验目的 构造一个哈夫曼树 xff0c 并根据所构造的哈夫曼树求其哈夫曼树的编码 xff1b 二 基本思路 将每个英文字母依照出现频率由小排到大 xff0c 最小
  • 迷宫问题的通用解法C语言数据结构实现

    1 1问题描述 以一个m n的长方阵表示迷宫 xff0c 0和1分别表示迷宫中的通路和障碍 设计一个程序 xff0c 对任意设定的迷宫 xff0c 求出一条从入口到出口的通路 xff0c 或得出没有通路的结论 1 2基本要求 输入的形式和范
  • 如何用wordpress搭建个人博客

    欢迎访问我的网站 xff1a omegaxyz com WordPress是一种使用PHP语言开发的博客平台 xff0c 用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站 也可以把 WordPress当作一个内容管理系统
  • 课程设计哈夫曼编/译码系统

    欢迎访问我的网站 xff1a omegaxyz com 问题描述 xff1a 利用哈夫曼编码进行通信可以大大提高信道利用率 xff0c 缩短信息传输时间 xff0c 降低传输成本 但是 xff0c 这要求在发送端通过一个编码系统对待传数据预
  • JAVA“类”数组的创建与调用

    JAVA 类 数组的创建与调用和C 43 43 相比是不同的 先看这样一个类数组的创建 注 xff1a bookFeature 是一个类 错误1 xff1a class bookList span class hljs keyword pr
  • JAVA继承与多态概述

    更多JAVA及高级语言编程内容请访问omegaxyz com 1 可以从现有的类定义新的类 xff0c 这称为类的继承 新类称为次类 子类或继承类现有的类称为超类 父类或基类 2 构造方法用来构造类的实例 不同于属性和方法 xff0c 子类
  • 课程设计旅游景点咨询系统

    欢迎访问我的网站 xff1a omegaxyz com 问题描述 xff1a 创建一个至少有15个点的有向网表示的某个旅游景点的导游图 顶点代表景点 类型为字符串 xff08 例如 xff0c 泰山导游图 xff1a 天地广场门 xff0c
  • Android Studio程序无法加载到虚拟机解决方法

    阅读原文 xff1a 我的博客 xff1a omegaxyz com 安装玩Android studio之后创建一个项目 hello world 具体描述为 xff1a Waiting for target device to come o
  • windows系统C盘越来越大怎么办(包括win10)

    欢迎访问我的网站 xff1a omegaxyz com 对于Mac电脑来说 xff0c 不必太过担心垃圾清理 至于Windows用户电脑垃圾会越来越多 使用360和CCleaner已经满足不了用户的需求了 另外Win10在更新过程中会产生许
  • 企业信息化IT架构方法

    一 顶层业务架构 上 xff1a 打通上游供应商 中 xff1a 打通内部各业务部门 xff1b 打通各业务部门和财务部门 中 xff1a 打通各地区域 分支机构 下 xff1a 打通仓储物流 渠道分销 服务商 外 xff1a 打通电子商务
  • 教你用python高效刷leetcode

    由于Python语法的简洁性 xff0c 用python来刷leetcode往往能用比别的语言更少的代码量AC 但是如果不是对python很熟悉就会比较尴尬了 xff0c 如果有些功能明明有高效的内置方法因为不知道要自己实现 或者不了解其复
  • C语言和JAVA的区别在哪里?

    欢迎访问我的网站 xff1a omegaxyz com 1 Java与C语言各自的优势 C语言是面向过程的语言 xff0c 执行效率高 Java是面向对象的语言 xff0c 执行效率比C语言低 C语言最关键的是比Java多了指针 xff0c
  • 一分钟认识JAVA与Android的联系与区别

    欢迎访问我的网站 xff1a omegaxyz com Android是一种以Linux为基础的开放源码操作系统 JAVA是一种面向对象的编程语言 Android上的应用大多数是用JAVA开发的 xff0c 但是Android SDK引用了
  • 什么是前端开发工程师?

    欢迎访问我的网站 xff1a omegaxyz com 概述 前端工程师 xff0c 也叫Web前端开发工程师 他是随着web发展 xff0c 细分出来的行业 Web前端开发技术主要包括三个要素 xff1a HTML CSS和JavaScr
  • MATLAB常用数学函数

    欢迎访问我的网站 xff1a omegaxyz com abs x xff1a 纯量的绝对值或向量的长度 angle z xff1a 复数z的相角 Phase angle sqrt x xff1a 开平方 real z xff1a 复数z的
  • JAVA入门

    欢迎访问我的网站 xff1a omegaxyz com 工欲善其事 xff0c 必先利其器 首先先要下载JAVA IDE xff08 集成开发环境 xff08 IDE xff0c Integrated Development Environ

随机推荐

  • 编程语言(C语言,JAVA),程序设计,APP开发,算法

    更多精彩内容访问 我的网站omegaxyz com 或者关注我的公众号图灵技术域
  • 利用JavaScript批量删除QQ空间说说(只需一个浏览器)

    每个人都有历史 xff0c 记录说说是保存瞬间思想的最好方式 xff0c 但时间久了 xff0c 我们发现从前的灵光闪现是多么的好笑 xff0c 于是我们开始删说说 xff0c 可是说说那么多 xff0c 哎算了重注册一个QQ号吧 别这样
  • 浅析计算机科学在经济犯罪中的特征与表现

    原创文章 xff0c 转载请注明出处 xff1a http www omegaxyz com 2017 06 27 ecocriminallawessay 摘要 xff1a 大数据时代已经来临 与此同时计算机经济犯罪也呈现愈演愈烈的势态 它
  • 稳定排序和不稳定排序

    选择排序 快速排序 希尔排序 堆排序不是稳定的排序算法 xff0c 而冒泡排序 插入排序 归并排序和基数排序是稳定的排序算法 首先 xff0c 排序算法的稳定性大家应该都知道 xff0c 通俗地讲就是能保证排序前2个相等的数其在序列的前后位
  • 程序员必备网站

    1 CSDN http www csdn net CSDN Chinese Software Developer Network 创立于1999年 xff0c 是中国最大的IT社区和服务平台 xff0c 为中国的软件开发者和IT从业者提供知
  • ora 01017问题解决办法

    SQL gt startup ORACLE instance started Total System Global Area 914358272 bytes Fixed Size 2088184 bytes Variable Size 5
  • 数据结构串的基本操作及KMP算法

    将串的基本操作C语言实现 xff0c 实现KMP算法算出NEXT函数和NEXTVAL的值 SqString h的基本内容 span class hljs keyword typedef span span class hljs keywor
  • JAVA经典面试题(来源于互联网)

    面向对象编程 xff08 OOP xff09 Java是一个支持并发 基于类和面向对象的计算机编程语言 下面列出了面向对象软件开发的优点 xff1a 代码开发模块化 xff0c 更易维护和修改 代码复用 增强代码的可靠性和灵活性 增加代码的
  • 规则绝对公平时,社会财富的流向谁?

    从知乎有一个很有趣的问题 xff1a 房间里有100个人 xff0c 每人都有100元钱 xff0c 如果每过一分钟 xff0c 每个人都要拿出一元钱随机给另一个人 xff0c 最后这100个人的财富分布是怎样的 xff1f 这个问题 xf
  • 2017程序员综合素质调研测试

    只要志愿选得好 xff0c 年年期末是高考 高等数学 线性代数 C语言 计算机导论 数据结构 离散数学 电子技术 C 43 43 程序设计 汇编语言程序设计 计算机组成原理 编译原理 操作系统 数据库原理 JAVA程序设计 Python 下
  • 机器学习非平衡数据集概述

    定义 xff1a 不平衡数据集 xff1a 在分类等问题中 xff0c 正负样本 xff0c 或者各个类别的样本数目不一致 研究不平衡类通常认为不平衡意味着少数类只占比10 20 实际上 xff0c 一些数据集远比这更不平衡 例如 xff1
  • 汇编语言32位加减乘除运算题

    用16位指令编制程序 xff0c 处理32位的加减乘除算术四则运算题 本文计算 xff08 3 X 43 Y Z xff09 5的值 值分别为 xff1a span class hljs built in x span dw span cl
  • 汇编语言字符串比较与查找

    答案仅供参考 xff0c 大家还是自己写比较好 汇编语言实现 用字符串处理指令编制程序 xff0c 处理字符串的比较和查找 xff0c 显示结果 要求 xff1a xff08 1 xff09 字符串的比较函数中 xff0c 一个字符串在数据
  • 汇编语言数据段查找ASCII码并回显

    实验要求 xff1a 在数据段预先存放16个十六进制的ASCII码 xff0c 首地址为ASC 从键盘输入一位十六进制数到BX xff0c 用ASC BX xff08 寄存器相对寻址 xff09 寻址方式找到对应数位的ASCII码 xff0
  • 汇编语言将正负数复制到不同的数组

    分离字数组ARRAY中的正 xff0c 负数 xff0c 把其中的正数复制到PDATA数组 xff1a 负数复制到NDATA数组 xff0c 并分别统计正 负数个数 DATAS SEGMENT array dw span class hlj
  • JAVA工程师最新面试题(来源于互联网)

    面向对象编程 xff08 OOP xff09 Java是一个支持并发 基于类和面向对象的计算机编程语言 下面列出了面向对象软件开发的优点 xff1a 代码开发模块化 xff0c 更易维护和修改 代码复用 增强代码的可靠性和灵活性 增加代码的
  • 关于内存溢出异常的查看以及解决办法

    内存溢出 又称为OOM OutOfMemoryError 处理内存溢出 首先要查看是否是由于内存泄露 Memory Leak 造成的内存溢出 Memory Overflow 可以使用内存影响分析工具 如 Eclipse Memory Ana
  • JAVA基本程序设计规范

    1 标识符是程序中用于命名诸如变量 常量 方法 类 包之类元素的名称 2 标识符是由字母 数字 下划线 和美元符号 构成的字符序列 标识符必须以字母或下划 开头 xff0c 不能以数字开头 标识符不能是保留字 标识符可以为任意长度 3 变量
  • 多目标优化问题概述

    图片不清楚请看多目标问题详解 xff1a 多目标问题详解 更多内容访问omegaxyz com 定义 xff1a 若干冲突或相互影响条件约束下在给定区域内寻找尽可能的最优解 xff08 非劣解 xff09 关键词 xff1a 条件约束 xf
  • NSGA2算法中文版详细介绍

    NSGA2主要是对NSGA算法的改进 NSGA是N Srinivas 和 K Deb在1995年发表的一篇名为 Multiobjective function optimization using nondominated sorting