IGD值介绍:

反世代距离评价指标(Inverted Generational Distance, IGD) 是一个综合性能评价指标。它主要通过计算每个在真实 Pareto前沿面上的点(个体)到算法获取的个体集合之间的最小距离和,来评价算法的收敛性能和分布性能。值越小,算法的综合性能包括收敛性和分布性能越好。计算公式如下,

与之类似的,还有GD(世代距离),该指标表示求出已知的最优帕累托面和问题理想帕累托面之间的间隔距离,该距离表示偏离真正边界的程度,值越大,偏离真正最优边界越远,收敛性越差。

JMetal部署

NSGA-III部署

JMetal中提供了很多超多目标优化算法,这里我们采用了NSGA-III与MOEA/D分别进行介绍(两者的配置过程大致相同,但是也存在差别,比如说参考点的选择上)
代码如下:

public class testnsgaiii {public static void main(String[] args) throws FileNotFoundException {double[] igds=new double[10];Problem<DoubleSolution> problem;problem = new DTLZ7(30, 15);//配置DTLZ函数,前面是自变量数,后面是目标维度数。String referenceParetoFront = "";// 真实PF,用于计算指标值,只在计算需要理想帕累托面指标中需要使用。//System.out.println("15");referenceParetoFront = "jmetal-problem/src/test/resources/pareto_fronts/dtlz7_tf_15objs.pf";//从这里读取理想帕累托平面值String s = "NSGAiii" + problem.getName() + "-"+problem.getNumberOfObjectives();for (int i = 0; i < 10; i++) {Algorithm<List<DoubleSolution>> algorithm;CrossoverOperator<DoubleSolution> crossover;MutationOperator<DoubleSolution> mutation;SelectionOperator<List<DoubleSolution>, DoubleSolution> selection;// 定义优化问题
//            new InvertedGenerationalDistance<PointSolution>(normalizedReferenceFront).evaluate(normalizedPopulation) + "\n";// 种群规模int popSize = 136;// 配置SBX交叉算子double crossoverProbability = 0.9;double crossoverDistributionIndex = 20.0;crossover = new SBXCrossover(crossoverProbability, crossoverDistributionIndex);// 配置变异算子double mutationProbability = 1.0 / problem.getNumberOfVariables();double mutationDistributionIndex = 20.0;mutation = new PolynomialMutation(mutationProbability, mutationDistributionIndex);// 配置选择算子selection = new BinaryTournamentSelection<DoubleSolution>(new RankingAndCrowdingDistanceComparator<DoubleSolution>());// 将组件注册到algorithmalgorithm = new NSGAIIIBuilder<DoubleSolution>(problem).setPopulationSize(popSize).setMaxIterations(2000).setCrossoverOperator(crossover).setMutationOperator(mutation).setSelectionOperator(selection).build();// 用AlgorithmRunner运行算法AlgorithmRunner algorithmRunner = new AlgorithmRunner.Executor((Algorithm<?>) algorithm).execute();// 获取结果集List<DoubleSolution> population = algorithm.getResult();// 输出结果printFinalSolutionSet(population, s);double IGD = new InvertedGenerationalDistance<DoubleSolution>(referenceParetoFront).evaluate(population);//配置igd值igds[i]=IGD;System.out.println(i);}double mean = Mean(igds);//计算平均值double POP_Variance=POP_Variance(igds);//计算方差System.out.println(mean+"   "+POP_Variance);//输出printFinalSolutionSet1(igds, s);}static double Sum(double[] data) {//求和公式double sum = 0;for (int i = 0; i < data.length; i++)sum = sum + data[i];return sum;}static double  Mean(double[] data) {//计算平均值公式double mean = 0;mean = Sum(data) / data.length;return mean;}static double POP_Variance(double[] data) {//计算平均值公式double variance = 0;for (int i = 0; i < data.length; i++) {variance = variance + (Math.pow((data[i] - Mean(data)), 2));}variance = variance / data.length;return variance;}/*** 输出最后的种群中的各个解的适应度** @param population*/private static void printFinalSolutionSet1(double[] population, String s) {try {String Filename = "D:/" + s + ".txt";File file = new File(Filename);file.createNewFile();//创建文件FileWriter out = new FileWriter(file);BufferedWriter o = new BufferedWriter(out);//System.out.println("-------------------------------");for (double p : population) {o.write(String.valueOf(p));o.newLine();}o.close();} catch (Exception e) {e.printStackTrace();}}

这是NSGA-III的代码,与NSGA-II的配置过程大致相同,但是也存在部分不同的地方,下面会详细进行分析:

1.配置帕累托平面以及计算IGD值
referenceParetoFront = "jmetal-problem/src/test/resources/pareto_fronts/dtlz7_tf_15objs.pf";//从这里读取理想帕累托平面值

这里是配置理想的帕累托平面,因为igd值的计算需要这个平面作为参照物才能够得到结果,具体的文件名可以沿着这个路径找,更新以后可能略有不同,但是最重要的是这里的理想帕累托平面在JMetal框架体系中并不全面,尤其是在高维的情况下可能缺失部分,不过这个可以通过在github上面得到txt形式的理想帕累托平面,在这里只需要将txt后缀简单的改为pf格式便可以在框架中使用了。

double IGD = new InvertedGenerationalDistance<DoubleSolution>(referenceParetoFront).evaluate(population);

这里是配置IGD值的部分,通过这个类就可以计算IGD值了,同时JMetal中还为我们提供许多其他的评价指标,这个可以通过Runner算子中的运行结果可以看出来
Runner算子中这个方法便是对他所集成的所有的评价指标的集合(代码最后面的if语句),通过阅读这个类我们便可以找到所有评价指标的类名,然后就可以像我使用的这样直接在自己的算法中调用就可以了,注意这里的参数,这个方法所使用的参数顺序与我们引用的类所采用的参数顺序是不同的,不要搞混了。

printQualityIndicators(population, referenceParetoFront);
2.配置参考点

这个不同是由NSGA-III本身的性质所决定,众所周知NSGA-III与NSGA-II最大的不同便是放弃了拥挤度的概念而转而引进了参考点的概念,而这个参考点的划分数目在不同的维度数上面自然也是不同,(这个应该是有具体的算法,具体请参考详细的NSGA-III算法的解释。)而这一部分配置在框架中是写死的(也有可能是我没有找到),所以这部分我们只能通过NSGAIII.java这个算法类直接进行修改

/// NSGAIII
numberOfDivisions = new Vector<>(1) ;
numberOfDivisions.add(12) ; // Default value for 3D problems

这个部分代码便是初始目标维度是三维时,所采用的12个参考点的划分标准,这里实际上是一个多项式公式,具体的实现过程,可以通过详细阅读下一句代码的类进行理解

(new ReferencePoint<S>()).generateReferencePoints(referencePoints,getProblem().getNumberOfObjectives() , numberOfDivisions);

MOEA/D部署

MOEA/D的部署与NSGA-III的部署并没有太大的区别,包括配置理想帕累托平面,以及IGD值等,但是主要的区别可能就在于参考点的设置上(因为对MOEA/D没有深入的去研究算法,所以以下只是我的个人观点),在NSGA-III中,算法通过配置参考点以及参考向量,通过一系列的方案应用他们来解决问题,而在MOEA/D中,并没有这些东西,他是通过配置了一个参考向量文件来实现这些步骤的

.setDataDirectory("MOEAD_Weights")

就是在builder配置过程中的这个方法,要想正确的使用这个方法,你必须要保证JMetal框架中有相应的文件,在最近更新的框架版本这个类型的文件变得全面了起来,已经可以覆盖3–15维目标数的需求,如果这个文件没有配置好,虽然可以得到结果,但是我们得到的结果效果会很差,并且控制台也会报出相应的异常,可以根据这些异常进行调整,异常中会指出相应的文件夹,这样只需要将相应的文件资源放入对应文件夹即可,(可以从GitHub完善需要的文件)
具体的代码如下:


public class testmoead {//moead的测试类public static void main(String[] args) throws FileNotFoundException {double[] igds = new double[10];String referenceParetoFront = "";// 真实PF,用于计算指标值,只在多目标中有用。Problem<DoubleSolution> problem;// 定义优化问题problem = new DTLZ7(30, 15);String str = "MOEAD" + problem.getName() +"-"+ problem.getNumberOfObjectives();System.out.println(str);referenceParetoFront = "jmetal-problem/src/test/resources/pareto_fronts/dtlz7_tf_15objs.pf";//从这里读取理想帕累托平面值for (int i = 0; i < 10; i++) {Algorithm<List<DoubleSolution>> algorithm;CrossoverOperator<DoubleSolution> crossover;MutationOperator<DoubleSolution> mutation;SelectionOperator<List<DoubleSolution>, DoubleSolution> selection;double cr = 1.0;double f = 0.5;crossover = new DifferentialEvolutionCrossover(cr, f, "rand/1/bin");// 配置变异算子double mutationProbability = 1.0 / problem.getNumberOfVariables();double mutationDistributionIndex = 20.0;mutation = new PolynomialMutation(mutationProbability, mutationDistributionIndex);// 配置选择算子selection = new BinaryTournamentSelection<DoubleSolution>(new RankingAndCrowdingDistanceComparator<DoubleSolution>());// 将组件注册到algorithmalgorithm = new MOEADBuilder(problem, MOEADBuilder.Variant.MOEAD).setCrossover(crossover).setMutation(mutation).setMaxEvaluations(150000).setPopulationSize(680).setResultPopulationSize(135).setNeighborhoodSelectionProbability(0.9).setMaximumNumberOfReplacedSolutions(2).setNeighborSize(20).setFunctionType(AbstractMOEAD.FunctionType.TCHE).setDataDirectory("MOEAD_Weights").build();// 用AlgorithmRunner运行算法AlgorithmRunner algorithmRunner = new AlgorithmRunner.Executor((Algorithm<?>) algorithm).execute();// 获取结果集List<DoubleSolution> population = algorithm.getResult();// 输出结果double IGD = new InvertedGenerationalDistance<DoubleSolution>(referenceParetoFront).evaluate(population);igds[i] = IGD;System.out.println(i);printFinalSolutionSet(population, str);}double mean = Mean(igds);//计算平均值double POP_Variance = POP_Variance(igds);//计算方差System.out.println(mean + "   " + POP_Variance);//输出printFinalSolutionSet1(igds, str);}static double Sum(double[] data) {//求和公式double sum = 0;for (int i = 0; i < data.length; i++)sum = sum + data[i];return sum;}static double Mean(double[] data) {//计算平均值公式double mean = 0;mean = Sum(data) / data.length;return mean;}static double POP_Variance(double[] data) {//计算平均值公式double variance = 0;for (int i = 0; i < data.length; i++) {variance = variance + (Math.pow((data[i] - Mean(data)), 2));}variance = variance / data.length;return variance;}/*** 输出最后的种群中的各个解的适应度** @param population*/private static void printFinalSolutionSet(List<DoubleSolution> population, String s) {try {String Filename = "D:/" + s + ".txt";File file = new File(Filename);file.createNewFile();//创建文件FileWriter out = new FileWriter(file);BufferedWriter o = new BufferedWriter(out);//System.out.println("-------------------------------");for (DoubleSolution p : population) {String str = "";for (int i = 0; i < p.getObjectives().length; i++) {if (i != p.getObjectives().length - 1) {str += p.getObjectives()[i] + " ";} else {str += p.getObjectives()[i];}}o.write(str);o.newLine();}o.close();} catch (Exception e) {e.printStackTrace();}for (DoubleSolution p : population) {String str = "";for (int i = 0; i < p.getObjectives().length; i++) {if (i != p.getObjectives().length - 1) {str += p.getObjectives()[i] + " ";} else {str += p.getObjectives()[i];}}System.out.println(str);}}

另外附一份MATLAB画箱线图的代码,用来画我们导出的igd值的结果的

str="DTLZ7-15";
figure(1)
file_name1 = "D:\\igd值\\nsgaiii\\NSGAiii"+str+'.txt';
file_name2 = "D:\\igd值\\moead\\MOEAD"+str+'.txt' ;
file_name3 = "D:\\igd值\\cellDE\\cellDE"+str+'.txt';
a=load(file_name1);
b=load(file_name2);
c=load(file_name3);
d=[a b c];
filename='D:\\'+str+'.png';
set(gcf,'Position',[100 100 173 146]);
boxplot(d,'Labels', {'NSGA-III', 'MOEA/D ', 'MaSHOA'});
set(gca,'Fontsize',7,'Fontname','Times New Roman');
print('-dpng',filename,'-r800');

jmetal解决超多目标问题,并且利用igd值进行评价相关推荐

  1. mysql 超卖_mysql 解决超卖问题的锁分析

    解决超卖问题,常见的方式,利用redis 的原子性去递减:利用队列,队列入队计数.或者直接打到mysql 层.由mysql 保证不超卖,有几个玩法.利用属性不一样,挺有意思,记录下. 首先,mysql ...

  2. 秒杀系统优化以及解决超卖问题

    问题描述 在众多抢购活动中,在有限的商品数量的限制下如何保证抢购到商品的用户数不能大于商品数量,也就是不能出现超卖的问题:还有就是抢购时会出现大量用户的访问,如何提高用户体验效果也是一个问题,也就是要 ...

  3. 秒杀系统并发情况下解决超卖问题

    非分布式秒杀系统 并发情况下解决超卖问题 乐观锁防止超卖 / 令牌桶限流/ redis缓存 /接口限流/接口加盐/单用户限制访问频率/消息队列异步处理订单 #数据库表drop table if exi ...

  4. 使用Redis分布式锁处理并发,解决超卖问题

    使用Redis分布式锁处理并发,解决超卖问题 参考文章: (1)使用Redis分布式锁处理并发,解决超卖问题 (2)https://www.cnblogs.com/VitoYi/p/8726070.h ...

  5. redis mysql 解决超卖_Redis 分布式锁解决超卖问题

    Redis 分布式锁解决超卖问题 1,Redis 事物介绍 1. Redis 事物是可以一次执行多个命令, 本质是一组命令的集合. 2. 一个事务中的所有命令都会序列化, 按顺序串行化的执行而不会被其 ...

  6. 07: redis分布式锁解决超卖问题

    07: redis分布式锁解决超卖问题 参考文章: (1)07: redis分布式锁解决超卖问题 (2)https://www.cnblogs.com/xiaonq/p/12328934.html 备 ...

  7. 【vue开发问题-解决方法】(八)利用axios拦截器实现elementUI中加载动画,控制加载区域

    [vue开发问题-解决方法](八)利用axios拦截器实现elementUI中加载动画,控制加载区域 参考文章: (1)[vue开发问题-解决方法](八)利用axios拦截器实现elementUI中加 ...

  8. 睿智的目标检测20——利用mAP计算目标检测精确度

    睿智的目标检测20--利用mAP计算目标检测精确度 学习前言 GITHUB代码下载 知识储备 1.IOU的概念 2.TP TN FP FN的概念 3.precision(精确度)和recall(召回率 ...

  9. 淘宝如何解决超卖问题

    这篇文章是我从某文库爬下来的,放在这里供大家学习. 淘宝超卖现象的产生及解决方案 一.什么是超卖现象?  超卖即"超卖缺货",当宝贝库存接近0时,如果多个买家同时付款购买此宝贝,将 ...

最新文章

  1. linux查看是否有用户在使用分区,在Linux服务器中有几种查看分区表的方法
  2. LLVM每日谈之二十三 LLVM/Clang编译Linux内核资料
  3. 检测对抗样本_避免使用对抗性T恤进行检测
  4. Gamvas Web 0.8.4 发布,JavaScript 游戏引擎
  5. 一文看懂二叉搜索树~(又叫二叉查找树) 代码+详解(C/C++)
  6. 蓝桥杯题目练习 提升篇 [蓝桥杯2018初赛]三体攻击
  7. 《UEFI原理与编程》读书笔记
  8. java ckfinder中文_CKfinder中文乱码的解决.
  9. 一个可以在多平台运行的任天堂GameBoy模拟器
  10. 【转】Notes 函数详解
  11. pyCharm最新2018激活码
  12. 小学计算机集体听课评课,小学听课评课活动总结
  13. 适合程序员使用的二进制计算器Megatops BinCalc
  14. vue - 下拉列表
  15. Java 程序是如何执行的
  16. c语言编程 人造卫星的高度,C语言实验教学教案2008
  17. 深度学习1(hinton)
  18. 正态分布与6-Sigma
  19. 【缩点】SWUST 2014校赛 H:挖金子
  20. java小游戏-扫雷游戏

热门文章

  1. Java后端学习路线总结
  2. 计算机可以关闭家庭组,win10怎么关闭家庭组_win10电脑家庭组如何关闭
  3. day19_雷神_django第二天
  4. 论文中插入求和符号∑各种不同版本要求
  5. 2021牛年三月节日营销方案
  6. keytool -list -v -keystore xxx.keystore 看不到MD5
  7. php 对swoole的理解
  8. 自动化运维工具Ansible,保姆级讲解
  9. Python (入门)爬取网页制作成可视化图形
  10. win11安装node并且配置环境变量