DOE驱动程序结果可以提供Metamodel组件吗?

时间:2016-02-12 16:13:02

标签: openmdao

我有兴趣探索基于代理的优化。我还没有编写opendao代码,只想弄清楚OpenMDAO将在多大程度上支持这项工作。

我看到它有一个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的结果作为训练数据传递给Meta模型。

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

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

1 个答案:

答案 0 :(得分:0)

在openmdao 1.x中,这种过程不是通过DOE直接支持,但它绝对是可能的。您可以采取两种途径,根据您的最终目标提供不同的好处。

我将基于单个高级别分类来区分不同的场景:

1)您希望围绕整个DOE / Metamodel组合进行基于梯度的优化。例如,如果您想使用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()