MTO和MaTO MMZDT
Manytasking Jmetal 代码反向解析 3_MMZDT
- 这是我在写 Manytask optimization 时的笔记,代码地址可以下载[1]“相关文献[1]反向解析_1 Manytasking optimization MATP[2] >[2]旋转矩阵[3] >[3]Jmetal Problem 和 Problem Set 的变量范围[4] >[4]MATP ManyTask Multitask Problem 和 Solution 的变量范围[5] >[5]MATP1 生成测试 SolutionSet[6] >[6]Manytasking MATP MOOMFO 中 G 函数[7] >[7]Manytasking Optimization MMDTLZ[8]
MATP2
public static ProblemSet getProblem() throws IOException {
int taskNumber=50;
ProblemSet problemSet = new ProblemSet(taskNumber);
for(int i=1;i<=taskNumber;i++)
problemSet.add(getT(i).get(0));
return problemSet;
}
public static ProblemSet getT(int taskID) throws IOException {
ProblemSet problemSet = new ProblemSet(1);
MMZDT prob = new MMZDT(50, 1, -100,100);
prob.setGType("mean");
prob.setHType("concave");
double[][] matrix = IO.readMatrixFromFile("MData/M2/M2_"+taskID+".txt");
double shiftValues[] = IO.readShiftValuesFromFile("SVData/S2/S2_"+taskID+".txt");
prob.setRotationMatrix(matrix);
prob.setShiftValues(shiftValues);
((Problem)prob).setName("MATP2-"+taskID);
problemSet.add(prob);
return problemSet;
}
- 看的出来,MATP2 中也有 50 个任务,并且下限为-100,上限为 100,G 函数为 mean,T 函数为 concave
MMZDT 初始化与生成
public class MMZDT extends Problem {
Integer k_;
String gType_;
String f1Type_;
- 首先可以看出 MMZDT 也是集成了 Problem
public MMZDT(int numberOfVariables, int k, double lg, double ug) {
numberOfObjectives_ = 2;
numberOfVariables_ = numberOfVariables;
k_ = k;
gType_ = "sphere";
f1Type_ = "linear";
hType_ = "convex";
upperLimit_ = new double[numberOfVariables_];
lowerLimit_ = new double[numberOfVariables_];
for (int var = 0; var < k_; var++) {
lowerLimit_[var] = 0.0;
upperLimit_[var] = 1.0;
} // for
for (int var = k_; var < numberOfVariables; var++) {
lowerLimit_[var] = lg;
upperLimit_[var] = ug;
}
shiftValues_ = new double[numberOfVariables_ - k_];
for (int i = 0; i < shiftValues_.length; i++)
shiftValues_[i] = 0;
rotationMatrix_ = new double[numberOfVariables_ - k_][numberOfVariables_ - k_];
for (int i = 0; i < rotationMatrix_.length; i++) {
for (int j = 0; j < rotationMatrix_.length; j++) {
if (i != j)
rotationMatrix_[i][j] = 0;
else
rotationMatrix_[i][j] = 1;
}
}
}
- 目标数量都设置为 2
- 初始化默认 G 函数为 sphere,F1 函数为 line,H 函数 convex,注意:在 MMDTLZ 问题中具体只使用了 G 函数了,完全没有 F1 函数,对 H 函数没有定义,只是为了保持一致性才加上了 H 函数
- 看出 k 应该是使用的重要的变量,此处设置 k 为 1,和 MMDTLZ 一样,k 之前的变量被设置为[0,1]而其后的变量都设置为[lg,up]
- 和 DTLZ 一样,旋转矩阵和 shift 和 XII 中的变量维度一致,k 维度之前的变量不会受到偏移向量和旋转矩阵的影响。
evaluate
scaleVariables
- 将统一表示的 solution 从[0,1]空间恢复到原有的空间,具体可以参照MATP ManyTask Multitask Problem 和 Solution 的变量范围[9]
XI 和 XII
- 将 k 维之前的设置为 XI 而其后的设置为 XII,具体可以参照Manytasking Optimization MMDTLZ[10]
对 XII 进行偏移和旋转
- 和 MMDTLZ 中相同,具体可以参照Manytasking Optimization MMDTLZ[11]
xII = transformVariables(xII);
前方高能,不一样的地方来了
evalF1(xI)
- 对于双目标中 XI 中只有一个元素,然而也停不住其作妖的步伐
double f1 = evalF1(xI);
evalF1
double evalF1(double[] xI) {
if (f1Type_.equalsIgnoreCase("linear"))
return F1_linear(xI);
else if (f1Type_.equalsIgnoreCase("nonlinear"))
return F1_nonlinear(xI);
else {
System.out.println("Error: f1 function type " + f1Type_ + " invalid");
return Double.NaN;
}
}
F1_linear(xI) and F1_nonlinear(xI)
double F1_linear(double xI[]) {
double sum = 0;
for (int i = 0; i < xI.length; i++)
sum += xI[i];
return sum / xI.length;
}
double F1_nonlinear(double xI[]) {
double r = 0;
for (int i = 0; i < xI.length; i++)
r += (xI[i] * xI[i]);
r = Math.sqrt(r);
return 1 - Math.exp(-4 * r) * Math.pow(Math.sin(5 * Math.PI * r), 4);
}
- 注意:
- 虽然对于双目标 ZDT 问题,XI 是个只有一个元素的 double[]数组,但是注意其返回值却是根据 XI 计算得到的一个 double 类型的返回值
evalG(XII)
double g = evalG(xII) + 1;
- 和 MMDTLZ 中相同,具体可以参照Manytasking MATP MOOMFO 中 G 函数[12]
double evalG(double[] xII) throws JMException {
if (gType_.equalsIgnoreCase("sphere"))
return GFunctions.getSphere(xII);
else if (gType_.equalsIgnoreCase("rosenbrock"))
return GFunctions.getRosenbrock(xII);
else if (gType_.equalsIgnoreCase("ackley"))
return GFunctions.getAckley(xII);
else if (gType_.equalsIgnoreCase("griewank"))
return GFunctions.getGriewank(xII);
else if (gType_.equalsIgnoreCase("rastrigin"))
return GFunctions.getRastrigin(xII);
else if (gType_.equalsIgnoreCase("mean"))
return GFunctions.getMean(xII);
else {
System.out.println("Error: g function type " + gType_ + " invalid");
return Double.NaN;
}
}
前方高能,不一样的地方来了
f2 = g * evalH(f1, g)
- f1 是根据 XI 计算的,g 是根据 XII 计算的,因此 f2 是根据 solution 的所有维度进行计算的
double evalH(double f1, double g) {
if (hType_.equalsIgnoreCase("convex"))//凸的
return H_convex(f1, g);
else if (hType_.equalsIgnoreCase("concave"))//凹的
return H_nonconvex(f1, g);
else {
System.out.println("Error: f1 function type " + f1Type_ + " invalid");
return Double.NaN;
}
}
double H_convex(double f1, double g) {
return 1 - Math.pow(f1 / g, 0.5);
}
double H_nonconvex(double f1, double g) {
return 1 - Math.pow(f1 / g, 2);
}
目标函数计算结果
double f1 = evalF1(xI);
double g = evalG(xII) + 1;
double f2 = g * evalH(f1, g);
solution.setGFunValue(g);
// System.out.println("g: " + g);
solution.setObjective(startObjPos_, f1);
solution.setObjective(startObjPos_ + 1, f2);
Summary
参考资料
[1]地址可以下载: http://www.bdsc.site/websites/MTO/MO-ManyTask-Benchmarks.rar
[2]反向解析_1 Manytasking optimization MATP: https://blog.csdn.net/u013555719/article/details/103569252
[3]旋转矩阵: https://www.cnblogs.com/zhoug2020/p/7842808.html
[4]Jmetal Problem和Problem Set的变量范围: https://blog.csdn.net/u013555719/article/details/103595998
[5]MATP ManyTask Multitask Problem和Solution的变量范围: https://blog.csdn.net/u013555719/article/details/103599862
[6]MATP1生成测试SolutionSet: https://blog.csdn.net/u013555719/article/details/103603894
[7]Manytasking MATP MOOMFO 中G函数: https://blog.csdn.net/u013555719/article/details/103615605
[8]Manytasking Optimization MMDTLZ: https://blog.csdn.net/u013555719/article/details/103617911
[9]MATP ManyTask Multitask Problem和Solution的变量范围: https://blog.csdn.net/u013555719/article/details/103599862
[10]Manytasking Optimization MMDTLZ: https://blog.csdn.net/u013555719/article/details/103617911
[11]Manytasking Optimization MMDTLZ: https://blog.csdn.net/u013555719/article/details/103617911
[12]Manytasking MATP MOOMFO 中G函数: https://blog.csdn.net/u013555719/article/details/103615605
- 【美团技术团队博客】前端组件化开发实践
- Spring中Bean
- 跟Google学写代码--Chromium/base--windows_version源码学习及应用
- 一步步教你弹性框架-下篇
- R语言与机器学习(分类算法)朴素贝叶斯算法
- 【美团技术团队博客】RACSignal的Subscription深入分析
- 谈谈个人网站的建立(八)—— 缓存的使用
- 【编程基础】System.arraycopy()和 Arrays.copyOf()
- 移动端 模拟手机联系人触摸A~Z导航
- 谈谈个人网站的建立(七)—— 那些建站必备的插件
- 【美团技术团队博客】Linux资源管理之cgroups简介
- 谈谈个人网站的建立(六)—— 数据库同步
- Javascript解析机制 执行机制
- Tomcat9源码——编译环境搭建
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- pytorch 常用函数 max ,eq说明
- 解析python 中/ 和 % 和 //(地板除)
- python右对齐的实例方法
- PHP的PDO预处理语句与存储过程
- PHP工厂模式的日常使用
- 使用ucenter实现多站点同步登录的讲解
- 实例讲解PHP验证邮箱是否合格
- PHP的mysqli_ssl_set()函数讲解
- 针对PHP开发安全问题的相关总结
- 实例分析PHP将字符串转换成数字的方法
- Laravel5.4框架使用socialite实现github登录的方法
- PHP删除字符串中非字母数字字符方法总结
- 实例讲解php将字符串输出到HTML
- PHP的mysqli_stat()函数讲解
- php中访问修饰符的知识点总结