MTO和MaTO MMZDT

时间:2022-07-23
本文章向大家介绍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;
   }
  }
 }
  1. 目标数量都设置为 2
  2. 初始化默认 G 函数为 sphere,F1 函数为 line,H 函数 convex,注意:在 MMDTLZ 问题中具体只使用了 G 函数了,完全没有 F1 函数,对 H 函数没有定义,只是为了保持一致性才加上了 H 函数
  3. 看出 k 应该是使用的重要的变量,此处设置 k 为 1,和 MMDTLZ 一样,k 之前的变量被设置为[0,1]而其后的变量都设置为[lg,up]
  4. 和 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