改进 surrogateopt
解或流程
surrogateopt
摊位
当同时具有线性约束和整数约束时,surrogateopt
可能无法找到任何可行点或足够不同的可行点来创建替代。在这些情况下,求解器将退出并显示退出标志 - 2
(未找到可行点)或 3
(可行点太少)。有关退出标志 – 2
的详细信息,请参阅 未找到可行点。
退出标志 3
可以以两种不同的方式出现:
可行点太少,无法构建初始替代点。
替代重置后,可行点太少,无法构建替代。
您可以使用 surrogateoptplot
绘图函数查看适用哪种情况。
options = optimoptions('surrogateopt','PlotFcn','surrogateoptplot'); [sol,fval,exitflag] = surrogateopt(arguments,options);
每次替代重置之后,surrogateopt
需要更多可行点来构造下一个替代。当存在整数约束时,surrogateopt
可能会耗尽可行点集,或者即使剩下一些可行点,也可能无法找到新的可行点
如果 surrogateopt
已执行至少一次重置,则它已成功找到解。在这种情况下,您可能已经找到了解问题的方法。
如果 surrogateopt
无法创建初始替代,或者 surrogateopt
重置并且您想尝试寻找其他解,请执行以下步骤。
放宽一些约束。
将一些线性约束改为非线性,导致求解器不再坚持严格的可行性。这可以为
surrogateopt
提供更多可用于构建代理的可行点。通过为
b
向量选择更大的值来放宽一些线性不等式约束。您可以通过添加标量一次放宽所有b
值:b = b + 5;
类似地,如果您的边界约束导致问题的可行点太少,并且如果它对您的问题有意义,请放宽边界。采取较大的上界或较小的下界,或者两者兼而有之。您可以通过添加或减去标量来一次放宽所有边界。
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
选项提供一组初始点。