前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Manytasking Jmetal 代码反向解析 1_MATP 测试函数集

Manytasking Jmetal 代码反向解析 1_MATP 测试函数集

作者头像
演化计算与人工智能
发布2020-08-14 16:26:50
4540
发布2020-08-14 16:26:50
举报

  • 这是我在写 Manytask optimization 时的笔记,代码地址可以下载[1]
  • 打开文件夹如下目录,选择 benchmark 中的任意一个测试函数集,此时我们选择MATP1

MATP1

代码语言:javascript
复制
package momfo.problems.benchmarks;

import java.io.IOException;

import momfo.core.Problem;
import momfo.core.ProblemSet;
import momfo.problems.base.*;


public class MATP1 {

 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);

  MMDTLZ prob = new MMDTLZ(2, 50, 1, -100,100);
  prob.setGType("sphere");


  double[][] matrix = IO.readMatrixFromFile("MData/M1/M1_"+taskID+".txt");

  double shiftValues[] = IO.readShiftValuesFromFile("SVData/S1/S1_"+taskID+".txt");

  prob.setRotationMatrix(matrix);
  prob.setShiftValues(shiftValues);

  ((Problem)prob).setName("MATP1-"+taskID);

  problemSet.add(prob);

  return problemSet;
 }

}

  • int taskNumber=50; 表示 MATP1 问题设置的任务个数是 50,初始化 problemSet 作为一个容器以承载每一个被初始化后的实际 MATP1 问题。
  • problemSet.add(getT(i).get(0)); 意味着此时需要关注的是getT函数,从
代码语言:javascript
复制
MMDTLZ prob = new MMDTLZ(2, 50, 1, -100,100);
prob.setGType("sphere");

看出 MATP_1 是一个双目标的问题,并且决策变量个数为 50,决策变量最小值为-100,最大值为 100,而 G 函数的类型为sphere,而只要是双目标的函数使用的 H 函数都是circle

代码语言:javascript
复制
// MMDTLZ
if (numberOfObjectives == 2)
   hType_ = "circle";
  else
   hType_ = "sphere";

  • 通过
代码语言:javascript
复制
double[][] matrix = IO.readMatrixFromFile("MData/M1/M1_"+taskID+".txt");

double shiftValues[] = IO.readShiftValuesFromFile("SVData/S1/S1_"+taskID+".txt");
  • 可知 matrix[][]其中保存有旋转函数,根据 taskID 具有不同的旋转角度,shiftValues 则保存了偏移向量,通过不同的旋转函数和偏移向量可以保证 MATP 问题中的不同任务即使具有相同的帕累托前沿,但是对应的决策变量距离和位置却完全不同。

注意在 MATP2 中仅仅设置 G 函数的形状为spherealpha值 1。(后期通关观察得知,alpha 值是用于计算 cos 函数的)


MATP2

代码语言:javascript
复制
public class 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;
 }

}

和 MATP1 问题不同的是 MATP2 问题设置 G 函数为mean,设置 H 函数为concave,最终形状为concave并且是根据ZDT问题改编的,而不是DTLZ问题,表示有 50 个变量,并且 K 值为 1,根据ZDT问题的默认函数来看,ZDT问题构造的都是双目标问题。

代码语言:javascript
复制
public MMZDT(int numberOfVariables, int k, double lg, double ug) {
  numberOfObjectives_ = 2;
  numberOfVariables_ = numberOfVariables;
  k_ = k;

  gType_ = "sphere";
  f1Type_ = "linear";
  hType_ = "convex";

MATP3

代码语言:javascript
复制
package momfo.problems.benchmarks;

import java.io.IOException;

import momfo.core.Problem;
import momfo.core.ProblemSet;
import momfo.problems.base.*;


public class MATP3 {

 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(10,  1, -5,5);
  prob.setGType("rosenbrock");
  prob.setHType("concave");


  double[][] matrix = IO.readMatrixFromFile("MData/M3/M3_"+taskID+".txt");

  double shiftValues[] = IO.readShiftValuesFromFile("SVData/S3/S3_"+taskID+".txt");

  prob.setRotationMatrix(matrix);
  prob.setShiftValues(shiftValues);

  ((Problem)prob).setName("MATP3-"+taskID);

  problemSet.add(prob);

  return problemSet;
 }

}

和 MATP1 以及 MATP2 问题不同的是 MATP3 问题设置 G 函数为rosenbrock,设置 H 函数为concave,最终形状为concave并且是根据ZDT问题改编的,而不是DTLZ问题,表示有 50 个这样的任务,并且 K 值为 1,根据ZDT问题的默认函数来看,ZDT问题构造的都是双目标问题,与 MATP2 问题不同的是使用 10 个变量,并且变量范围为[-5,5]而不是[-50,50]


MATP4

代码语言:javascript
复制
import java.io.IOException;

import momfo.core.Problem;
import momfo.core.ProblemSet;
import momfo.problems.base.*;


public class MATP4 {

 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);

  MMDTLZ prob = new MMDTLZ(2, 50, 1, -2,2);
  prob.setGType("rastrigin");


  double[][] matrix = IO.readMatrixFromFile("MData/M4/M4_"+taskID+".txt");

  double shiftValues[] = IO.readShiftValuesFromFile("SVData/S4/S4_"+taskID+".txt");

  prob.setRotationMatrix(matrix);
  prob.setShiftValues(shiftValues);

  ((Problem)prob).setName("MATP4-"+taskID);

  problemSet.add(prob);

  return problemSet;
 }

}

可以看出MATP4使用的是 DTLZ 函数其中具有两个目标函数,具有 50 个决策变量,alpha 值为 1,上界为 2 下界为-2.使用的 G 函数为rastrigin,使用的 H 函数为sphere

代码语言:javascript
复制
//MMDTLZ
if (numberOfObjectives == 2)
   hType_ = "circle";
  else
   hType_ = "sphere";

MATP5

代码语言:javascript
复制
package momfo.problems.benchmarks;

import java.io.IOException;

import momfo.core.Problem;
import momfo.core.ProblemSet;
import momfo.problems.base.*;


public class MATP5 {

 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,  -1,1);
  prob.setGType("ackley");
  prob.setHType("convex");


  double[][] matrix = IO.readMatrixFromFile("MData/M5/M5_"+taskID+".txt");

  double shiftValues[] = IO.readShiftValuesFromFile("SVData/S5/S5_"+taskID+".txt");

  prob.setRotationMatrix(matrix);
  prob.setShiftValues(shiftValues);

  ((Problem)prob).setName("MATP5-"+taskID);

  problemSet.add(prob);

  return problemSet;
 }

}

决策变量个数为 50,k 为 1,变量最小范围为-1,变量最大范围为 1,G 函数为ackley,H 函数为convex


MATP6

代码语言:javascript
复制
package momfo.problems.benchmarks;

import java.io.IOException;

import momfo.core.Problem;
import momfo.core.ProblemSet;
import momfo.problems.base.*;


public class MATP6 {

 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);

  MMDTLZ prob = new MMDTLZ(2, 50, 1, -50,50);
  prob.setGType("griewank");


  double[][] matrix = IO.readMatrixFromFile("MData/M6/M6_"+taskID+".txt");

  double shiftValues[] = IO.readShiftValuesFromFile("SVData/S6/S6_"+taskID+".txt");

  prob.setRotationMatrix(matrix);
  prob.setShiftValues(shiftValues);

  ((Problem)prob).setName("MATP6-"+taskID);

  problemSet.add(prob);

  return problemSet;
 }

}

目标函数 2 个,50 个决策变量,alpha 值设置为 1,下边界为-50,上边界为 50,G 函数为griewank,H 函数为circle

MATP 算例总结

代码语言:javascript
复制
float[] rgb1 = {0, 0, 0};//黑色-circle
        float[] rgb2 = {(float) 0, (float) 0, (float) 139};//蓝黑-concave
        float[] rgb3 = {(float) 255, (float) 0, (float) 0};//红色-concave
        float[] rgb4 = {(float) 0, (float) 255, (float) 0};//绿色-circle
        float[] rgb5 = {(float) 255, (float) 255, (float) 0};//黄色-convex
        float[] rgb6 = {(float) 139, (float) 69, (float) 19};//巧克力色-circle


        float alpha = (float) 1;
        Scatter scatter1 = tools.Setpoint(TruePFT1_Matrix, rgb1, alpha, 20);
        Scatter scatter2 = tools.Setpoint(TruePFT2_Matrix, rgb2, alpha, 15);
        Scatter scatter3 = tools.Setpoint(TruePFT3_Matrix, rgb3, alpha, 8);
        Scatter scatter4 = tools.Setpoint(TruePFT4_Matrix, rgb4, alpha, 10);
        Scatter scatter5 = tools.Setpoint(TruePFT5_Matrix, rgb5, alpha, 6);
        Scatter scatter6 = tools.Setpoint(TruePFT6_Matrix, rgb6, alpha, 5);

Summary

参考资料

[1]

地址可以下载: http://www.bdsc.site/websites/MTO/MO-ManyTask-Benchmarks.rar

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MATP1
    • 注意在 MATP2 中仅仅设置 G 函数的形状为sphere和alpha值 1。(后期通关观察得知,alpha 值是用于计算 cos 函数的)
    • MATP2
      • 和 MATP1 问题不同的是 MATP2 问题设置 G 函数为mean,设置 H 函数为concave,最终形状为concave并且是根据ZDT问题改编的,而不是DTLZ问题,表示有 50 个变量,并且 K 值为 1,根据ZDT问题的默认函数来看,ZDT问题构造的都是双目标问题。
      • MATP3
        • 和 MATP1 以及 MATP2 问题不同的是 MATP3 问题设置 G 函数为rosenbrock,设置 H 函数为concave,最终形状为concave并且是根据ZDT问题改编的,而不是DTLZ问题,表示有 50 个这样的任务,并且 K 值为 1,根据ZDT问题的默认函数来看,ZDT问题构造的都是双目标问题,与 MATP2 问题不同的是使用 10 个变量,并且变量范围为[-5,5]而不是[-50,50]
        • MATP4
          • 可以看出MATP4使用的是 DTLZ 函数其中具有两个目标函数,具有 50 个决策变量,alpha 值为 1,上界为 2 下界为-2.使用的 G 函数为rastrigin,使用的 H 函数为sphere
          • MATP5
            • 决策变量个数为 50,k 为 1,变量最小范围为-1,变量最大范围为 1,G 函数为ackley,H 函数为convex
            • MATP6
              • 目标函数 2 个,50 个决策变量,alpha 值设置为 1,下边界为-50,上边界为 50,G 函数为griewank,H 函数为circle
                • 参考资料
            • MATP 算例总结
            • Summary
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档