如何在优化框架内使用外部代码组件

How to use an external code component within the optimization framework

您好,我正在尝试使用抛物面外部代码组件来获得与抛物面优化问题 (openmdao v 2.2.0) 相同的结果。

所以在我看来,自变量 x,y 应该更新,从而改变外部组件的输入文件以最小化输出 f。
并不是说我得到了这个工作,但我基本上将外部组件的输出添加为 objective 并将自变量添加为设计变量等(参见下面的代码)。 但更重要的是,我无法从概念上理解优化器如何知道此类外部代码中的导数。 我尝试 'COBYLA' 认为这可能是一种实现无梯度方法的方法,但 iprint 语句中似乎存在错误,因为我也无法 运行 示例抛物面优化。

我想我对代理人也有类似的问题。例如,我使用 Metamodelunstructured 组件来查找我的代理项,如果我要求已知值,该代理项表现良好。但我看不到如何将此组件的输出耦合为优化器的 objective。我认为我给模型 objective 做的是对的。但不确定...

答案可能是我完全脱离了优化逻辑,如果是的话请参考相关论文了解背后的算法。

提前致谢

from openmdao.api import Problem, Group, IndepVarComp
from openmdao.api import  ScipyOptimizeDriver
from openmdao.components.tests.test_external_code import ParaboloidExternalCode

top = Problem()
top.model = model = Group()

# create and connect inputs
model.add_subsystem('p1', IndepVarComp('x', 3.0))
model.add_subsystem('p2', IndepVarComp('y', -4.0))
model.add_subsystem('p', ParaboloidExternalCode())

model.connect('p1.x', 'p.x')
model.connect('p2.y', 'p.y')

top.driver = ScipyOptimizeDriver()
top.driver.options['optimizer'] = 'SLSQP'

top.model.add_design_var('p1.x', lower=-50, upper=50)
top.model.add_design_var('p2.y', lower=-50, upper=50)
top.model.add_objective('p.f_xy')
top.driver.options['tol'] = 1e-9
top.driver.options['disp'] = True
top.setup()
top.run_driver()
# minimum value
# location of the minimum
print(top['p1.x'])
print(top['p2.y'])

所以,我想你主要问的是如何为外部代码提供衍生。我认为这确实有两种选择。

  1. 外部组件的有限差异。

测试示例没有显示如何执行此操作,这很不幸,但您可以采用与为纯 python 组件声明导数 fd 相同的方式来执行此操作,即通过将此行添加到外部组件的设置方法:

self.declare_partials(of='*', wrt='*', method='fd')
  1. 提供另一种外部方法来计算导数,并将其包装在"compute_partials"方法中。

我们使用提供伴随解的 CFD 代码来做到这一点。您也可以在外部源代码上使用自动微分以这种方式生成可调用函数。但是,我认为方法 1 是您在这里要求的。