2016-02-12 4 views
0

Я заинтересован в изучении суррогатной оптимизации. Я еще не писал код opendao, просто пытаясь выяснить, насколько OpenMDAO будет поддерживать эту работу.Может ли результат подачи драйверов DOE метамодели?

Я вижу, что у него есть драйвер 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 передаются в качестве учебных данных в метамоду.

Во многих примерах/учебниках/форумах сообщения кажется, что данные обучения создаются непосредственно на метамодели или внутри нее. Поэтому неясно, как эти вещи работают вместе.

Могут ли разработчики объяснить, как данные обучения передаются из DOE в метамоду? Благодаря!

ответ

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

Спасибо за помощь Джастин! –