在openmdao 1.x中,这种过程不是直接支持(但是)通过DOE,但它绝对有可能。您可以采取两种途径,根据您的最终目标提供不同的益处。
我会分开基于单一的高级分类的不同的方案:
1)你想干什么围绕整个DOE /元模型的组合基于梯度的优化。例如,如果您想使用CFD预测几个关键点的阻力,然后使用元模型为任务分析生成阻力极点,则会出现这种情况。这种建模的一个很好的例子可以在这篇simultaneous aircraft-mission design optimization.的文章中找到。
2)您不希望在整个模型中进行基于渐变的优化。您可能想要进行无梯度优化(如遗传算法)。您可能希望在代理本身周围进行基于渐变的优化,并使用固定的培训数据。或者你可能根本不想进行优化......
如果你的用例属于情景1(或者最终会在未来使用情况下),那么你想使用multi-point方法。您可以为每个培训案例创建一个模型实例,然后将结果复合到您传递给元模型的数组中。这是必要的,因此衍生品可以在整个模型中传播。多点方法可以很好地工作,并且非常简单,就是parallelizable。根据您将用于生成训练数据本身的模型的结构,您可能还会考虑将distributed component或一系列分布式组件链接在一起的稍微不同的多点方法。如果你的模型支持它,分布式组件方法是在这种情况下使用的最有效的模型结构。
如果您的用例属于方案2,您仍然可以使用多点方法。它会开箱即用。但是,您也可以考虑使用常规DOE来生成培训数据。为了做到这一点,您需要使用nested-problem approach,您可以在其中将DOE训练数据生成置于子问题中。这也将起作用,尽管它会花费一些额外的编码来从DOE中获得结果数组,因为目前尚未实施。
如果您想使用DOE生成数据,然后将其传递到可以优化的代理,您可以使用一对问题实例。这并不一定要求你完成嵌套问题。相反,您只需构建一个运行脚本,该脚本包含一个使用DOE的问题实例,并在完成后将数据收集到数组中。然后,您可以在第二个问题实例中手动将其分配给元模型的训练输入。类似下面的伪代码:
prob1 = Problem()
prob1.driver = DOE()
#set up the DOE variables and model ...
prob1.run()
training_data = prob1.driver.results
prob2 = Problem()
prob2.driver = Optimizer()
#set up the meta-model and optimization problem
prob2['meta_model.train:x'] = training_data
prob2.run()
感谢您的帮助贾斯汀! –