MATP ManyTask Multitask Problem 和 Solution 的变量范围
时间:2022-07-23
本文章向大家介绍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
- 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 数组属性和方法
- 详解Gson的TypeToken原理
- 时间序列分解和异常检测方法应用案例
- 为什么机器学习应用交易那么难(上)
- 快速学习-sentinel动态规则扩展
- Git-git diff命令结果解析
- 快速学习-sentinel实时监控
- Git技术干货!工作中Git的使用实践和常用命令合集!
- gremlin-both()与bothE().bothV()的区别
- C# Time.deltaTime 增量时间
- Docker--docker ps 命令与结果解析
- Junit5系列-Junit5中@DisplayName自定义名称
- Junit5系列-Junit5中Assertions断言类
- 使用libev监视文件夹下文件(夹)属性变动的方案和实现
- C++拾取——stl标准库中集合交集、并集、差集、对称差方法
- netty结合Protostuff传输对象案例,单机压测秒级接收35万个对象