基于问题的多目标优化步骤
本主题展示了如何在基于问题的方法中建立多目标优化,并详细说明了结果和初始点的格式。有关示例,请参阅基于问题的多目标优化的帕累托前沿。
指定多个目标函数
通过以下两种方式之一指定多个目标函数:
优化表达式-给出一个具有向量或数组值的优化表达式。例如,此目标函数返回一个包含三个值的向量:
prob.Objective = [sin(x),cos(x),1 - x.^2];
结构体 - 给出优化表达式的结构体,每个表达式的结果都是一个标量。例如,此目标函数返回具有三个目标分量的结构体:
prob.Objective.sin = sin(x); prob.Objective.cos = cos(x); prob.Objective.quad = 1 - x^2;
指定多个目标意义(最大化或最小化)
指定目标函数意义,即最大化或最小化,取决于您如何指定目标函数。
目标是一个优化表达式-问题中的所有目标都有相同的目标意义。例如,
prob.ObjectiveSense = "max";目标是一个结构体 - 每个目标函数都可以有自己的意义。
prob.ObjectiveSense结构体具有与prob.Objective结构体相同的字段。例如,prob.ObjectiveSense.sin = "minimize"; prob.ObjectiveSense.cos = "maximize"; prob.ObjectiveSense.quad = "max";
默认意义是 "minimize"。
多目标解的数据格式
返回的 sol 输出是 OptimizationValues 对象的向量。每个对象包含帕累托前沿上某一点的优化变量和目标函数的值。如果问题具有非线性约束,则 sol 还包含每个解的非线性约束违规。
返回的 fval 输出是一个矩阵,其中每一行代表一个解点,每一列代表一个目标函数。fval 输出是数字,与 sol 输出不同。您可以从 sol 对象中获取目标函数值。但是,您可以在 fval 中更轻松地找到这些值。
您可以通过在 sol 上调用 paretoplot 来绘制二维或三维生成的帕累托前沿。有关示例,请参阅基于问题的多目标优化的帕累托前沿。
为多目标问题提供初始点
指定多目标问题的初始点是可选的。不过,有时这样做可以获得更好的解。有关显示其好处的示例,请请参阅基于问题的多目标优化的帕累托前沿。
要指定初始点,请使用 optimvalues 函数创建一个 OptimizationValues 对象。有关示例,请参阅 optimvalues 参考页。
混合函数
为了获得更精确的解,gamultiobj 求解器可以选择调用 fgoalattain。有关示例,请参阅焊接梁的设计优化。要在基于问题的工作流中使用此混合函数,请将 HybridFcn 选项设置为 "fgoalattain":
options = optimoptions("gamultiobj",HybridFcn="fgoalattain");
在 solve 调用中包含求解器和选项参量:
[sol,fval,exitflag,output] = solve(prob,... Solver="gamultiobj",... Options=options);
查看帕累托集
要在求解器运行过程中以二维或三维形式查看帕累托集,请设置绘图选项。
对于
gamultiobj函数,将PlotFcn选项设置为"gaplotpareto"。options = optimoptions("gamultiobj",PlotFcn="gaplotpareto"); sol = solve(prob,Options=options)
对于
paretosearch函数,将PlotFcn选项设置为"psplotparetof"。
要在求解器完成后查看帕累托集,请在解上调用 paretoplot。
sol = solve(prob); paretoplot(sol)
有关示例,请参阅基于问题的多目标优化的帕累托前沿。
如果您有三个以上的目标,paretoplot 允许您选择要绘制的目标。有关详细信息,请参阅 paretoplot 参考页。
另请参阅
gamultiobj | paretosearch | solve | optimvalues | paretoplot