在 OpenMDAO 中实现 AMMF

Implementing AMMF within OpenMDAO

我有兴趣探索多保真 (MF) 优化方法。我试图弄清楚 OpenMDAO 将如何支持这项工作。我不想深入了解 OpenMDAO 代码,除非我确定它可以完成这项工作。

AMMF 是一种简单的 MF 方法。它基本上通过一阶校正优化信任区域内的低保真度模型,因此结果类似于高保真度方法。基本算法如下:

X=X_0
While not converged
    Calculate y_hf = high_fidelity(X)
    Calculate y_lf = low_fidelity(X)
    Calculate grad_y_hf = grad_high_fidelity(X)
    Calculate grad_y_lf = grad_low_fidelity(X)
    set_low_to_high_transfer_function(y_hf,y_lf,grad_y_hf,grad_y_lf)
    optimize on corrected_transfer_function within |X-X0|<rho
    based on solution, lagrange multipliers adjust rho
    X=X_opt_solution
repeat

我认为在 OpenMDAO 中 high_fidelity() 和 low_fidelity() 可以与适当的驱动程序分组,我可以调用线性化方法来获取梯度。

然后优化阶段是一个基本的 OpenMDAO 优化问题,就像在包含低保真度分析以及纠正该分析输出的附加组件的组上运行的教程中的那些一样。

然后外循环可以实现为纯 python。我真的看不出在哪里需要 OpenMDAO。也许有人可以对此发表评论?

问题:

这是用 OpenMDAO 实现 AMMF 的明智方法吗?

我在纯 python 中看到的一个问题是在录音机中。我需要为外循环添加一个额外的迭代变量。我如何配置记录器以了解这个额外的循环?

要评估收敛性和调整信赖域,您需要拉格朗日乘数。对于基于梯度的方法,这些通常在优化解决方案中计算。 OpenMDAO 包装器是否有提取这些值的方法?或者我是否必须创建自己的意大利面条代码来从优化输出文件中检索值?

感谢您的帮助!

如果我能正常工作,我将很乐意将其作为 OpenMDAO 1.x 文档的教程传递。我个人认为更复杂的示例将对社区有所帮助。

在 OpenMDAO 中将类似的东西设置为单个整体模型是不可能的。到目前为止,最简单的方法是使用三个独立的问题实例。

  1. 高保真度问题
  2. 低保真度问题
  3. 低-高-传递函数问题(可选)

您将使用前两个问题实例来计算分析结果和梯度。第三个问题可能是可选的,因为我希望它会更简单,并且可以用一个简单的函数手动实现。 我会写一个标准的 python 脚本来按照你的伪代码建议的方式循环。

因此,您将使用 OpenMDAO 来简化构建分析模型并从中获取导数。但是然后围绕它构建一个自定义 python 脚本来实现您的 AMMF。

至于拉格朗日乘数,none 我们当前的优化器将这些作为结果公开,因此您要么必须推出自己的优化器,要么在我们的优化器中修改源代码。它不是 openmdao 包装器问题...这是 python 包装器尚未公开该信息的问题。

尝试完全在 OpenMDAO 中构建一个完整且非常复杂的过程可能很诱人。有时,这是正确的选择。但在这种情况下,高级算法的组装非常简单,您也不需要计算它的导数。所以直接在OpenMDAO中实现top进程的需求并不强烈。相反,使用 OpenMDAO 作为制作此部分的工具:

Calculate y_hf = high_fidelity(X)
Calculate y_lf = low_fidelity(X)
Calculate grad_y_hf = grad_high_fidelity(X)
Calculate grad_y_lf = grad_low_fidelity(X)

更简单,并使用更传统的编码类型来实现顶级算法。