前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MATP ManyTask Multitask Problem 和 Solution 的变量范围

MATP ManyTask Multitask Problem 和 Solution 的变量范围

作者头像
演化计算与人工智能
发布2020-08-14 16:35:12
3680
发布2020-08-14 16:35:12
举报

“参考文献

“https://blog.csdn.net/u013555719/article/details/103569252 > https://blog.csdn.net/u013555719/article/details/103595998

我们知道在多个任务一起优化的时候,任务即 Problem 有不同的变量范围,但是在多任务优化中我们需要使用相同的决策变脸对其进行表示而在解决问题时又要将其映射回自身的空间。

  • 因此在 MMDTLZ 问题 evalute 函数的第一句即会调用 Problem 类的 scaleVariables 函数
代码语言:javascript
复制
public void evaluate(Solution solution) throws JMException {
        double vars[] = scaleVariables(solution);

Problem 类中的 scaleVariable 函数

我认为这个函数在使用同一个 Problem 初始化的 solution 解决这个任务不会有任何问题,只有在初始化 solution 的 problem 和需要解决的 problem 之间决策变量范围不同的情况下,也就是说在迁移的过程中,这个函数才会发生作用.

代码语言:javascript
复制
protected double[] scaleVariables(Solution solution) throws JMException {
  Variable[] decisionVariables = solution.getDecisionVariables();
  double[] x = new double[numberOfVariables_];
    for (int i = 0; i < numberOfVariables_; i++)
   x[i] = decisionVariables[i].getValue();


  for (int i = 0; i < numberOfVariables_; i++) {
   double sl = decisionVariables[i].getLowerBound();
   double su = decisionVariables[i].getUpperBound();
   double pl = lowerLimit_[i];
   double pu = upperLimit_[i];
      x[i] = ((x[i] - sl) * (pu - pl)) / (su - sl) + pl;

  }
    return x;
 }

注意 scaleVariable 函数是 protected 属性的,因此此处我们做外部测试时需要将其修改为 public 权限。

测试

1. 使用 MATP1 和 MATP3 测试集

代码语言:javascript
复制
ProblemSet matp1;
ProblemSet matp3;
matp1 = MATP1.getProblem();
matp3 = MATP3.getProblem();

2. 使用 MATP1 初始化 SolutionSet testSSvarMATP1

代码语言:javascript
复制
SolutionSet testSSvarMATP1 = new SolutionSet();
        //初始化示例化的Solution
tools.InibasictestSolSet(testSSvarMATP1, matp1, -100, 100);
//Solution 0Variable
//0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0

3. 使用 testSSvarMATP1 解决 MATP1 问题

代码语言:javascript
复制
 double[] tempvar = matp1.get(0).scaleVariables(testSSvarMATP1.get(0));
//0.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0

可以看出,我们翻车了!!!

因为在我们的预想中,使用同一个任务初始化的 Solution 使用同一个问题进行 scale 结果应该不变,但是这里编程了-100,这表明 scaleVariables 函数我们还有一些东西没有弄明白

代码语言:javascript
复制
for (int i = 0; i < numberOfVariables_; i++) {
         double sl = decisionVariables[i].getLowerBound();
         double su = decisionVariables[i].getUpperBound();
         double pl = lowerLimit_[i];
         double pu = upperLimit_[i];
//            System.out.println("sl su pl pu" + sl+"  "+ su+"  "+ pl+"  "+ pu);
//对于MATP3问题
// sl su pl pu0.0  1.0  0.0  1.0
// sl su pl pu0.0  1.0  -5.0  5.0
// sl su pl pu0.0  1.0  -5.0  5.0
// sl su pl pu0.0  1.0  -5.0  5.0
// sl su pl pu0.0  1.0  -5.0  5.0
// sl su pl pu0.0  1.0  -5.0  5.0
// sl su pl pu0.0  1.0  -5.0  5.0
// sl su pl pu0.0  1.0  -5.0  5.0
// sl su pl pu0.0  1.0  -5.0  5.0
// sl su pl pu0.0  1.0  -5.0  5.0

如上是 MATP3 中 10 个变量的范围,MATP3 问题集变量范围[1]

这表明下面两句话出了问题

代码语言:javascript
复制
double sl = decisionVariables[i].getLowerBound();
double su = decisionVariables[i].getUpperBound();

由于 Variable 类是 Solution 输出的因此查看 Solution 类,结果发现其并没有 LowerLimit和 UpperLimit属性

而调用的是 ProblemSet 对象的 UnifiedUpperLimit ()和 getUnifiedUpperLimit()方法,而我们知道 ProblemSet 对象的 UnifiedUpperLimit ()和 getUnifiedUpperLimit()是不针对单个 Problem 的,也就是不为了单独一个 task 而设置的,其统一的决策变量空间为[0,1],具体可以参考一下博文[2],而 task 即单个 Problem 的上下界可以通过 double pl = lowerLimit_[i];double pu = upperLimit_[i]; 获得

  • 在举个例子
代码语言:javascript
复制
testSSvarMATP1.get(0).getUnifiedLowerLimit();
testSSvarMATP1.get(0).getUnifiedUpperLimit();
    //0
    //1

这样就解释的通了,因为 MMDTLZ 中有一句

代码语言:javascript
复制
double vars[] = scaleVariables(solution);

而将所有问题的决策空间强行从 1-0 之间转换到 Problem 类定义的范围中

因此使用全 0 编码的 MATP1 初始化的 1Solution,在 MATP1 和 MATP3 问题后缩放的结果是

代码语言:javascript
复制
printdoublearray
0.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0  -100.0
printdoublearray
0.0  -5.0  -5.0  -5.0  -5.0  -5.0  -5.0  -5.0  -5.0  -5.0

玩大一点,如果使用越界的解去缩放可以不?

例如一个第一个维度为 0,其余维度为 100 的 MATP1 初始化的 Solution

代码语言:javascript
复制
//测试迁移时的scaleVariables函数
        double[] tempvar = matp1.get(0).scaleVariables(testSSvarMATP1.get(3));
        //因为testSSvarMATP1本身就是使用MATP1问题集合初始化的,因此此处不会有变量范围的变化
        tools.printdoublearray(tempvar);
        //此时如果使用MATP3来对matp1做scale
        tempvar = matp3.get(0).scaleVariables(testSSvarMATP1.get(3));
        tools.printdoublearray(tempvar);
//Solution 3Variable
// 0.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0  100.0
printdoublearray
// 0.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0  19900.0
// printdoublearray
// 0.0  995.0  995.0  995.0  995.0  995.0  995.0  995.0  995.0  995.0

结论

Solution 编码到 0-1 之间,否则 evalute 的时候会超过 Problem 的范围,这种 Solution 是无效的

参考资料

[1]MATP3问题集变量范围: https://blog.csdn.net/u013555719/article/details/103569252

[2]0,1],具体可以[参考一下博文: https://blog.csdn.net/u013555719/article/details/103595998

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我们知道在多个任务一起优化的时候,任务即 Problem 有不同的变量范围,但是在多任务优化中我们需要使用相同的决策变脸对其进行表示而在解决问题时又要将其映射回自身的空间。
  • Problem 类中的 scaleVariable 函数
  • 我认为这个函数在使用同一个 Problem 初始化的 solution 解决这个任务不会有任何问题,只有在初始化 solution 的 problem 和需要解决的 problem 之间决策变量范围不同的情况下,也就是说在迁移的过程中,这个函数才会发生作用.
  • 注意 scaleVariable 函数是 protected 属性的,因此此处我们做外部测试时需要将其修改为 public 权限。
  • 测试
    • 1. 使用 MATP1 和 MATP3 测试集
      • 2. 使用 MATP1 初始化 SolutionSet testSSvarMATP1
        • 3. 使用 testSSvarMATP1 解决 MATP1 问题
        • 可以看出,我们翻车了!!!
          • 因为在我们的预想中,使用同一个任务初始化的 Solution 使用同一个问题进行 scale 结果应该不变,但是这里编程了-100,这表明 scaleVariables 函数我们还有一些东西没有弄明白
            • 这表明下面两句话出了问题
              • 由于 Variable 类是 Solution 输出的因此查看 Solution 类,结果发现其并没有 LowerLimit和 UpperLimit属性
                • 而调用的是 ProblemSet 对象的 UnifiedUpperLimit ()和 getUnifiedUpperLimit()方法,而我们知道 ProblemSet 对象的 UnifiedUpperLimit ()和 getUnifiedUpperLimit()是不针对单个 Problem 的,也就是不为了单独一个 task 而设置的,其统一的决策变量空间为[0,1],具体可以参考一下博文[2],而 task 即单个 Problem 的上下界可以通过 double pl = lowerLimit_[i];double pu = upperLimit_[i]; 获得
                • 这样就解释的通了,因为 MMDTLZ 中有一句
                • 而将所有问题的决策空间强行从 1-0 之间转换到 Problem 类定义的范围中
                  • 因此使用全 0 编码的 MATP1 初始化的 1Solution,在 MATP1 和 MATP3 问题后缩放的结果是
                    • 例如一个第一个维度为 0,其余维度为 100 的 MATP1 初始化的 Solution
                • 玩大一点,如果使用越界的解去缩放可以不?
                • 结论
                  • Solution 编码到 0-1 之间,否则 evalute 的时候会超过 Problem 的范围,这种 Solution 是无效的
                    • 参考资料
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档