简介
platEMO是Ye Tian等学者写的一款基于MATLAB的多目标优化工具。
这款工具主要具有以下的几个特点:
1.完全由MATLAB开发,不需要任何其它库。
2.用户可以显示各种图形,包括结果的pareto front,真实的pareto front等等。
3.强大友好的GUI,可以不用编辑任何代码,直接调用主函数main.m即可。
4.可以直接生成Excel或者LaTex。
下载地址
该平台使用的详细信息可以在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 | for r = 1 : 10 |
使用带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和任何性能度量的收敛轮廓。
I: 控制优化过程,即,开始,暂停,停止,后退和前进。
J: 显示其中一个历史结果。
K: 显示结果的最终种群的性能度量值。
L: 显示执行的详细信息。
用户打开测试模块后,首先选择要在A区域执行的MOEA和MOP,并在B区域设置参数,然后按下区域C按钮执行算法。实时种群将显示在E区域的轴线上,用户可以使用I区域的按钮来控制优化过程。算法结束后,通过选择J区域的弹出菜单,可以重新显示所有的历史结果。
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 | function NSGAII(Global) |
首先,用全局变量进行初始化,生成一个初始种群。
一个多目标进化算法至少有三步:通过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 | function GFMMOEA(Global) |
第2行给出了函数的两个标签,第一个标签\
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 | 1. classdef DTLZ2 < PROBLEM |
首先,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 | 1. function PopCon = CalCon(obj,PopDec) |
第三,对于组合MOPs,它可能是一个非法字符,在这种情况下,它应该通过重载方法PROBLEM.CalDec()来修复,例如在MOKP.m中:
1 | 1. function PopDec = CalDec(obj,PopDec) |
与MOEA函数类似,MOP类可以接收用户的参数设置,例如在WFG1.m中,以下命令用于接收参数设置:
1 | 1. obj.K = obj.Global.ParameterSet(obj.Global.M-1); |
增加性能度量
性能度量函数由PlatEMO中的.m文件表示,该文件应该放在Metrics文件夹中。例如,IGD.m的源代码是
1 | 1. function score = IGD(PopObj,PF) |
首先,性能度量函数有两个输入参数和一个输出参数,其中PopObj表示种群目标值矩阵,PF表示在真实Pareto前沿采样的一组参考点,并且score表示性能度量值。注意,第2行中的注释是GUI标识所必需的,其中第一个标签表示这是一个性能度量函数,第二个标签表示度量值越小性能越好。相反,如果第二个标签是,则表示度量值越大,性能越好。