非支配排序遗传算法(NSGA,NSGA-II )

一、非支配排序遗传算法(NSGA)

1995年,Srinivas和Deb提出了非支配排序遗传算法(Non-dominated Sorting Genetic Algorithms,NSGA)。这是一种基于Pareto最优概念的遗传算法。

1、基本原理

NSGA与简单的遗传算法的主要区别在于:该算法在选择算子执行之前根据个体之间的支配关系进行了分层。其选择算子、交叉算子和变异算子与简单遗传算法没有区别。

在选择操作执行之前,种群根据个体之间的支配与非支配关系进行排序:

首先,找出该种群中的所有非支配个体,并赋予他们一个共享的虚拟适应度值。得到第一个非支配最优层;

然后,忽略这组己分层的个体,对种群中的其它个体继续按照支配与非支配关系进行分层,并赋予它们一个新的虚拟适应度值,该值要小于上一层的值,对剩下的个体继续上述操作,直到种群中的所有个体都被分层。

算法根据适应度共享对虚拟适应值重新指定:

比如指定第一层个体的虚拟适应值为1,第二层个体的虚拟适应值应该相应减少,可取为0.9,依此类推。这样,可使虚拟适应值规范化。保持优良个体适应度的优势,以获得更多的复制机会,同时也维持了种群的多样性。

2、算法流程

NSGA采用的非支配分层方法,可以使好的个体有更大的机会遗传到下一代;适应度共享策略则使得准Pamto面上的个体均匀分布,保持了群体多样性,克服了超级个体的过度繁殖,防止了早熟收敛。算法流程如图所示:

3、算法缺陷

非支配排序遗传算法(NSGA)在许多问题上得到了应用。但NSGA仍存在一些问题:

  1. 计算复杂度较高,为(m为目标函数个数,N为种群大小),所以当种群较大时,计算相当耗时。

  2. 没有精英策略;精英策略可以加速算法的执行速度,而且也能在一定程度上确保已经找到的满意解不被丢失。

  3. 需要指定共享半径

二、带精英策略的非支配排序的遗传算法(NSGA-II)

2000年,Deb又提出NSGA的改进算法一带精英策略的非支配排序遗传算法(NSGA-II),针对以上的缺陷通过以下三个方面进行了改进:

  1. 提出了快速非支配排序法,降低了算法的计算复杂度。由原来的降到,其中,m为目标函数个数,N为种群大小。

  2. 提出了拥挤度和拥挤度比较算子,代替了需要指定共享半径的适应度共享策略,并在快速排序后的同级比较中作为胜出标准,使准Pareto域中的个体能扩展到整个Pareto域,并均匀分布,保持了种群的多样性。

  3. 引入精英策略,扩大采样空间。将父代种群与其产生的子代种群组合,共同竞争产生下一代种群,有利于保持父代中的优良个体进入下一代,并通过对种群中所有个体的分层存放,使得最佳个体不会丢失,迅速提高种群水平。

1、基本原理

1.1 快速支配排序法

NSGA-II对第一代算法中非支配排序方法进行了改进:对于每个个体 i 都设有以下两个参数 n(i) 和 S(i),

n(i) 为在种群中支配个体 i 的解个体的数量。(别的解支配个体 i 的数量)

S(i) 为被个体 i 所支配的解个体的集合。(个体 i 支配别的解的集合)

  1. 首先,找到种群中所有 n(i)=0 的个体(种群中所有不被其他个体至配的个体 i),将它们存入当前集合F(1);(找到种群中所有未被其他解支配的个体)

  2. 然后对于当前集合 F(1) 中的每个个体 j,考察它所支配的个体集 S(j),将集合 S(j) 中的每个个体 k 的 n(k) 减去1,即支配个体 k 的解个体数减1(因为支配个体 k 的个体 j 已经存入当前集 F(1) );(对其他解除去被第一层支配的数量,即减一)

  3. 如 n(k)-1=0则将个体 k 存入另一个集H。最后,将 F(1) 作为第一级非支配个体集合,并赋予该集合内个体一个相同的非支配序 i(rank),然后继续对 H 作上述分级操作并赋予相应的非支配序,直到所有的个体都被分级。其计算复杂度为,m为目标函数个数,N为种群大小。(按照1)、2)的方法完成所有分级)

1.2确定拥挤度

在原来的NSGA中,我们采用共享函数以确保种群的多样性,但这需要由决策者指定共享半径的值。为了解决这个问题,我们提出了拥挤度概念:在种群中的给定点的周围个体的密度,用 表示,它指出了在个体 i 周围包含个体 i 本身但不包含其他个体的长方形(以同一支配层的最近邻点作为顶点的长方形)

如图所示:

拥挤度比较算子:

从图中我们可以看出值较小时表示该个体周围比较拥挤。为了维持种群的多样性,我们需要一个比较拥挤度的算予以确保算法能够收敛到一个均匀分布的Pareto面上。

由于经过了排序和拥挤度的计算,群体中每个个体 i 都得到两个属性:非支配序 i(rank) 和拥挤度 ,则定义偏序关系:当满足条件 i(rank) < ,或满足 i(rank) = > 时,定义,也就是说:如果两个个体的非支配排序不同,取排序号较小的个体(分层排序时,先被分离出来的个体);如果两个个体在同一级,取周围较不拥挤的个体。

2、算法流程

首先,随机初始化一个父代种群P(0),并将所有个体按非支配关系排序且指定一个适应度值,如:可以指定适应度值等于其非支配序 i(rank),则1是最佳适应度值。然后,采用选择、交叉、变异算子产生下一代种群Q(0),大小为N。

如图,首先将第 t 代产生的新种群Q(t)与父代P(t)合并组成R(t),种群大小为2N。然后R(t)。进行非支配排序,产生一系列非支配集 F(t) 并计算拥挤度。由于子代和父代个体都包含在 R(t) 中,则经过非支配排序以后的非支配集 F(1) 中包含的个体是 R(t) 中最好的,所以先将 F(1) 放入新的父代种群 P(t+1) 中。如果 F(1) 的大小小于N,则继续向 P(t+1) 中填充下一级非支配集 F(2),直到添加 F(3) 时,种群的大小超出N,对 F(3) 中的个体进行拥挤度排序(sort(F(3),)),取前个个体,使 P(t+1) 个体数量达到N。然后通过遗传算子(选择、交叉、变异)产生新的子代种群 Q(t+1)。

算法的整体复杂性为,由算法的非支配排序部分决定。

3、代码举例

import geatpy as ea
import numpy as np
class MyProblem(ea.Problem):  # 继承Problem父类def __init__(self):name = 'NSGA2算法'  # 初始化name(函数名称,可以随意设置)M = 2  # 优化目标个数(两个x)maxormins = [1] * M  # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)Dim = 1  # 初始化Dim(决策变量维数)varTypes = [0]  # 初始化varTypes(决策变量的类型,0:实数;1:整数)lb = [-10]  # 决策变量下界(自定义个上下界搜索)ub = [10]  # 决策变量上界lbin = [1]  # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)ubin = [1]  # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)# 调用父类构造方法完成实例化ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)def evalVars(self, Vars):  # 目标函数f1 = Vars ** 2 # 第一个目标函数f2 = (Vars - 2) ** 2 # 第二个目标函数ObjV = np.hstack([f1, f2])  # 计算目标函数值矩阵CV = -Vars ** 2 + 2.5 * Vars - 1.5  # 构建违反约束程度矩阵(需要转换为小于,反转一下)return ObjV, CV# 实例化问题对象
problem = MyProblem()
# 构建算法
algorithm = ea.moea_NSGA2_templet(problem,# RI编码,种群个体50ea.Population(Encoding='RI', NIND=50),MAXGEN=200,  # 最大进化代数logTras=1)  # 表示每隔多少代记录一次日志信息,0表示不记录。
# 求解
res = ea.optimize(algorithm, seed=1, verbose=False, drawing=1, outputMsg=True, drawLog=False, saveFlag=False, dirName='result')

4、帕累托最优解

parero寻优类似于推荐系统,简单来说就是系统没有决定权,只有建议权。所以系统会推荐一系列在当前评价函数下性能相似的解。这个时候就需要决策者使用决定权从这些解中选择一个。如果是理论问题的话,最简单的就是随机选一个,反正都一样。但是到了实际问题,那就得具体问题具体分析了。比如,一次期末考试,考数学,语文和英语(三个评价函数),那么系统就会推荐你这三科分别的第一(parero 最优),然后让你从中间选一个最好的,你会怎么选?如果你是个普通老师,你会选总分最高的。但是如果你是一个数学竞赛的老师,你会选一个数学最高的那个。归根到底,还是那句话,具体问题具体分析。

————————————————
资料来源:CSDN博主「蓝色蛋黄包」的原创文章
原文链接:https://blog.csdn.net/haha0332/article/details/88672634

非支配排序遗传算法(NSGA,NSGA-II )相关推荐

  1. 【多目标优化】2. 非支配排序遗传算法 —(NSGA、NSGA-II)

    [多目标优化]1. 多目标优化的相关基本概念 [多目标优化]2. 非支配排序遗传算法 -(NSGA.NSGA-II) [多目标优化]3. 基于分解的多目标进化算法 -(MOEAD) 1. 非支配排序遗 ...

  2. 非支配排序遗传算法c语言,非支配排序遗传算法(NSGA)的研究与应用

    摘要: 多目标优化问题一直是科学和工程研究领域的难题和热点问题.传统的解决方法在处理大维数,多模态等复杂问题上存在许多不足.为了解决这一问题,国内外研究学者在简单遗传算法的基础上,发展出了多种多目标优 ...

  3. [多目标优化算法]1.NSGA-II——非支配排序遗传算法

    笔者最近在学习有关多目标优化的内容,并对内容进行一些整理.这篇文章算是笔者的一篇个人学习笔记,也希望能对他人提供一定的帮助,若有不足之处,也欢迎指正和建议. 注:本文中所举例子均为最小化问题. 一.多 ...

  4. 【优化调度】基于matlab非支配排序遗传算法求解车辆充电调度优化问题【含Matlab源码 2000期】

    ⛄一.遗传算法简介 由于国内外人民的生活方式和电动汽车主要购买人群的不同,国内外关于车辆充电调度问题研究的侧重点也不尽相同. 我国地大物博,人口众多,交通复杂.主要从以下方面研究: 1.通过经济手段或 ...

  5. MATLAB程序采用非支配排序遗传算法(NSGA2)求解分布式电源选址定容问题

    MATLAB程序采用非支配排序遗传算法(NSGA2)求解分布式电源选址定容问题,可作为一个有用的参考,程序注释明确,算法原理可以自己搜. 现有:6920651507678049浪迹天涯

  6. MATLAB程序采用非支配排序遗传算法(NSGA2)求解分布式电源选址定容问题,可作为一个有用的参考,程序注释明确,算法原理可以自己搜。

    MATLAB程序采用非支配排序遗传算法(NSGA2)求解分布式电源选址定容问题,可作为一个有用的参考,程序注释明确,算法原理可以自己搜. :8620651507678049浪迹天涯

  7. 非支配排序遗传算法c语言,第三代非支配排序遗传算法(NSGA-III)

    第三代非支配遗传算法是针对高维多目标优化计算代价大,难以挑选Pareto解的情况而开发的,基本流程与NSGA-II相似,但选择个体的方法加入了基于参考点的方法,能够有效降低计算代价. NSGA-III ...

  8. 非支配排序遗传算法NSGA-II学习笔记

    一.多目标优化问题的解 在单目标优化问题中,通常最优解只有一个,而且能用比较简单和常用的数学方法求出其最优解.然而在多目标优化问题中,各个目标之间相互制约,可能使得一个目标性能的改善是以其他目标性能为 ...

  9. 多目标非支配排序遗传算法-NSGA-II(二)

    序 在(一)中我介绍了GA.NSGA以及NSGA-II算法以及他们之间的关系,据完成(一)已经差不多10个月了,当初的愿望实现了吗,事到如今只好祭奠吗?任岁月风干了-,心中不由一首老男孩送给自己.面临 ...

最新文章

  1. 远程Gitlab新建的分支在IDEA里不显示
  2. IE8不支持jQuery问题
  3. 20155324 《信息安全系统设计基础》课程总结
  4. python中width是什么意思_python – tkinter中的标签宽度
  5. gis投影中未定义的地理转换_ArcGIS中5分钟搞懂坐标系相关知识
  6. 软件开发有哪些规范和标准_车辆,机械专业如何从事汽车电子软件开发
  7. MySQL error(2006) server has gone away
  8. [C/C++] C/C++延伸学习系列之STL及Boost库概述
  9. 【VRP】基于matlab改进的模拟退火和遗传算法求解车辆路径规划问题【含Matlab源码 343期】
  10. matlab对信号DTFT,【MATLAB】离散傅里叶变换DTFT和IDTFT
  11. 三思而行 --jsp基础篇
  12. Gym - 100886D 2015-2016 Petrozavodsk Winter Training Camp, Saratov SU Contest D - Catenary
  13. Linux 安装 l2tp
  14. github上实用、常用的插件和库
  15. css前端知识分享—页面布局分析
  16. EasyNVR纯H5摄像机直播解决方案前端解析之:RTSP安防监控实时直播的网页H5自动播放方案
  17. Linux磁盘管理练习题(习题+演示)
  18. 全球及中国氢化镁市场前景调研与投资可行性分析报告2022年版
  19. linux系统无法识别固态硬盘_教你如何快速识别好固态硬盘?
  20. Linux驱动-字符设备驱动

热门文章

  1. pythonppt_用Python实现ppt转化图片(附带长图合并功能)
  2. Win11之g++和build-essential的美妙甜甜圈
  3. 模拟量使用计算机电缆,电气线型汇总
  4. 服务器报错c.a.druid.pool.DruidAbstractDataSource : discard long time none received connection.
  5. openFOAM学习笔记(三)—— char和string相关的类
  6. 经典按键扫描算法理解
  7. 核桃编程的python怎么样_核桃编程测评:机构顾问套路多?家长怒怼!
  8. Star CCM+相关资料分享
  9. LDF转Excel;LDF转位定义;Excel转LDF;Excel转位定义;MatrixCreat(二)之LDF文件创建
  10. JAVA物联所需技术_基于JAVA多线程技术解决物联云端服务雪崩效应的方法与流程...