【问题标题】:How do I warm start a dymos optimization problem?如何热启动 dymos 优化问题?
【发布时间】:2021-10-30 12:08:21
【问题描述】:

我的问题: 我有一个要优化的具有 4 个状态和 4 个参数(静态)的系统。这些参数被初始化为一些已知的值,这些值将导致遵循约束的轨迹。状态被初始化为一个常数值。为了验证模型,我运行了参数设置 opt=False 的问题。验证后,我使用 opt=True 重建 OpenMDAO 问题并运行优化器。

我正在进行一项研究,以评估每个参数如何影响系统、成本函数等,以及初始猜测如何影响优化(理想情况下不会)。我遇到的问题是,对参数的一些初始猜测会导致优化失败(迭代限制或正线搜索),而另一些则不会,目前尚不清楚原因。注意:我总是为导致可行轨迹的问题提供初始猜测。我在构建问题时通过为参数设置 opt=False 来检查这一点。 我的假设是,虽然我最初对参数的猜测是可以的,但我对状态的最初猜测却不是这样,并且在试图获得可行的轨迹时问题被卡住了。

我的解决方案/想法: 是否可以在 Dymos 中热启动优化问题?为了热身,我想为优化器的状态和状态速率提供一个可行的解决方案。作为一般流程,我想首先 (1) 使用控件中的 opt 设置运行优化,并将参数设置为 False 以获得状态轨迹,然后 (2)将控件和参数的 opt 设置设置为 True,最后 (3) 重新运行优化。似乎应该有一个简单的方法来做到这一点,但我无法确定如何不创建 2 个问题(使用不同的 opt 设置)并设置 opt 的所有初始状态猜测=True 问题。

注意:我确实阅读了这篇文章:Dymos how to use previous trajectory solution as initial guess?,我可以重新运行一个问题。我只是不知道如何在运行之间更改 opt 设置。

如果我的问题有替代或更好的解决方案,我也会对此感兴趣。

【问题讨论】:

  • 使用前面引用的帖子,您将构建问题并在设计变量上设置opt=False,并使用dymos.run_problem 从模拟轨迹生成输出文件。下次运行代码(或使用不同的运行脚本)时,将这些标志设置为 opt=True 并按定义加载先前的解决方案。它应该以该轨迹作为解决方案开始并从那里进行迭代。
  • 这成功了!感谢您的信息。当我看到第一次执行“run_problem()”时没有运行驱动程序时,我想我误解了之前的帖子。如果我理解正确,模拟和优化的轨迹应该是相同的,因此它们是设置优化的等效方法。我在下面提供了我的代码版本,它使用优化轨迹而不是模拟轨迹。
  • 首先,使用所有设置opt=False 运行问题并将输出保存为“Baseline.db”。 # 在不优化控件和参数的情况下运行问题:dm.run_problem(p,solution_record_file='Baseline.db') 其次,设置所需的设置opt=True 并重建问题。第三,使用以前的解决方案作为猜测运行新问题。 dm.run_problem(p, run_driver=True, simulate=False, restart='Baseline.db')
  • dymos 中使用的搭配/伪光谱技术通过对转录优化问题的约束来加强轨迹的物理有效性。当您从 run_driver=False, simulate=True 选项到 run_problem 开始时,您将跳过初始优化并告诉 dymos “只需使用控件和参数的初始猜测来模拟初始条件的轨迹”。这提供了一个物理上有效的轨迹,因此这些缺陷约束将接近于零(我们正在简化优化器的工作)。
  • 缺点是,对于某些问题,很难提供有效的初始控制猜测。最短时间爬升问题因此而臭名昭著。对 alpha 控制历史的错误猜测将使飞行路径垂直,其中运动方程是奇异的。有时缩短 t_duration 猜测很有用,这样即使猜测没有接近您想要的最终边界约束,您也可以获得物理上有效的模拟。

标签: openmdao


【解决方案1】:

如果您使用的是 IPOPT,则使用以前的解决方案作为您最初的猜测并没有真正的帮助。这是由于内点优化器的性质。开始时,障碍参数 mu 很大。这将推动“最佳”解决方案,对于障碍参数 mu 的值,从执行牛顿方法,远离最初的猜测。然后 mu 减少,牛顿法使您更接近真正的最优值。这个过程会随着 mu 的减少而重复,直到最后 mu 很小,然后你又回到了最初猜测的最优值。

另外,因为我们在通过 Dymos/pyoptsparse 时使用的是具有有限内存 Hessian 近似 (L-BFGS) 的 Quasi-Newton 方法,所以当您重新开始时,即使您的初始设置也不存在有关 Hessian 的所有信息猜测是最优的。因此,随着算法的迭代,这些信息必须再次填写。

我不是 IPOPT 专家,但这似乎可以解释为什么我没有运气尝试使用“改进的”初始猜测。对收敛有很大帮助的一件事是将“limited_memory_max_history”参数增加到 100 左右。

IPOPT 确实有热启动选项,但获得它所需的有关 Hessian 和初始乘数的初始信息可能是您必须进入 pyoptsparse 才能弄清楚如何做的事情。

【讨论】:

  • 感谢您添加的信息。我正在使用 ScipyOptimizeDriver 解决我的问题,并且热启动似乎增加了解决时间和可靠性。尽管正如您所提到的,重新启动的问题不会立即收敛。如果我最终在某个时候切换到 IPOPT,这将很有用。
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多