为什么 SLSQP 采取了如此不同寻常的优化路线?

问题描述

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

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

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

enter image description here

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

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

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

enter image description here

它看起来稍微平滑一些,翼展的弹跳更少。

解决方法

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

认为你的直觉是它应该平稳地接近最小值,这通常并不正确。拟牛顿方法的初始步长高度依赖于缩放和初始猜测。此外,您必须考虑约束和线搜索效果。所有这些也与拟牛顿黑森近似有关。因此,您看到的抖动是所有这些的集合。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...