我有兴趣探索基于代理的优化。我还没有编写opendao代码,只是想弄清楚OpenMDAO将在多大程度上支持这项工作。
我看到它有一个DOE驱动程序来生成训练数据(http://openmdao.readthedocs.org/en/1.5.0/usr-guide/tutorials/doe-drivers.html),我看到它有几个可以添加到元模型(sin.html)中的代理模型。然而,我还没有找到一个将DOE的结果作为训练数据传递给元模型的例子。
在许多示例/教程/论坛文章中,似乎培训数据是直接在元模型上或内部创建的。因此,目前尚不清楚这些事情是如何相互作用的。
开发人员能否解释培训数据是如何从DOE传递到元模型的?谢谢!
发布于 2016-02-13 02:27:00
在openmao1.x中,这种过程并不是通过DOE直接支持的,但这是绝对有可能的。你可以采取两种方式,根据你最终的目标提供不同的好处。
我将根据单一的高级别分类来区分不同的场景:
1)要围绕整个DOE/Metamodel组合进行基于梯度的优化。例如,如果您想使用CFD预测几个关键点的阻力,然后使用元模型生成任务分析的阻力极,就会出现这种情况。本文在同时飞机-任务设计优化。上找到了这种建模的一个很好的例子。
2)不想围绕整个模型进行基于梯度的优化。您可能需要进行无梯度优化(如遗传算法)。您可能希望在代理程序本身周围进行基于梯度的优化,并使用固定的训练数据。或者你可能根本不想做优化.
如果您的用例属于场景1(或将来最终将属于此用例),那么您需要使用多点方法。您可以为每个训练案例创建模型的一个实例,然后可以将结果复制到传递到元模型中的数组中。这是必要的,以便导数可以通过整个模型传播。多点方法会工作得很好,而且非常可并行性.根据用于生成培训数据本身的模型的结构,您还可以考虑一种稍微不同的多点方法,将一个分布式构件或一系列分布式组件链接在一起。如果您的模型将支持它,则分布式组件方法是在这种情况下使用的最有效的模型结构。
如果您是用例落入场景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()https://stackoverflow.com/questions/35367201
复制相似问题