Tracy's Studio.

platEMO_多目标优化工具箱

字数统计: 3.8k阅读时长: 14 min
2020/07/10 Share

简介

platEMO是Ye Tian等学者写的一款基于MATLAB的多目标优化工具。

这款工具主要具有以下的几个特点:
1.完全由MATLAB开发,不需要任何其它库。
2.用户可以显示各种图形,包括结果的pareto front,真实的pareto front等等。
3.强大友好的GUI,可以不用编辑任何代码,直接调用主函数main.m即可。
4.可以直接生成Excel或者LaTex。

下载地址

github

该平台使用的详细信息可以在platEMO中的manual.pdf中读取。

实验室主页

下载后,将matlab运行目录设置为该文件夹即可。

文件夹结构

文件夹

Algorithm:

包括现有的90个流行的MOEAs,包括遗传算法、差分进化、粒子群优化、模因算法、分布估计算法和基于代理模型的算法。其中大多数是2010年以后在顶级期刊上发表的代表性算法。

Data:

包括120多个benchmark MOPs。

GUI:

用于存储平台界面的源代码。

Metrics:

用于存储所有性能指标的源代码。

Operators:

用于存储所有算子的源代码。

Problems:

用于存储所有多目标优化问题的源代码。

Public:

用于存储所有类和实例的函数。

使用方法

命令行使用platEMO

用户可以通过调用带有输入参数的接口函数main()来运行PlatEMO的命令模式。

如果main()在没有任何输入参数的情况下被调用,则GUI模式将运行。

下表列出了main()的所有可接受参数。注意,用户不需要分配所有参数,因为每个参数都有一个默认值。

参数

-algorithm. 要执行的MOEA的函数。
-problem. 待解决的MOP。
-N. MOEA的种群规模。注意,它被固定在某些MOEAs(例如moead .m)中的某些特定值上,因此这些MOEAs的实际种群大小可能并不完全等于这个参数。
-M. MOP的目标数目。注意,在不可伸缩的MOPs(例如ZDT1.m)中,目标的数量是恒定的,因此这个参数对于这些MOPs是无效的。
-D. MOP决策变量的个数。注意,在某些MOP中,决策变量的数量是常量或固定到某些特定整数上的(例如:ZDT5.m),因此决策变量的实际数量可能并不完全等于这个参数。
-evaluation. 函数评价的最大数目。
-run. 运行数。如果用户希望为相同的算法、问题、M和D参数保存多个结果,则在每次运行时修改此参数,使结果的文件名不同。
-save. 保存的种群。如果将该参数设置为0(默认值),则会在终止后显示结果图;否则,在进化过程中获得的种群将保存在一个名为Data\algorithm\algorithm_problem_M_D_run.mat的文件中。例如:如果save为5并且evaluation是20000,评价数量为4000、8000、12000、16000、20000时得到的种群将被保存。
-outputFcn. 每次生成后调用的函数,通常不需要修改。

例如:使用下面的命令在WFG1上运行RVEA,其种群大小为200和10个目标,最终结果将显示出来:

1
main('-algorithm',@RVEA,'-problem',@WFG1,'-N',200,'-M',10);

使用以下命令在WFG2上运行KnEA,并在KnEA和WFG2中设置参数:

1
main('-algorithm',{@KnEA,0.4},'-problem',{@WFG2,6});

每个MOEA和MOP的具体参数可以在对应函数头部的注释中找到。使用以下命令在DTLZ5上运行AR-MOEA10次,最终保存种群:

1
2
3
for r = 1 : 10
main('-algorithm',@ARMOEA,'-problem',@DTLZ5,'-save',1, '-run',r);
end

使用带GUI的platEMO

用户可以通过以下命令运行PlatEMO的GUI模式:

1
main();

然后在GUI上可以看到两个模块,即测试模块和实验模块。测试模块用于每次在MOP上执行一个MOEA,结果将以图的形式显示。实验模块将同时在几个MOPs上执行多个MOEAs。统计结果将列在表格中。

结构

A: 选择执行的算法和多目标优化问题。

B: 设置所选MOEA和MOP的参数。每个参数的值应该是一个标量。注意这里的公共参数N,M,D和evaluation都视为MOP的参数。如果将参数设置为空,则该参数将等于其默认值。

C: 根据当前配置执行MOEA。

D: 显示光标移动到的区域B中的参数的介绍。

E: 显示优化过程中的当前种群。

F: 放大,缩小,平移或旋转E区域的轴。

G: 在新的标准MATLAB图中打开E区域的坐标轴,可以对坐标轴进行更多的操作,例如保存坐标轴。

H: 选择要显示在E区域轴线上的数据,包含种群的pareto front,种群的pareto集合,MOP的真实pareto front和任何性能度量的收敛轮廓。

H

I: 控制优化过程,即,开始,暂停,停止,后退和前进。
J: 显示其中一个历史结果。
K: 显示结果的最终种群的性能度量值。
L: 显示执行的详细信息。
用户打开测试模块后,首先选择要在A区域执行的MOEA和MOP,并在B区域设置参数,然后按下区域C按钮执行算法。实时种群将显示在E区域的轴线上,用户可以使用I区域的按钮来控制优化过程。算法结束后,通过选择J区域的弹出菜单,可以重新显示所有的历史结果。

TEST

PlatEMO实验模块界面如上图所示。各区域管制的职能如下:
Region A. 选择要执行的MOEA和MOP。
Region B.设置所选MOEA和MOP的参数。MOPs里的每个参数的值都可以是一个向量。因此,MOEAs可以在相同的MOP上以不同的设置执行。
Region C.设置每个文件中保存的种群数量。例如,如果种群大小为5,评估的数量为20000,评价数量为4000,8000,12000,16000和20000时的种群被保存。
Region D.设置每个MOP上每个MOEA的运行次数。
Region E.设置保存实验设置的文件路径。用户还可以打开现有的配置文件来加载实验设置。所有结果都将保存在文件路径的同一文件夹中。
Region F.按顺序或并行执行实验。
Region G.显示实验的统计结果。
Region H.指定表中显示的数据类型。
Region I.将表格保存为Excel或LaTeX格式。
Region J.选择表中显示的数据,包括最终总体的任何性能度量值。
Region K.控制优化过程,即,开始,暂停,停止。
Region L.右键单击一个单元格,以显示种群的Pareto front,种群的pareto集合,或度量值的收敛轮廓。

用户打开实验模块后,首先选择在区域A中执行的MOEAs和MOPs,并在区域B中设置它们的参数,在区域C中设置保存的种群数量,在区域D中设置运行的数量。然后按下F区域的两个按钮中的一个开始实验。统计结果将显示在G区域的表格中,用户可以使用K区域的按钮来控制优化过程。实验结束后,按下I区按钮,可以将表中数据以Excel或LaTeX格式保存。
或者,用户可以通过按区域K中的按钮加载现有配置,然后开始实验。如果在E区域给定的文件夹中已经存在任何结果文件,则将加载结果文件,而不是执行算法。

扩展platEMO

platEMO的结构

结构

进行platEMO平台的实现的三个类是:GLOBAL, INDIVIDUAL和PROBLEMS。其中每个算法都是一个函数,ALGORITHM不是一个类,而是所有算法函数的统一接口。

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文件表示,该文件应放在“算法”文件夹中。例如,NSGAII.m的源代码是

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

首先,用全局变量进行初始化,生成一个初始种群。

一个多目标进化算法至少有三步:通过Global.Initialization()全局初始化,通过 Global.NotTermination()检查优化是否结束,通过算子(例如GA())得到子代,EnvironmentalSelection() 是NSGAⅡ特有的算法, NDSort() 和
TournamentSelection()是存储在Public中的实例函数。

对于基于分解的MOEAs,需要预先生成一组参考点。例如,在MOEAD.m中,使用以下命令生成参考点:

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

其中UniformPoint()是Public文件夹中的一个实例函数,用于在单元超平面上生成具有Global.M目标的Global.N均匀分布点。W是参考点集,总体规模全局。N重置为W中参考点的数量。

MOEA函数(以及MOP函数)头部应该以指定的形式编写,以便GUI能够识别。例如,在gfmmea.m中,函数头中的注释是

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

第2行给出了函数的两个标签,第一个标签\表示这是一个MOEA函数(\ 和 \ 分别表示多目标优化问题和指标)。第二个标签\可以是任意字符串。第3行给出了MOEA的全名。第4-5行是GFM-MOEA的参数,其中参数的名称位于每一行的第一列。默认值位于第二列,简介位于第三列;这些列用“-”分隔。然后,GFM-MOEA通过以下命令接收用户的参数设置:

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

可以在Public\GLOBAL.m中找到Global.ParameterSet()的详细介绍。对于代理辅助的MOEA,可以使用以下命令根据父母的决策变量生成新的决策变量,没有INDIVIDUAL对象会被实例化,并且被评估的个体的数量GLOBAL.evaluated不会增加。

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

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

增加问题

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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:M1)*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
2
3
4
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
2
3
4
5
6
7
8
9
10
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
1. obj.K = obj.Global.ParameterSet(obj.Global.M-1);

增加性能度量

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

1
2
3
4
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标识所必需的,其中第一个标签表示这是一个性能度量函数,第二个标签表示度量值越小性能越好。相反,如果第二个标签是,则表示度量值越大,性能越好。

CATALOG
  1. 1. 简介
  2. 2. 下载地址
  3. 3. 文件夹结构
  4. 4. 使用方法
    1. 4.1. 命令行使用platEMO
    2. 4.2. 使用带GUI的platEMO
  5. 5. 扩展platEMO
    1. 5.1. platEMO的结构
    2. 5.2. 增加算法
    3. 5.3. 增加问题
    4. 5.4. 增加性能度量