主要内容

本页采用了机器翻译。点击此处可查看英文原文。

基于问题的多目标优化步骤

本主题展示了如何在基于问题的方法中建立多目标优化,并详细说明了结果和初始点的格式。有关示例,请参阅基于问题的多目标优化的帕累托前沿

指定多个目标函数

通过以下两种方式之一指定多个目标函数:

  • 优化表达式-给出一个具有向量或数组值的优化表达式。例如,此目标函数返回一个包含三个值的向量:

    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 参考页。

另请参阅

| | | |

主题