0

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

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

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 文档的教程传递。我个人认为更复杂的例子会对社区有所帮助。

4

1 回答 1

0

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

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

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

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

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

尝试完全在 OpenMDAO 中构建一个完整且非常复杂的流程可能很诱人。有时,这是正确的选择。但是在这种情况下,您的高级算法的组装非常简单,您也不需要计算它的导数。所以直接在 OpenMDAO 中实现顶层流程的需求并不强烈。相反,使用 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)

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

于 2016-02-13T02:35:12.653 回答