专栏首页人工智能与演化计算成长与进阶MATP ManyTask Multitask Problem 和 Solution 的变量范围

MATP ManyTask Multitask Problem 和 Solution 的变量范围

“参考文献

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

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

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

Problem 类中的 scaleVariable 函数

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

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 测试集

ProblemSet matp1;
ProblemSet matp3;
matp1 = MATP1.getProblem();
matp3 = MATP3.getProblem();

2. 使用 MATP1 初始化 SolutionSet testSSvarMATP1

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 问题

 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 函数我们还有一些东西没有弄明白

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]

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

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]; 获得

  • 在举个例子
testSSvarMATP1.get(0).getUnifiedLowerLimit();
testSSvarMATP1.get(0).getUnifiedUpperLimit();
    //0
    //1

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

double vars[] = scaleVariables(solution);

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

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

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

//测试迁移时的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

本文分享自微信公众号 - DrawSky(wustcsken),作者:CloudXu

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 进化算法个体和指标的一致性

    DrawSky
  • word封面背景及水印背景

    DrawSky
  • [DeeplearningAI笔记]序列模型3.9-3.10语音辨识/CTC损失函数/触发字检测

    吴恩达老师课程原地址: https://mooc.study.163.com/smartSpec/detail/1001319001.htm

    DrawSky
  • 211渣硕,海投200+家Java岗(面40,过7),收获多份offer!

    Java架构技术
  • 企业云计算部署需要更好的网络

    云计算是数据中心网络现代化的关键推动因素之一。企业正在加紧改造内部基础设施,以使其更容易地配置服务器和存储资源,而要做到这一点的最好办法是打造一个一流的网络。 ...

    静一
  • 不要让大数据成大窥探

    上段时间万维网之父Sir Tim Berners-Lee出席一活动,就互联网隐私、大数据谈了一些个人看法。他称,提高对用户隐私的保护,对互联网来说很有必要,因为...

    CSDN技术头条
  • Apache Httpd 安装 AH00558错误

    然后修改 ServerName localhost:80 为 localhost 或者取消注释这行。

    HoneyMoose
  • 2020已来,大数据和AI领域必须了解的六大趋势

    包括阿里巴巴达摩院在内的全球顶级科研机构纷纷对2020年的科技行业做出了预测,过去的一年,大数据和AI行业继续蓬勃发展:

    PP鲁
  • 业界 | 马斯克参加反对AI武器宣言,全球2400名研究者共同签名

    在2018年7月18日召开的斯德哥尔摩IJCAI上,马斯克和一个成立仅三年的组织“未来生命研究所”再一次被推上舆论的风口浪尖。

    大数据文摘
  • VRVNAC软件携带恶意程序 公安等行业用户可能受影响

    近期有公安、气象等行业若干单位反馈,他们使用“火绒安全软件”检测出VRVNAC“桌面监控”软件携带恶意程序,请火绒确认。经分析,该产品所使用的功能组件(Adva...

    用户6477171

作者介绍

精选专题

活动推荐

扫码关注云+社区

领取腾讯云代金券