MTO Jmetal IGD计算BUG
时间:2022-07-23
本文章向大家介绍MTO Jmetal IGD计算BUG,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 大家知道只要有种群的目标函数值和PF前沿,按道理将是可以计算IGD的
错误分析
- 遇到以下错误:
- 追踪错误后发现,错误来源于:
- 这里的front[i]越界了,在MTO中,计算IGD时,max和min应该是target任务的obj维度,而不是总的维度。举例,一般情况下MTO中一个任务的IGD根据skillfactor的不同应该是inf,inf,0.1,0.1这种,所以是四维的。但是单个问题的PF其实是2维的或者3维的,也就是说min和max都是二维和三维的因此,当j迭代到2的时候,但是maxmumvalue数组的最大索引是1,所以这个时候会出现数组的越界。
证实猜想
- 经过单步调试,可以看见front[i]的维度是4,max和min的维度都是2,这样j到2时,表示遍历第三个维度,就会越界!
- 这是因为在初始化solution时,我们使用的是Problemset,这个参数默认的是统一空间的维度,即问题的最大维度
Solution sol = new Solution(problemSet);
- 这种方式是initialize 种群的时候是可取的,但是计算IGD时是不可取的。
解决方案
- 可以通过departpopulation()函数按照skillfactor将种群重新分成两组,并且每组的obj的数目和其skillfactor的保持一致。
//用于将整个大种群划分为分配给不同任务的子种群
void departpopulation() {
// resPopulation 是一个Solution的集合数组
resPopulation = new SolutionSet[problemSet_.size()];
for (int i = 0; i < problemSet_.size(); i++)
resPopulation[i] = new SolutionSet();
for (int i = 0; i < population.size(); i++) {
// 因为优化后后的种群中每个个体有一个Skill_factors,必须要将每个个体按照其skill_factor分类
Solution sol = population.get(i);
int pid = sol.getSkillFactor();
//start 和 end 时目标函数在Problemset中的索引
int start = problemSet_.get(pid).getStartObjPos();
int end = problemSet_.get(pid).getEndObjPos();
Solution newSolution = new Solution(end - start + 1);
for (int k = start; k <= end; k++) {
//复制个体目标值
newSolution.setObjective(k - start, sol.getObjective(k));
//别忘了复制个体决策变量函数值
newSolution.setDecisionVariables(sol.getDecisionVariables());
}
resPopulation[pid].add(newSolution);
}
}
特别注意其中new solution 时候的方式Solution newSolution = new Solution(end - start + 1);
,以及对目标进行赋值时的方式,只根据特定任务赋值, newSolution.setObjective(k - start, sol.getObjective(k))
,因此此时其目标函数是end-start+1,而不是统一空间的4.
下图是此解决方案用于三目标问题时的调试结果
证明提出的方法可以解决这个问题!
最终代码
- 最终,我们的IGD代码修改为:
void getIGD(SolutionSet pop) {
SolutionSet resPopulation = new SolutionSet();
for (int i = 0; i < pop.size(); i++) {
Solution sol = pop.get(i);
int pid = sol.getSkillFactor();
//start 和 end 时目标函数在Problemset中的索引
int start = problemSet.get(pid).getStartObjPos();
int end = problemSet.get(pid).getEndObjPos();
//最关键的是这里,需要对目标值修改为当前任务目标个数
//否则会出bug,因为统一空间的目标个数是一定的
Solution newSolution = new Solution(end - start + 1);//
for (int k = start; k <= end; k++) {
//复制个体目标值
newSolution.setObjective(k - start, sol.getObjective(k));
//别忘了复制个体决策变量函数值
newSolution.setDecisionVariables(sol.getDecisionVariables());
}
resPopulation.add(newSolution);
}
String pf1 = "PF/" + problemSet.get(1).getHType() + ".pf";
QualityIndicator indicator1 = new QualityIndicator(problemSet.get(1), pf1);
double igd1 = indicator1.getIGD(resPopulation);
System.out.println("IGD" + form.format(igd1));
}
- 谈谈WCF中的Data Contract(4):WCF Data Contract Versioning
- 如何在silverlihgt中使用右键
- WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)
- silverlight向服务器post数据类
- WCF技术剖析之十三:序列化过程中的已知类型(Known Type)
- 44 Amazing Silverlight 2.0 Screencasts
- CaseStudy(showcase)类库篇-用agTweener来实现动画效果
- CaseStudy(showcase)数据篇-Loading的制作
- CaseStudy(showcase)数据篇-加载图片
- CaseStudy(showcase)数据篇-从XML中获取数据
- CaseStudy(showcase)布局篇-全屏效果
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(14)-EasyUI缺陷修复与扩展
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码]
- 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 数组属性和方法
- 在Laravel5中正确设置文件权限的方法
- asp函数split()对应php函数explode()
- php获取目录下所有文件及目录(多种方法)(推荐)
- Python基于Twilio及腾讯云实现国际国内短信接口
- PHP __call()方法实现委托示例
- PHP中rename()函数的妙用讲解
- php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
- php实现小程序支付完整版
- Yii2框架视图(View)操作及Layout的使用方法分析
- php实现单笔转账到支付宝功能
- PHP使用Redis实现Session共享的实现示例
- windows10在visual studio2019下配置使用openCV4.3.0
- PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
- Python爬虫爬取新闻资讯案例详解
- Python代码需要缩进吗