Main Content

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

改进 surrogateopt 解或流程

surrogateopt 摊位

当同时具有线性约束和整数约束时,surrogateopt 可能无法找到任何可行点或足够不同的可行点来创建替代。在这些情况下,求解器将退出并显示退出标志 - 2(未找到可行点)或 3(可行点太少)。有关退出标志 – 2 的详细信息,请参阅 未找到可行点

退出标志 3 可以以两种不同的方式出现:

  • 可行点太少,无法构建初始替代点。

  • 替代重置后,可行点太少,无法构建替代。

您可以使用 surrogateoptplot 绘图函数查看适用哪种情况。

options = optimoptions('surrogateopt','PlotFcn','surrogateoptplot');
[sol,fval,exitflag] = surrogateopt(arguments,options);

每次替代重置之后,surrogateopt 需要更多可行点来构造下一个替代。当存在整数约束时,surrogateopt 可能会耗尽可行点集,或者即使剩下一些可行点,也可能无法找到新的可行点

如果 surrogateopt 已执行至少一次重置,则它已成功找到解。在这种情况下,您可能已经找到了解问题的方法。

如果 surrogateopt 无法创建初始替代,或者 surrogateopt 重置并且您想尝试寻找其他解,请执行以下步骤。

  1. 放宽一些约束。

    • 将一些线性约束改为非线性,导致求解器不再坚持严格的可行性。这可以为 surrogateopt 提供更多可用于构建代理的可行点。

    • 通过为 b 向量选择更大的值来放宽一些线性不等式约束。您可以通过添加标量一次放宽所有 b 值:

      b = b + 5;
  2. 类似地,如果您的边界约束导致问题的可行点太少,并且如果它对您的问题有意义,请放宽边界。采取较大的上界或较小的下界,或者两者兼而有之。您可以通过添加或减去标量来一次放宽所有边界。

    ub = ub + 3;
    lb = lb - 1;

未找到可行点

surrogateopt 无法找到符合边界、整数约束和线性约束的可行点时,它会返回退出标志 – 2。在这种情况下,这个问题确实不可行。

然而,当求解器无法找到相对于非线性不等式约束可行的点时,它也可以返回退出标志 – 2。即使存在可行点,有时也会发生这种情况。要继续,请按照 收敛于不可行点 中的步骤操作。

解决方案可能不是最佳的

通常,当函数计算用完时,surrogateopt 就会停止。这意味着 surrogateopt 不会停止,因为它达到了最优解。然而,当发生替代重置时,当前解通常接近局部最优。

如何评估解的质量?一般来说,这是很难做到的。以下是调查解以帮助确定其局部质量的一些步骤。然而,没有任何程序可以保证某个点是一个全局解。请参阅 您能证明一个解是全局的吗?

  • 如果问题没有整数约束,请查看附近的点。为此,在返回的解上调用 patternsearch。将 InitialMeshSize 选项设置为您想要使用的搜索步长的大小。为了防止 patternsearch 花费太多时间,请将 MaxIterations 选项设置为 1,将 UseCompletePoll 选项设置为 true

    options = optimoptions('patternsearch',...
        'InitialMeshSize',1e-3,...
        'MaxIterations',1,'UseCompletePoll',true);

    如果您的问题具有非线性约束,首先使用 在 surrogateopt 形式和其他求解器形式之间转换非线性约束 将约束转换为 patternsearch 接受的形式。

  • 如果问题没有整数约束,请尝试从解开始运行 fmincon。同样,如果您的问题具有非线性约束,首先使用 在 surrogateopt 形式和其他求解器形式之间转换非线性约束 将约束转换为 fmincon 接受的形式。如果问题使用模拟或 ODE 求解器,则可能需要为 fmincon 设置更大的有限差分选项。请参阅 优化仿真或常微分方程

  • 如果问题有整数约束,那么除了尝试运行 surrogateopt 进行更多函数计算之外,几乎没有什么可做的。最有效地做到这一点的方法是使用检查点文件。请参阅 使用检查点文件。如果您没有使用检查点文件,您也可以使用 InitialPoints 选项提供一组初始点。

另请参阅

相关主题