基于问题的多目标优化步骤
本主题展示了如何在基于问题的方法中建立多目标优化,并详细说明了结果和初始点的格式。有关示例,请参阅 基于问题的多目标优化的帕累托前沿。
指定多个目标函数
通过以下两种方式之一指定多个目标函数:
优化表达式-给出一个具有向量或数组值的优化表达式。例如,此目标函数返回一个包含三个值的向量:
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