platEMO:一款强大的多目标优化工具(MATLAB)的扩展操作

platEMO:一款强大的多目标优化框架(MATLAB)的扩展操作

  • 简介
  • PlatEMO的架构
  • 增加算法
  • 增加问题
  • 增加性能度量
  • 总结

简介

本篇博客简介platEMO的扩展操作,安装与基本操作请参见我上一篇博客,本人使用的platEMO2.0版本,相较之前的版本还是有很多的不同,用之前的小伙伴注意啦。

PlatEMO的架构

platEMO:一款强大的多目标优化工具(MATLAB)的扩展操作_第1张图片
PlatEMO的架构如上图所示,在PlatEMO的实现中有三个类:GLOBAL,INDIVIDUAL和PROBLEM。注意,每个算法都是一个函数,而“算法”不是一个类,而是所有算法函数的统一接口。
GLOBAL表示当前运行的配置,可以在Public\GLOBAL.m找到源代码和详细注释。在每次执行,维护一个GLOBAL对象来存储所有的参数设置和结果,包括执行的函数处理MOEA和MOP,人口规模,目标的数量,数量的决策变量,函数的最大数量评估,评估个体的数量,等等。GLOBAL还提供了一些MOEAs可以调用的方法,例如,GLOBAL.Initialization()可以生成一个随机的初始填充,并且GLOBAL.NotTermination()可以检查是否应该终止算法。
INDIVIDUAL代表一个个体,源代码及其详细注释可以在Public\INDIVIDUAL.m中找到。一个INDIVIDUAL目标储存决策变量dec、目标值obj、约束违反con和一个个体的附加属性值。在调用构造函数时分配dec和add的值,然后自动计算obj和con的值。上面的每一个性质都是一个行向量,p.decs,P.objs, P.cons或P.adds表示一个决策变量的矩阵,分别为目标值、违反约束或单个INDIVIDUAL对象P数组的附加属性值,其中矩阵的每一行表示一个个体,每一列表示值的一维。当实例化的INDIVIDUAL对象数量超过函数GLOBAL.evaluation计算的最大数量时,算法将被迫终止。
PROBLEM是所有问题类的超类。它包含几个方法,即,PROBLEM.Init()用于生成初始种群,PROBLEM.CalDec()用于修复不可行的决策变量,PROBLEM.CalObj()用于计算目标值,PROBLEM.CalCon()用于计算约束违反情况,以及PROBLEM.PF()用于在真正的帕累托前沿采样参考点。每个问题都应该作为PROBLEM的子类来编写,并重载上面的方法。

增加算法

MOEA函数由PlatEMO中的.m文件表示,该文件应该放在Algorithm文件夹中。例如NSGAII.m的源代码是

1. function NSGAII(Global)
2.     Population = Global.Initialization();
3.     [~,FrontNo,CrowdDis] = EnvironmentalSelection(Population,Global.N);
4.     while Global.NotTermination(Population)
5.         MatingPool = TournamentSelection(2,Global.N,FrontNo, -CrowdDis);
6.         Offspring = GA(Population(MatingPool));
7.         [Population,FrontNo,CrowdDis] = EnvironmentalSelection([Population,Offspring], Global.N);
8.     end
9. end

首先,MOEA函数有一个表示GLOBAL对象的输入参数和零输出参数。生成一个初始化种群Population(第二行),并且计算了非支配前沿数和各个体的拥挤距离(第三行)。在每代中,Global.NotTermination()被调用以检查评估的适应度的数量是否超过函数评估的最大数量,并将种群传递给函数作为最终输出(第四行)。然后依次进行交配池的选择、后代的产生和环境的选择(第5-7行)。
因此,一个MOEA至少应该执行三个操作:通过Global.Initialization()获得初始种群,检查优化状态并通过Global.NotTermination()传递种群,并且通过操作符函数(如GA())生成子代。此外,函数EnvironmentSelection()是NSGA-II特有的,并且NDSort()和TournamentSelection()是储存在Public里得问公用函数。
对于基于分解的MOEAs,需要事先生成一组参考点。例如在MOEAD.m中,使用以下命令生成参考点:

1. [W,Global.N] = UniformPoint(Global.N,Global.M);

其中UniformPoint()是文件夹Public中的一个实用函数,用于生成关于Global.N个具有全局的均匀分布点。其带有单位超平面上Global.M个目标。W是一组参考点,而种群大小Global.N重置为与W中的参考点数量相同。
MOEA函数(以及MOP函数)头部的注释应该以指定的形式编写,以便可以由GUI标识。例如在GFMMOEA.m,函数头部的注释是

1. function GFMMOEA(Global)
2. % <algorithm> <G>
3. % Generic front modeling based MOEA
4. % theta --- 0.2 --- Penalty parameter
5. % fPFE --- 0.1 --- Frequency of generic front modeling

第2行给出了函数的两个标签,第一个标签表示这是一个MOEA函数(对于MOP类和性能度量函数分别是和),第二个标签 可以是任意字符串。第3行给出了MOEA的全名。第4-5行定义了GFM-MOEA的参数,其中参数的名称位于每行的列上,默认值位于第二列上,简介位于第三列上;这些列被—分开。
然后通过以下命令接收用户的参数设置:

1. [theta,fPFE] = Global.ParameterSet(0.2,0.1);

有关Global.ParameterSet()的详细介绍请参阅Public\GLOBAL.m。
对于surrogate-assisted MOEAs,可以使用下面的命令根据父类的决策变量生成新的决策变量,当没有INDIVIDUAL目标被实例化,评估个体GLOBAL.evaluated的数量将不会增加。

1. OffDec = GA(Population(MatingPool).decs);

对于函数GA(),如果输入是INDIVIDUAL对象的数组,那么输出也是INDIVIDUAL对象的数组。如果输入是决策变量矩阵,那么输出也是决策变量矩阵。

增加问题

MOP函数由PlatEMO中的一个.m文件表示,该文件应该放在文件夹Problems中。
例如,DTLZ2的源代码.m是

1. classdef DTLZ2 < PROBLEM
2.     methods
3.         function obj = DTLZ2()
4.             if isempty(obj.Global.M)
5.                 obj.Global.M = 3;
6.             end
7.             if isempty(obj.Global.D)
8.                 obj.Global.D = obj.Global.M + 9;
9.             end
10.            obj.Global.lower = zeros(1,obj.Global.D);
11.            obj.Global.upper = ones(1,obj.Global.D);
12.            obj.Global.encoding = 'real';
13.         end
14.         function PopObj = CalObj(obj,PopDec)
15.             M = obj.Global.M;
16.             g = sum((PopDec(:,M:end)-0.5).^2,2);
17.             PopObj = repmat(1+g,1,M).*fliplr(cumprod([ones (size(g,1),1),cos(PopDec(:,1:M-1)*pi/2)],2)).*[ones(size(g,1),1),sin(PopDec(:,M-1:-1:1)*pi/2)];
18.         end
19.         function P = PF(obj,N)
20.             P = UniformPoint(N,obj.Global.M);
21.             P = P./repmat(sqrt(sum(P.^2,2)),1,obj.Global.M);
22.         end
23.     end
24. end

首先,DTLZ2是问题的子类,每个操作都是一个重载方法。在DTLZ2.DTLZ2()构造函数中设置目标个数的值GLOBAL.M,,决策变量的数量GLOBAL.D,决策变量的下界GLOBAL.lower,决策变量的上界GLOBAL.upper,和编码GLOBAL.encoding。在DTLZ2.CalObj()中,计算种群的目标值。在DTLZ2.PF()中,真实的帕累托前沿选取一组参考点。

值得注意的是,决策变量在三种情况下可能是不可行的。首先,对于连续MOPs,它可能大于全局上界(GLOBAL.upper)或小于下界(GLOBAL.lower)。在这种情况下,它将被INDIVIDUAL的类设置为边界值,而MOP类不需要处理这种情况。其次,它可能没有满足约束(一个正的约束违背表明这个约束没有被满足),在这种情况下,约束违背应该通过重载方法PROBLEM.CalCon()来计算,例如在C1_DTLZ1.m中:

1. function PopCon = CalCon(obj,PopDec)
2.     PopObj = obj.CalObj(PopDec);
3.     PopCon = PopObj(:,end)/0.6+sum(PopObj(:,1:end-1)/0.5,2)-1;
4. end

第三,对于组合MOPs,它可能是一个非法字符,在这种情况下,它应该通过重载方法PROBLEM.CalDec()来修复,例如在MOKP.m中:

1. function PopDec = CalDec(obj,PopDec)
2.     C = sum(obj.W,2)/2;
3.     [~,rank] = sort(max(obj.P./obj.W));
4.     for i = 1 : size(PopDec,1)
5.         while any(obj.W*PopDec(i,:)>C)
6.             k = find(PopDec(i,rank),1);
7.             PopDec(i,rank(k)) = 0;
8.         end
9.     end
10. end

与MOEA函数类似,MOP类可以接收用户的参数设置,例如在WFG1.m中,以下命令用于接收参数设置:

1. obj.K = obj.Global.ParameterSet(obj.Global.M-1);

增加性能度量

性能度量函数由PlatEMO中的.m文件表示,该文件应该放在Metrics文件夹中。例如,IGD.m的源代码是

1. function score = IGD(PopObj,PF)
2. % <metric> <min>
3.     score = mean(min(pdist2(PF,PopObj),[],2);
4. end

首先,性能度量函数有两个输入参数和一个输出参数,其中PopObj表示种群目标值矩阵,PF表示在真实Pareto前沿采样的一组参考点,并且score表示性能度量值。注意,第2行中的注释是GUI标识所必需的,其中第一个标签表示这是一个性能度量函数,第二个标签表示度量值越小性能越好。相反,如果第二个标签是,则表示度量值越大,性能越好。

总结

以上就是PlatEMO的扩展功能,下面如果有时间我会更新一个例子去详细演示PlatEMO的使用方法,敬请期待哈。最近要写毕设,估计会拖得晚一点。

[1]: Ye Tian, Ran Cheng, Xingyi Zhang, and Yaochu Jin, “PlatEMO: A MATLAB
platform for evolutionary multi‐objective optimization [educational
forum],” IEEE Computational Intelligence Magazine, 2017, 12(4): 73‐87.

你可能感兴趣的:(编程工具)