2016-02-12 64 views
0

我有兴趣探索基于代理的优化。我还没有写opendao代码,只是想知道OpenMDAO会支持这项工作的程度。DOE驱动程序结果是否可以提供Metamodel组件?

我看到它有一个DOE驱动程序来生成培训数据(http://openmdao.readthedocs.org/en/1.5.0/usr-guide/tutorials/doe-drivers.html),我看到它有几个代理模型可以添加到元模型(http://openmdao.readthedocs.org/en/1.5.0/usr-guide/examples/krig_sin.html)。然而,我还没有找到一个能源部的结果作为培训数据传递给元模型的例子。

在许多示例/教程/论坛帖子中,似乎训练数据直接在元模型上或内部创建。所以这些东西如何协同工作并不清楚。

开发人员能否解释培训数据是如何从DOE传递给元模型的?谢谢!

回答

0

在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() 
+0

感谢您的帮助贾斯汀! –

相关问题