【问题标题】:Why does SLSQP take such an unusual optimisation route?为什么 SLSQP 会采取如此不同寻常的优化路线?
【发布时间】:2021-07-08 13:25:40
【问题描述】:

脚本的要点可在此处获得: https://gist.github.com/eufren/3f53eb285c7f426e678e1d63926fb34a

当我使用p.check_totals() 时,总导数似乎基本正确 - 典型的相对差异约为 1e-5,最大为 1e-2。

这是SLSQP下优化过程的动画:

它不是从起始平面平滑变形到优化平面(正如我对基于梯度的优化所期望的那样),而是捕捉到弦的最小允许值,然后在发展奇怪的同时采取奇怪的翼展脉冲路径沿着翼展的尖刺。最后,它会像我预期的那样顺利地转变为最终配置。

如何诊断这种异常优化的原因?是因为最初的设计违反了约束吗?是否可以降低 SLSQP 的步长以防止立即捕捉到最小界限?

编辑 1: 根据 Justin 的回复,我只制作了主要迭代的动画。

它看起来略微平滑,翼展的弹跳较少。

【问题讨论】:

  • 我认为 SLSQP 在迭代到最终解决方案期间不尊重界限。我很想知道 IPOPT 做了哪些尊重他们的事情。确实所有这些优化器都需要手动调整,而要调整哪个参数是猜测,除非您非常熟悉其背后的数学原理
  • 来自 scipy 的 SLSQP 确实尊重界限。 SLSQP 形式 pyoptsparse 没有(它的旧版本的 fortran 没有该功能)

标签: optimization openmdao


【解决方案1】:

您提供的要点不可运行,因此很难给出明确的答案。我们可以看到,您的初始条件与开始和最佳平面图之间的差异相去甚远。这意味着在您的初始条件下梯度可能非常陡峭,这将导致一些较大的初始步骤(SQP 方法的前几个步骤非常接近梯度下降)。

认为您的直觉是它应该平稳地接近最小值,但总的来说这并不正确。准牛顿方法的初始步长高度依赖于缩放和初始猜测。此外,您必须考虑约束和线搜索效果。所有这些也与准牛顿粗麻布近似有关。所以你看到的抽搐是所有这些的集合。

您可以尝试的一件事是过滤掉线搜索步骤,只查看“主要迭代”。过滤行搜索比听起来要难,因为优化器实际上并没有告诉您哪些情况是行搜索,哪些情况是主要的。通过查看来自驱动程序的案例记录器数据,可以很好地近似实现这一点,并打开record_derivatives 选项。任何具有与其相关联的派生词的案例(并非所有案例都会!)是主要迭代。没有它的任何一个都是行搜索。如果您只制作主要迭代的 opt-history-plot,它看起来会更加流畅。

【讨论】:

  • 糟糕!修复了要点中的问题(只是“fd”中的一个意外选项卡),它现在应该运行。更新了原帖中的链接。
  • 更新后的 gist 会运行,但不会产生任何优化结果。求解器无法在其第一次迭代中收敛。如果没有在我运行它时给出预期行为的有效测试用例,我将无法提供更多建议。
  • 奇怪,它可以在我的机器上运行。从 SolarDrone 中删除 from CoupledLiftingLineQuadraticDoublet import CoupledLLTQD,然后运行 ​​SolarDrone.py(不是 LiftingLine.py)。
猜你喜欢
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多