Experimentation with jMetal
- 本文以Jmetal官网文档为基础,结合自身理解
链接如下
Jmetal 4 使用指南一
Jmetal 4 使用指南二
Jmetal 4 使用指南三
- 如果你还不了解NSGA-II可以参考
NSGA-II入门
多目标优化拥挤距离计算
多目标优化按支配关系分层实现
Experimentation Example: NSGAIIStudy
- jMetal包括jmetal.experiments.Experiment类,旨在帮助进行算法的实验研究。在当前状态下,它可以指示:要运行的元启发法,要解决的问题,要应用的质量指标以及要执行的独立运行的次数。结果,它将生成一个文件夹,其中包含所有获得的近似值集和指标值.
- 一个包含指标平均值和方差的latex文档
- 能够生成箱式图的R脚本
- R脚本生成latex表格,并应用Wilcoxon统计检验结果
- Friedman test的latex表格
- 这里我们通过研究NSGA-II中不同交叉概率1.0, 0.9, 0.8, and 0.7.作为一个例子来介绍Jmetal的用法
Defining the experiment 定义实验
- 首先创建一个子类NSGAIIStudy来继承Experiment这个虚类
1. 实现algorithmSettings方法
- 在每次独立运行,每种问题和算法时都会自动调用此方法。关键是必须创建具有所需参数化的Settings对象才能执行算法:
- 第29行new一个HashMap数组,用于传递不同的算法参数,以在第46-47行new不同的NSGAII实例。
2.new一个NSGAIIStudy实例
代码语言:javascript复制 public static void main(String[] args) throws JMException, IOException {
NSGAIIStudy exp = new NSGAIIStudy() ; // exp = experiment
3.设置实验名称
- 这个实验名称会在后续用在生成Latex实验结果中
exp.experimentName_ = "NSGAIIStudy" ;
4.设置实验参数
- 注意Problem个数和算法PF总个数需要对应
- 并且注意 问题中的目标数量和PF中的目标数量需要相等
5. 设置结果输出地址和PF存储地址
- 前者用于设定输出的地址,后者用于加载真实前沿
PS:输出结果地址为绝对地址更好!
6. 初始化Settings
7. 设定独立运行次数
8. 初始化实验
9. 设置线程个数
- 线程个数默认为1,这里可以设为多个 (更多更快呀)
// Run the experiments
int numberOfThreads ;
exp.runExperiment(numberOfThreads = 6) ;
10.评价指标和LaTex 表格
代码语言:javascript复制 exp.generateQualityIndicators() ;
// Generate latex tables (comment this sentence is not desired)
exp.generateLatexTables() ;
11. 生成箱型图
代码语言:javascript复制 // Configure the R scripts to be generated
int rows ;
int columns ;
String prefix ;
String [] problems ;
rows = 2 ;
columns = 3 ;
prefix = new String("Problems");
problems = new String[]{"ZDT1", "ZDT2","ZDT3", "ZDT4", "DTLZ1", "WFG2"} ;
boolean notch ;
exp.generateRBoxplotScripts(rows, columns, problems, prefix, notch = true, exp) ;
exp.generateRWilcoxonScripts(problems, prefix, exp) ;
- rows,columns分别指示图的行和列数,notch用于指示是否将其画为凹的箱型图。
12. Wilcoxon rank-sum test 和 Friedman test
代码语言:javascript复制 exp.generateRWilcoxonScripts(problems, prefix, exp) ;
// Applying Friedman test
Friedman test = new Friedman(exp);
test.executeTest("EPSILON");
test.executeTest("HV");
test.executeTest("SPREAD");