多目标优化非支配关系实现
时间:2022-07-23
本文章向大家介绍多目标优化非支配关系实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
非支配关系实现
规则
- 如果个体A在所有目标上都小于等于个体B且在有至少一个目标上小于个体B则称个体A支配B。
- 如果不存在个体A支配个体B的情况并且A在至少一个目标上比B小并且B在至少一个目标上比A小,则称A和B是非支配关系
matlab
% 遍历所有M个目标值
for obj_index=1:Global.M
if NewPop.obj(obj_index)<=Population(i).obj(obj_index)
% 如果目标值小于等于则计数值加1
offspringless_or_equal= offspringless_or_equal+1;
if NewPop.obj(obj_index)<Population(i).obj(obj_index)
% 如果目标值完全小于则计数值加1
offspringless=offspringless+1;
end
else parentless=parentless+1;
end
end
% 如果新解可以支配旧解
if((offspringless_or_equal==Global.M)&&(offspringless>0))
Population(i)=NewPop;
%如果两者非支配
elseif((offspringless>0)&&(parentless>0))
java
/**
* Compares two solutions.
*
* @param object1
* Object representing the first <code>Solution</code>.
* @param object2
* Object representing the second <code>Solution</code>.
* @return -1, or 0, or 1 if solution1 dominates solution2, both are
* non-dominated, or solution1 is dominated by solution22,
* respectively.
*/
public int compare(Object object1, Object object2) {
if (object1 == null)
return 1;
else if (object2 == null)
return -1;
Solution solution1 = (Solution) object1;
Solution solution2 = (Solution) object2;
int dominate1; // dominate1 indicates if some objective of solution1
// dominates the same objective in solution2. dominate2
int dominate2; // is the complementary of dominate1.
dominate1 = 0;
dominate2 = 0;
int flag; // stores the result of the comparison
// Test to determine whether at least a solution violates some
// constraint
if (violationConstraintComparator_.needToCompare(solution1, solution2))
return violationConstraintComparator_.compare(solution1, solution2);
/*
* if (solution1.getOverallConstraintViolation()!=
* solution2.getOverallConstraintViolation() &&
* (solution1.getOverallConstraintViolation() < 0) ||
* (solution2.getOverallConstraintViolation() < 0)){ return
* (overallConstraintViolationComparator_.compare(solution1,solution2));
* }
*/
// Equal number of violated constraints. Applying a dominance Test then
double value1, value2;
for (int i = 0; i < solution1.getNumberOfObjectives(); i++) {
// solution1.getNumberofbjectives中存储的是所有Task的目标函数数,而此处仅仅评价的是isChosen出来的目标函数
if (!isChosen_[i])
continue;
value1 = solution1.getObjective(i);
value2 = solution2.getObjective(i);
if (value1 < value2) {
flag = -1;
} else if (value1 > value2) {
flag = 1;
} else {
flag = 0;
}
if (flag == -1) {
dominate1 = 1;
}
if (flag == 1) {
dominate2 = 1;
}
}
if (dominate1 == dominate2) {
return 0; // No one dominate the other 两个解都至少有一个目标比另一个目标好
}
if (dominate1 == 1) {
return -1; // solution1 dominate 这几个函数的位置十分关键,如果两者非支配,return语句直接返回0值,此处还能进行到,必定是不满足以上条件。
}
return 1; // solution2 dominate
} // compare
} // DominanceComparator
better or worst
count=0;
frontnumbers=[];
for i=1:pop
for j=i:pop
if i==j
continue;
end
better=0;
worse=0;
if population(i).convio < population(j).convio
% convio是ZDT4-RC才会使用的属性
population(i).dominatedset=[population(i).dominatedset j];% 但是j是索引,不是个体还是需要注意!
population(i).dominatedsetlength=population(i).dominatedsetlength+1;% 支配解的数量
population(j).dominationcount=population(j).dominationcount+1;% 被支配解的数量
% 相对而言,如果j支配了i的话
elseif population(i).convio > population(j).convio
population(j).dominatedset=[population(j).dominatedset i];
population(j).dominatedsetlength=population(j).dominatedsetlength+1;
population(i).dominationcount=population(i).dominationcount+1;
else
% 最后是为非ZDT-RC问题设计的,因为非ZDT4-RC中没有convio参数
for k = 1:no_of_objs
if population(1).skill_factor == 1
if population(i).objs_T1(k) < population(j).objs_T1(k)
better=1;
elseif population(i).objs_T1(k) > population(j).objs_T1(k)
worse=1;
end
else
if population(i).objs_T2(k) < population(j).objs_T2(k)
better=1;
elseif population(i).objs_T2(k) > population(j).objs_T2(k)
worse=1;
end
end
end
if worse==0 && better>0 %如果j在任何一个目标上都不比i好,并且i在一个目标上比j好
population(i).dominatedset=[population(i).dominatedset j];
population(i).dominatedsetlength=population(i).dominatedsetlength+1;
population(j).dominationcount=population(j).dominationcount+1;
elseif better==0 && worse>0%如果i在任何一个目标上都不比i好,并且j在一个目标上比j好
population(i).dominationcount=population(i).dominationcount+1;
population(j).dominatedset=[population(j).dominatedset i];
population(j).dominatedsetlength=population(j).dominatedsetlength+1;
end
end
end
% 如果没有解可以支配当前解,则被认为是非支配前沿
if population(i).dominationcount==0
population(i).front=1;
count=count+1;
end
end
- [快学Python3]基础知识
- [快学Python3]开发工具
- [快学Python3]解析器
- [快学Python3]函数
- [快学Python3]循环控制
- [linux][kprobe]谁动了我的文件---使用kprobe找到目标进程
- [快学Python3]if条件控制
- codeforces 767A Snacktower(模拟)
- [快学Python3]Sets(集合)
- [nptl][rwlock]pthread rwlock原理分析
- [快学Python3]Dictionary(字典)
- [快学Python3]List(列表)
- [快学Python3]Tuple(元组)
- HDU 1248 寒冰王座(完全背包裸题)
- 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 数组属性和方法
- 【小白学PyTorch】7 最新版本torchvision.transforms常用API翻译与讲解
- 小白学PyTorch | 8 实战之MNIST小试牛刀
- 干货:用好VSCode这13款插件和8个快捷键,工作效率提升10倍
- 使用dplyr包对表格整理
- 安利 5 个拍案叫绝的 Matplotlib 骚操作!
- 多媒体程序开发
- 本地 IDE 已废!编辑器大结局!GitHub 的云 VSCode 实测
- 实战 | Python 编写端口扫描器
- 我这几年踩过的十个坑,每一条都是血泪教训
- 在 Python 中如何快速创建一个只读字典?
- 现场打脸:如何使用Selenium批量上传文件?
- 一日一技:FastAPI如何关闭接口文档?
- 什么叫做类比,为什么有些 Python 入门教程结构不合理?
- 贼好用的 Java 工具类库,墙裂推荐!
- 万字长文,Thread 类源码解析!