热门标签 | 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;直到新的种群规模达到原来的种群规模。


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
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社区 版权所有