热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NSGAII算法详解

3NSGA-II3.1算法流程确定种群大小n,交叉概率t,迭代次数g随机产生n个个体,它们整体视为种群Pfori1togP∅for

3 NSGA-II


3.1 算法流程

确定种群大小 n,交叉概率 t,迭代次数 g
随机产生 n 个个体,它们整体视为种群 P
for i &#61; 1 to gP &#61;for j &#61; 1 to n产生一个 [0,1] 的随机数 aif (a<t)从 P 中随机选出两个个体作为父母&#xff0c;交叉产生一个新的个体并放入 P’ 中else从 P 中随机选出一个个体&#xff0c;变异产生一个新的个体并放入 P’ 中endend利用非支配排序和拥挤距离&#xff0c;从 P∪P’ 中选出 n 个个体&#xff0c; 代替 P # NSGA-II改进的部分
end
输出最终种群 P 中的非支配个体




3.2 NSGA-II 提出的 NSGA的缺点


  • O(MN3)O(MN^3)O(MN3)计算复杂度(其中M代表目标个数&#xff0c;N代表种群个数)

    NSGA算法每一代进化都要构造非支配集, 在种群规模大的时候会造成巨大的时间开销

  • 非精英机制方法

    NSGA算法没有采取保留优秀解的措施, 导致算法性能受损。

  • 需要指定共享参数

    指定共享参数是因为NSGA需要依靠共享参数来维持解群体的分布性, 也即实现解尽可能地均匀分布, 但共享参数的定义往往需要一定的经验, 这也导致共享参数的确定成为了老大难的问题。





3.3 NSGA-II 较于 NSGA的优点


3.3.1 快速非支配排序

​在NSGA-中&#xff0c;将进化群体按支配时关系分为若干层&#xff0c;第一层为进化群体的非支配个体集合&#xff0c;第二层为在进化群体中去掉第一层个体后所求得的非支配个体集合&#xff0c;第三层为在进化群体中去掉第一层和第二层个体后所求得的非支配个体集合&#xff0c;依此类推。选择操作首先考虑第一层非支配集&#xff0c;按照某种策略从第一层中选取个体;然后再考虑在第二层非支配个体集合中选择个体&#xff0c;依此类推,直至满足新进化群体的大小要求。


1) 论文算法

论文代码




2) 支配关系

在这里插入图片描述
对于二目标优化问题来讲, 支配的含义在于 解A的值在两个目标函数上都优与解B , 这样我们就称 解A支配解B (不理解可以参照 Pareto理论)
假如横纵坐标为两个不同的约束函数, 函数值越小越优秀的情况下。 那么 B 显然能够支配 C和D , 因为 B的两个函数值都小于 C与 D, 因此 Sp&#61;C,DS_p &#61; {C,D}Sp&#61;C,D 。 而 C 显然受到 A 和 B 的支配, 因此 np&#61;2np &#61; 2np&#61;2




3) 论文解释


  • 原文

    ​ First, for each solution we calculate two entities: 1) domination count npn_pnp, the number of solutions which dominate the solution p, and 2) SpS_pSp, a set of solutions that the solution dominates. This requires O(MN2)O(MN^2)O(MN2)comparisons.
    ​ All solutions in the first nondominated front will have their domination count as zero. Now, for each solution p with np&#61;0n_p &#61; 0np&#61;0, we visit each member (q ) of its sets SqS_qSq and reduce its domination count by one. In doing so, if for any member q the domination count becomes zero, we put it in a separate list Q. These members belong to the second nondominated front. Now, the above procedure is continued with each member of Q and the third front is identified. This process continues until all fronts are identified.


  • 译文

    ​ 首先&#xff0c;对每一个解我门计算两个实体:1&#xff09;支配计数npn_pnp ,即支配着解 p 的解的数量&#xff0c;还有 2&#xff09;SpS_pSp&#xff0c;解所支配的解的集合&#xff0c;这需要O(MN2)O(MN^2)O(MN2)次比较。
    ​ 所有第一非支配前沿面解的支配计数都为零。现在&#xff0c;对每一个解 p 都有np&#61;0n_p &#61; 0np&#61;0&#xff0c;我们访问每一成员(q&#xff09;和他的集合SqS_qSq并且减少逐一减少支配计数。通过这样&#xff0c;如果任何成员q的支配计数达到0&#xff0c;我们就把它放进一个单独集合 Q。这些成员属于第二非支配前沿面。现在&#xff0c;以上程序应用 Q中的每一成员继续执行直到第三前沿面被确定。这一过程持续到所有前沿面被确定。


  • 个人理解

    快速非支配排序算法的目的在于将 种群根据相应的支配关系划分为不同级别的Pareto解 , 根据约束函数划分为 Pareto1、Pareto2......ParetoNPareto_1、Pareto_2......Pareto_NPareto1Pareto2......ParetoN 等若干个等级。算法首先完成对所有种群最优解的划分, 也即 Pareto1Pareto_1Pareto1 级解(也即种群的最优解, 其余解按照1−N1 - N1N 优先级依次递减)。其次完成刨去 Pareto1Pareto_1Pareto1 级解之后解的划分, 根据支配次数的结果 nqn_qnq 的大小, 每执行依次递减, 当执行同一批次 nqn_qnq 为零时的解划分为同一等级 (Pareto front) , 直到集合为空, 完成种群 N 的划分。



4) 伪代码

# 以下是 NSGA-II 的伪代码
# 参数说明
# np表示被多少解支配&#xff0c;是一个数目
# Sp表示该解所支配的解的集合,是一个集合
# P表示整个种群
# 对于参数而言, 这里的参数都是一些假参数, 实际设计时, 解应该是一个具有属性地对象def fast_nondominated_sort(P):F &#61; [] # 初始化 F用来存放支配关系的排序结果(分层划分)for p in P: # 遍历整个种群Sp &#61; [] # 支配解集合初始化np &#61; 0 # 支配解个数初始化for q in P: # 遍历整个种群if p > q: # 如果p支配q,将q添加到 Sp 列表(p被p支配)Sp.append(q)elif q > p: # 如果q支配p,则 np &#43; 1np &#43;&#61; 1if np &#61;&#61; 0: # 如果p没有被其它解支配, 将它设为Pareto 1级, 也即非支配解p_rank &#61; 1 #p_rank 是解的一个属性, 代表了当前解的 Pareto等级F1.append(p) # 将非支配解加入p 集合中F.append(F1) # 将Pareto 1级解加入F群体中i &#61; 1# 下述算法复杂度为 O(MN^2)while F[i]: # 当F 非空Q &#61; [] # Q 存放后续的非支配解for p in F[i]: # 遍历Pareto 1级解集合for q in Sp: # 遍历Pareto 1级解的支配解 该集合 &#61; 全集 - Pareto1级解nq -&#61; 1 # 消除了 Pareto上层解 对它的支配if nq &#61;&#61; 0: # 如果该个体支配计数为0, 代表是非支配解q_rank &#61; i&#43;1 # 设置该解为与 i &#43; 1前沿面 i 初始为 1Q.append(q) # 将解存放到Q集合中F.append(Q) # 把Q得到的划分好的非支配解排序结果拼接到 F 结果集内部i &#43;&#61; 1 # 重复循环 知道F[i]为空, 也即遍历完所有的Pareto 1级解




3.3.2 拥挤度与拥挤度比较算子


1) 拥挤度计算公式

I[i&#43;1].m和I[i−1].m分别是解i后一个与前一个解在m函数上的的函数值I[i&#43;1].m和I[i-1].m分别是解i后一个与前一个解在m函数上的的函数值I[i&#43;1].mI[i1].mim

fmmax和fmmin分别是第m个函数的最大和最小值f_m^{max}和f_m^{min}分别是第m个函数的最大和最小值fmmaxfmminm
Idistance&#61;(I[i&#43;1].m−I[i−1].m)/(fmmax−fmmin)I_{distance} &#61; (I[i&#43;1].m - I[i-1].m) / (f_m^{max} - f_m^{min}) Idistance&#61;(I[i&#43;1].mI[i1].m)/(fmmaxfmmin)




2) 拥挤比较算子

经过前面的快速非支配排序和拥挤度计算之后&#xff0c;种群中的每个个体 iii 都拥有两个属性&#xff1a;非支配排序决定的非支配序 iranki_{rank}irank&#xff08;级数&#xff0c;即第几级&#xff09;和拥挤度 idi_did。依据这两个属性&#xff0c;可以定义拥挤度比较算子&#xff1a;个体i与另一个个体 j 进行比较&#xff0c;只要下面任意一个条件成立&#xff0c;则个体 iii 获胜。

① 如果个体 iii 所处非支配层优于个体 jjj 所处的非支配层&#xff0c;即 irankirank<jrank

​② 如果它们有相同的等级且个体 iii 比个体 jjj 有一个更大的拥挤距离&#xff0c;即 irank&#61;jranki_{rank} &#61; j_{rank}irank&#61;jrankid>jdi_d > j_did>jd

第一个条件确保被选择的个体属于较优的非劣等级。第二个条件根据它们的拥挤距离选择由于在同一非劣等级而不分胜负的两个个体中位于较不拥挤区域的个体(有较大的拥挤度 idi_did )。胜出的个体进入下一个操作。





3.3.3 精英策略


1) 概述

在这里插入图片描述
首先将第 t 代产生的新种群 QtQ_tQt 与父代 PtP_tPt 合并组成 RtR_tRt , 种群大小为 2N2N2N 。然后 RtR_tRt 进行非支配排序产生一系列非支配集 ZiZ_iZi 并计算拥挤度。由于子代和父代个体都包含在 RtR_tRt 中, 则经过非支配排序后的非支配集合 Z1Z_1Z1 是最优的, 所以首先将 Z1Z_1Z1 加入 Pt&#43;1P_{t&#43;1}Pt&#43;1 新父代种群中。 如果大小小于 N, 则继续向 Pt&#43;1P_{t&#43;1}Pt&#43;1 种群中添加 Z2Z_2Z2 。直到添加 Z3Z_3Z3 时, 种群大小超过了 N , 这时就根据拥挤度比较算子进行选择添加, 使得 Pt&#43;1P_{t&#43;1}Pt&#43;1 个体数量达到 NNN。然后通过遗传算子(选择、交叉、变异)产生新的子代种群 Qt&#43;1Q_{t&#43;1}Qt&#43;1




2)主体循环

主体循环
以上代码的逻辑跟精英策略的逻辑一致。





3.4 选择算法


3.4.1 锦标赛选择算法

锦标赛选择算法

​遗传算法中的锦标赛选择策略每次从种群中取出一定数量个体&#xff08;放回抽样&#xff09;&#xff0c;然后选择其中最好的一个进入子代种群。重复该操作&#xff0c;直到新的种群规模达到原来的种群规模。几元锦标赛就是一次性在总体中取出几个个体&#xff0c;然后在这些个体中取出最优的个体放入保留到下一代种群的集合中。具体的操作步骤如下&#xff1a;

​① 确定每次选择的个体数量N。&#xff08;二元锦标赛选择即选择2个个体&#xff09;
​② 从种群中随机选择N个个体(每个个体被选择的概率相同) &#xff0c;根据每个个体的适应度值&#xff0c;选择其中适应度值最好的个体进入下一代种群。
​③ 重复步骤②多次&#xff08;重复次数为种群的大小&#xff09;&#xff0c;直到新的种群规模达到原来的种群规模。


推荐阅读
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 本文详细解析了Java中hashCode()和equals()方法的实现原理及其在哈希表结构中的应用,探讨了两者之间的关系及其实现时需要注意的问题。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 本文详细介绍了如何通过RPM包在Linux系统(如CentOS)上安装MySQL 5.6。涵盖了检查现有安装、下载和安装RPM包、配置MySQL以及设置远程访问和开机自启动等步骤。 ... [详细]
author-avatar
坚韧稻草
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有