NSGA2算法中文版详细介绍
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 = 0for q in P:if p > q: #如果p支配q,把q添加到Sp列表中Sp.append( q )else if p < q: #如果p被q支配,则把np加1np += 1if np == 0:p_rank = 1 #如果该个体的np为0,则该个体为Pareto第一级F1.append( p )F.append( F1 )i = 0while F[i]:Q = [ ]for p in F[i]:for q in Sp: #对所有在Sp集合中的个体进行排序nq -= 1if nq == 0: #如果该个体的支配个数为0,则该个体是非支配个体q_rank = i+2 #该个体Pareto级别为当前最高级别加1。此时i初始值为0,所以要加2Q.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 + QtF = fast_nondominate_sort( Rt )Pt+1 = [ ]i = 0while len(Pt+1) + len( F[i] ) < N:crowding_distance_assignment( F[i] )Pt+1 += F[i]i += 1Pt+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))。
NSGA2算法中文版详细介绍相关推荐
- 相位相关算法的详细介绍(一)
相位相关算法: 1.相位相关简介:相位相关算法的理论基础是傅里叶变换,目前在傅里叶变换领域有了快速算法fft,比较成熟的库有fftw开源库,因此相位相关法有极大的速度优势,相位相关在图像融合.模式识别 ...
- 面试必考排序算法最详细介绍,包含动画演示、大厂真题(每天一遍,面试必过)
文章目录 前言 六大排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 总结 一图解释所有 关于时间复杂度 关于稳定性 大厂面试真题 前言 不知道大家有没有发现,排序算法的考核在校招 ...
- 图像修复(Image Restoration)算法数据集详细介绍
目录 人脸数据集 1.Helen Face 2.CelebA (Celebrity Attribute) 3.CelebA-HQ 4.FFHQ(Flickr-Faces-HQ) 场景数据集 1.MS ...
- 蚁群算法(ACA)详细介绍(JAVA实现及代码详解)
文章目录 1.蚁群算法概要 什么是蚁群算法 蚁群算法的数学公式 蚂蚁从i城市到j城市的概率公式 信息素的释放公式 信息素的挥发公式 蚁群算法的框架 2.TSP描述(旅行商问题) 3.JAVA源代码实现 ...
- Docker离线安装及python算法部署详细介绍
算法部署时,常出现测试通过生产上环境各种问题的情况,很影响效率. 因此想采用docker的方式部署,市面上的安装都不是很顺利,因此本文总结各种安装方式,采用离线的方式安装,较为稳定且可行. 1.Doc ...
- 单源最短路径算法—Dijkstra算法(详细介绍)
一.算法简介 迪杰斯特拉算法(Dijkstra),由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年提出.又叫狄克斯特拉算法.这是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中 ...
- 红黑树(一)的原理和算法详细介绍
红黑树的原理和算法的详细介绍 目录 概要 一.R-B Tree简介 二.R-B Tree应用场景及时间复杂度 三.R-B Tree的基本操作(一) 左旋和右旋 1.左旋 2.右旋 四.R-B Tree ...
- 机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景
目录 引言 二.线性回归 三.逻辑回归 四.支持向量机 五.决策树 六.随机森林 七.K-均值聚类 八.主成分分析(PCA) 九.K近邻算法 十.朴素贝叶斯分类器 十一.神经网络 十二.AdaBoos ...
- 红黑树(一)之 原理和算法详细介绍---转帖
目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树的基本操作(一) 左旋和右旋 5 红黑树的基本操作(二) 添加 6 红黑树的基本操作(三) 删除 作者:Sky W ...
- 红黑树(一)之 原理和算法详细介绍
出处:http://www.cnblogs.com/skywang12345/p/3245399.html 概要 目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树 ...
最新文章
- 一个小程序的首页对接后端实现用户注册
- openresty开发系列33--openresty执行流程之3重写rewrite和重定向
- Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
- (二)java版spring cloud+spring boot 社交电子商务平台 - 整合企业架构的技术点
- PAT1045 快速排序 (25 分)【4/6通过】
- adcetris研发历程_AZ、MSD、吉利德争相布局ADC药物
- 机器成为家人!华为发布2025十大趋势展望...
- struts1.3.8与hibernate3.2.5整合所遇到的问题
- 第三章 Python丰富的数据类型
- Android --自定义简单Toast
- input 输入时间html,HTML “input time小时分钟”输入控件简介说明
- Elf二进制文件解析
- matlab函数零点求法,Matlab之函数零点 | 学步园
- 全网最全网络安全站点汇总!还不赶快放到收藏夹里吃灰
- 放量十字星——黎明前的曙光还是黑暗前的夕阳
- C:\Windows\System32\drivers\etc中的文件说明
- cesium中限制地图浏览范围
- 直播平台开发中解决iOS 14 兼容问题和静默推送
- 虚函数的实质——虚函数表
- ViewFlipper和ViewPager的区别
热门文章
- jedate限制开始日期不能大于结束日期
- 大数据丨网络爬虫技术总结
- Pycharm解决plotly不显示离线网页的问题
- mysql ocp 题库部分解析
- ocp认证考试报名_2019年OCP认证在线考试网_OCP题库
- 基于JAVA获取行政区边界坐标_基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标...
- dosbox运行C语言,DOSBox怎么用?DOSBox使用教程
- 【数学建模】人口增长Leslie模型
- xxx.dll没有被指定在windows上运行的解决方法
- docker学习系列:设置阿里云容器加速器