SLSQP产生完全不同 - 与COBYLA相比

时间:2018-04-14 17:35:25

标签: python optimization openmdao

为什么SLSQP会在初始值附近陷入困境,而COBYLA则会向前迈进 正确的方向?

使用OpenMDAO 2.2.X实现优化问题;

3个设计变量 - >输入外部代码comp - >输出y为 目标(y,scaler = -1)。没有限制。

下图显示了两个优化器针对同一问题的行为。我试图改变SLSQP的有限差分设置,但它没有帮助。输出已成功终止优化。 (退出模式0)。

上传示例驱动程序和包装代码: https://gist.github.com/stackoverflow38/0219eda12d4c56ce84c68d201d1f1926

comparison of the same setup

2 个答案:

答案 0 :(得分:1)

我没有看到您的问题设置有任何明显错误,但如果没有gf_run.py,则无法运行您提供的模型进行测试。所以取而代之的是,我能给你的最佳猜测是以下选项之一:

1)COBYLA是一种无梯度优化器,可以在设计空间中进行搜索。也许它找到了一个不同的优化,而SLSQP在起​​点附近陷入了较小的优化。要对此进行测试,您可以使用COBYLA的结果作为SLSQP的初始猜测。如果SLSQP收敛到与COBYLA相同(或接近相同)的点,那么它可能是局部最优问题。

2)SLSQP使用渐变,使用中心差异近似。即使使用二阶中心差分,这些导数近似也可能很差。不清楚底层代码中是否有某种隐式求解器(如牛顿求解器或while循环收敛)。如果它确实有某种内部求解器,那么你需要确保公差设置得非常紧凑 - 至少比你的FD步长低两个数量级会更好。即使这样,也可能无法在代码中使用求解器获得高质量的FD近似。您也可以尝试稍微更改FD步长。

答案 1 :(得分:1)

我认为原因是FD步骤太小而渐变不准确。到目前为止,我已经使用了1e-3到1e-6的步骤。而现在我使用1,优化器并没有因为所有设计变量而陷入1步。我猜测外部代码输出的差异非常小,FD步长很小(1e-3),因此优化器没有准确计算梯度。