2016-02-02 4 views
2

Я пытаюсь решить проблему многоцелевой оптимизации, используя openppp-open-драйвер openMDAO с алгоритмом NSGA2. Ниже приводится код:'TypeError' при использовании NSGA2 для решения многоцелевой задачи. от pyopt-разреженных в OpenMDAO 1.x

from __future__ import print_function 
from openmdao.api import IndepVarComp, Component, Problem, Group, pyOptSparseDriver 

class Circ2(Component): 

    def __init__(self): 
     super(Circ2, self).__init__() 

     self.add_param('x', val=10.0) 
     self.add_param('y', val=10.0) 

     self.add_output('f1', val=40.0) 
     self.add_output('f2', val=40.0) 

    def solve_nonlinear(self, params, unknowns, resids): 

     x = params['x'] 
     y = params['y'] 

     unknowns['f1'] = (x - 0.0)**2 + (y - 0.0)**2 
     unknowns['f2'] = (x - 1.0)**2 + (y - 1.0)**2 

    def linearize(self, params, unknowns, resids): 

     J = {} 
     x = params['x'] 
     y = params['y'] 

     J['f1', 'x'] = 2*x 
     J['f1', 'y'] = 2*y 
     J['f2', 'x'] = 2*x-2 
     J['f2', 'y'] = 2*y-2 
     return J 


if __name__ == "__main__": 

    # Defining Problem & Root 
    top = Problem() 
    root = top.root = Group() 

    # Adding in-present variable values and model 
    startVal = 50.0 
    root.add('p1', IndepVarComp('x', startVal)) 
    root.add('p2', IndepVarComp('y', startVal)) 

    root.add('p', Circ2()) 

    # Making Connections 
    root.connect('p1.x', 'p.x') 
    root.connect('p2.y', 'p.y') 

    # Configuring Driver 
    top.driver = pyOptSparseDriver() 
    top.driver.options['optimizer'] = 'NSGA2' 

    # Setting bounds for the optimizer 
    top.driver.add_desvar('p1.x', lower=-600, upper=600) 
    top.driver.add_desvar('p2.y', lower=-600, upper=600) 

    # Setting Objective Function(s) 
    top.driver.add_objective('p.f1') 
    top.driver.add_objective('p.f2') 

    # # Setting up constraints 
    # top.driver.add_constraint('con.c', lower=1.0) 

    top.setup() 
    top.run() 

, и я получаю следующее сообщение об ошибке -

Traceback (most recent call last): 
    File "/home/prasad/DivyaManglam/Python Scripts/Pareto Testing/Basic_Sphere.py", line 89, in <module> 
    top.run() 
    File "/usr/local/lib/python2.7/dist-packages/openmdao/core/problem.py", line 1038, in run 
    self.driver.run(self) 
    File "/usr/local/lib/python2.7/dist-packages/openmdao/drivers/pyoptsparse_driver.py", line 280, in run 
    sol = opt(opt_prob, sens=self._gradfunc, storeHistory=self.hist_file) 
    File "/usr/local/lib/python2.7/dist-packages/pyoptsparse/pyNSGA2/pyNSGA2.py", line 193, in __call__ 
    self.optProb.comm.bcast(-1, root=0) 
    File "MPI/Comm.pyx", line 1276, in mpi4py.MPI.Comm.bcast (src/mpi4py.MPI.c:108819) 
    File "MPI/msgpickle.pxi", line 620, in mpi4py.MPI.PyMPI_bcast (src/mpi4py.MPI.c:47164) 
    File "MPI/msgpickle.pxi", line 143, in mpi4py.MPI.Pickle.load (src/mpi4py.MPI.c:41248) 
TypeError: only length-1 arrays can be converted to Python scalars 

Пожалуйста, скажите, если вы можете сделать что-либо из выше ошибки и как это исправить.

Кроме того, в какой форме будет возвращен выход решения многоцелевой задачи. Для этого я собираюсь создать для этого оптимальный для парето фронт. Спасибо всем.

ответ

2

Оказывается, это не ошибка OpenMDAO, а скорее ошибка в разреженной оболочке Pyopt для NSGA2. Исправление не было ужасным, и я отправил pull request в repoptsparse repo для него. Тем временем было бы достаточно легко исправить локальную копию pyoptsparse.

Вы спрашивали, как будут сообщены результаты. Текущая оболочка NSGA2 ничего не делает с результатами. Он просто позволяет NSGA2 писать их все в ряд текстовых файлов, таких как nsga2_best_pop.out, которые выглядят так:

# This file contains the data of final feasible population (if found) 
# of objectives = 1, # of constraints = 0, # of real_var = 2, # of bits of bin_var = 0, constr_violation, rank, crowding_distance 
-1.000000e+00 3.190310e+01 -2.413640e+02 0.000000e+00 1  1.000000e+14 
-1.000000e+00 -5.309160e+02 2.449727e+02 0.000000e+00 1  0.000000e+00 
-1.000000e+00 -3.995119e+02 -1.829071e+02 0.000000e+00 1  0.000000e+00 

В качестве примечания, в вашем примере, вы реализовали метод линеаризации для компонента в вашем примере. Этот метод используется, когда вам нужно вычислять градиенты, но NSGA2 является оптимизатором без градиента и вообще не будет использовать его. Поэтому, если вы также не планируете тестировать некоторые методы на основе градиента, вы можете оставить этот метод вне своих компонентов.

+0

Спасибо за помощь. Из этого результата мне нужно нарисовать оптимальную границу Парето. Можете ли вы дать некоторые основные шаги для этого. Кроме того, пиоп-разреженный драйвер не принимает никаких конкретных опций оптимизатора, таких как размер популяции, количество поколений и т. Д. Есть ли способ установить эти параметры с помощью OpenMDAO. –

+0

Вы можете посмотреть, какие опции доступны: https://bitbucket.org/mdolab/pyoptsparse/src/8588944541cbee2dc14758ed405822a18f6685e5/pyoptsparse/pyNSGA2/pyNSGA2.py?at=default&fileviewer=file-view-default. Что касается шагов для построения границы парето, у нас нет ничего конкретного в 1.x, чтобы помочь вам, но вы можете посмотреть на какой-то старый код из OpenMDAO classic, который будет полезен в этом отношении: https: // github .com/openMDAO/openMDAO-Framework/BLOB/DEV/openmdao.lib/SRC/openmdao/Библиотека/компоненты/pareto_filter.py –