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>());
// 将组件注册到algorithm
algorithm = 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).