前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Jmetal 4+ 使用指南一以NSGA-II为例

Jmetal 4+ 使用指南一以NSGA-II为例

作者头像
演化计算与人工智能
发布2021-04-23 11:47:12
1.1K0
发布2021-04-23 11:47:12
举报

以NSGA-II为例

  • 本文以Jmetal官网文档为基础,结合自身理解链接如下
  • 如果你还不了解NSGA-II可以参考

NSGA-II入门

多目标优化拥挤距离计算

多目标优化按支配关系分层实现

  • 在本节中,我们描述了jMetal中NSGA-II的实现。在jMetal下,元启发式方法由定义算法本身的类和执行该算法的另一个类组成。第二类用于指定要解决的问题,要应用的运算符,算法的参数以及需要设置的其他任何参数(自jMetal 2.0起,我们通过使用包jmetal.experiments引入了另一种方法。如第4章中所述)。让我们分别将这两个类称为NSGAII和NGAII main。
  • 意思是说,在2.0以前的版本中,想要执行一个算法使用XXX.java和XXX main.java, 这种方式,其中XXX.java是类的定义而main方法中创建一个实例。但是2以上的版本也推出了实验模块,可以同时比较多个算法,并且在5中推荐使用的就是实验模块也就是experiments包中的内容。

NSGAII.java 类

  • 下图中展示了NSGA-II类的UML图
  • 和其他算法一样NSGA-II继承自Algorithm虚类,execute()方法用于执行整个算法并返回一个解集SolutionSet。
  • 可以通过addOperation()方法向其中加入操作符(算子),例如交叉算子和变异算子,选择算子等,也可以通过getOperation()方法提取算法中使用的算子。而算法中使用的超参数,可以通setInputParameter()和 getInputParameter()进行设置和获取。也可以通过setOutputParemeters() and getOutputParameters() 获取输出结果。在execute()函数中NSGAII有一个构造器constructor可以获取问题Problem并将其设置为一个参数parameter NSGA-II 在Jmetal中的实现可以在jmetal/metaheuristics/nsgaII/NSGAII.java中找到,代码结构如下

execute()函数

变量声明

如下所示的是算法的执行函数

  • 第2-4行 首先设置population size and the maximum numbe of evaluations 种群大小和最大评价次数, evaluations变量是一个计数器,用于更新目前的评价次数。
  • 第6-7行 指定使用的指标例如IGD或者HV
  • 第10-12行 指定算法需要使用的种群, 当前种群,子代种群,合并种群
  • 第14-18行 分别为变异算子,交叉算子,选择算子和用于控制多样性的距离

变量初始化

  • 第23-25行 分别初始化种群大小和最大评价次数,以及评价指标,但是评价指标是可选的而其余两行是必选的。
  • 第28-29行 初始化种群和迭代次数
  • 第34-36行 获取变异,交叉和选择算子

初始化种群

  • 个体初始化,评价,并将这个个体加入种群中

算法主循环

进化生成新个体
  • 第55行,使用populationsize/2是因为crossover是由两个父代生成两个子代。
非支配排序
  • 第74行,将种群合并
  • 第77行,生成一个ranking对象已准备将种群进行配置排序
  • 第79行,remain指的是新的population中剩余的个体数量
  • 第80行,初始化rank索引
  • 第81-82行, 清空front和population,因为其中保留有上一代中的种群信息
  • 第85行,保存rank
  • 第87-103行,如果新的种群剩下有个体的空间即remain>0并且可以容纳下这整个front;则计算front层中的拥挤距离;将front中所有个体容纳进population中;将种群中剩余个体数量remain减去已经用了的空间;front的索引自增1;然后将rank[index]中的个体存进population中直到population中剩余的个体数量不能支持整个rank.
  • 第106行,进入的条件是remain<font.size, 则将front中的个体按照拥挤距离进行排序,并且将remain剩余的部分填满;然后将remain设置为0.
使用指标
  • 这段代码展示了如何在NSGA-II代码中使用指标。特别地,它发现了算法需要计算的次数,以获得一个HV大于True PF的HV的时间。

返回函数

  • 返回达到0.98的真实HV所需要的进化次数
  • 返回最前沿的PF
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DrawSky 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 以NSGA-II为例
  • NSGAII.java 类
    • execute()函数
      • 变量声明
      • 变量初始化
      • 初始化种群
      • 算法主循环
    • 返回函数
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档