Jmetal 4+ 使用指南一
以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 themaximum 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