DOE 驱动程序结果可以提供元模型组件吗?

Can DOE driver results feed Metamodel component?

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

我看到它有一个 DOE 驱动程序来生成训练数据 (http://openmdao.readthedocs.org/en/1.5.0/usr-guide/tutorials/doe-drivers.html), I see that it has several surrogate models that can be added to a meta model (http://openmdao.readthedocs.org/en/1.5.0/usr-guide/examples/krig_sin.html)。然而,我还没有找到将 DOE 的结果作为训练数据传递给元模型的示例。

在许多 examples/tutorials/forum-posts 中,训练数据似乎是直接在元模型上或元模型内创建的。所以不清楚这些东西是如何协同工作的。

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

在 openmdao 1.x 中,这种过程还没有通过 DOE 直接支持(目前),但绝对有可能。您可以采用两种途径,根据您的最终目标,它们会带来不同的好处。

我将根据一个高级分类来区分不同的场景:

1) 您想围绕整个 DOE/Metamodel 组合进行基于梯度的优化。例如,如果您想使用 CFD 预测几个关键点的阻力,然后使用元模型生成用于任务分析的阻力极线,就会出现这种情况。在 simultaneous aircraft-mission design optimization. 上的这篇论文中可以找到这种建模的一个很好的例子。

2) 您不想围绕整个模型进行基于梯度的优化。您可能想要进行无梯度优化(如遗传算法)。您可能希望使用固定的训练数据围绕代理项本身进行基于梯度的优化。或者您可能根本不想进行优化...

如果您的用例属于场景 1(或者将来最终会属于此用例),那么您想使用 multi-point 方法。您为每个训练案例创建一个模型实例,然后您可以将结果混合到一个数组中,然后传递给元模型。这是必要的,以便衍生品可以 通过完整模型传播。多点方法会很好地工作,并且非常 parallelizable. Depending on the structure of the model you will use for generating the training data itself, you might also consider a slightly different multi-point approach with a distributed component 或将一系列分布式组件链接在一起。如果您的模型支持它,那么分布式组件方法是在这种情况下使用的最有效的模型结构。

如果您的用例属于场景 2,您仍然可以根据需要采用多点方法。它开箱即用。但是,您也可以考虑使用常规 DOE 来生成训练数据。为此,您需要使用 ,将 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()