Я пытаюсь решить проблему многоцелевой оптимизации, используя 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
Пожалуйста, скажите, если вы можете сделать что-либо из выше ошибки и как это исправить.
Кроме того, в какой форме будет возвращен выход решения многоцелевой задачи. Для этого я собираюсь создать для этого оптимальный для парето фронт. Спасибо всем.
Спасибо за помощь. Из этого результата мне нужно нарисовать оптимальную границу Парето. Можете ли вы дать некоторые основные шаги для этого. Кроме того, пиоп-разреженный драйвер не принимает никаких конкретных опций оптимизатора, таких как размер популяции, количество поколений и т. Д. Есть ли способ установить эти параметры с помощью OpenMDAO. –
Вы можете посмотреть, какие опции доступны: 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 –