Python ';类型错误';同时利用NSGA2解决多目标问题。从OpenMDAO 1.x中的pyopt稀疏
我正在尝试使用openMDAO的pyopt稀疏驱动程序和NSGA2算法来解决一个多目标优化问题。代码如下:Python ';类型错误';同时利用NSGA2解决多目标问题。从OpenMDAO 1.x中的pyopt稀疏,python,optimization,openmdao,Python,Optimization,Openmdao,我正在尝试使用openMDAO的pyopt稀疏驱动程序和NSGA2算法来解决一个多目标优化问题。代码如下: from __future__ import print_function from openmdao.api import IndepVarComp, Component, Problem, Group, pyOptSparseDriver class Circ2(Component): def __init__(self): super(Circ2, sel
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
回溯(最近一次呼叫最后一次):
文件“/home/prasad/DivyaManglam/Python Scripts/Pareto Testing/Basic_Sphere.py”,第89行,在
top.run()
文件“/usr/local/lib/python2.7/dist packages/openmdao/core/problem.py”,第1038行,正在运行
self.driver.run(self)
文件“/usr/local/lib/python2.7/dist packages/openmdao/drivers/pyoptsparse_driver.py”,第280行,正在运行
sol=opt(opt_prob,sens=self.\u gradfunc,storeHistory=self.hist_文件)
文件“/usr/local/lib/python2.7/dist packages/pyoptsparse/pyNSGA2/pyNSGA2.py”,第193行,在调用中__
self.optProb.comm.bcast(-1,root=0)
文件“MPI/Comm.pyx”,第1276行,在mpi4py.MPI.Comm.bcast(src/mpi4py.MPI.c:108819)中
文件“MPI/msgpickle.pxi”,第620行,在mpi4py.MPI.PyMPI_bcast中(src/mpi4py.MPI.c:47164)
文件“MPI/msgpickle.pxi”,第143行,在mpi4py.MPI.Pickle.load(src/mpi4py.MPI.c:41248)中
TypeError:只有长度为1的数组才能转换为Python标量
请告知您是否可以对上述错误做出任何修改,以及如何修复
此外,多目标问题解的输出将以何种形式返回。我打算为此生成一个帕累托最优前沿。
谢谢大家。事实证明这不是OpenMDAO错误,而是NSGA2的Pyopt稀疏包装中的错误。修复并不糟糕,我已经向pyoptsparse repo提交了一份报告。同时,修补pyoptsparse的本地副本也很容易 你问结果将如何报告。当前的NSGA2包装器对结果没有任何影响。它只允许NSGA2将它们全部写入一系列文本文件,如
NSGA2\u best\u 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是一个无梯度的优化器,根本不使用它。所以,除非你也计划测试一些基于梯度的方法,你可以把这个方法从你的组件中去掉 谢谢你的帮助。我需要从这个结果中画出一个帕累托最优边界。你能给出一些这样做的基本步骤吗。此外,pyopt稀疏驱动程序不接受任何特定于优化器的选项,如总体大小、代数等。是否有方法使用OpenMDAO设置这些参数。您可以在此处查看可用的选项:。至于绘制帕累托前沿的步骤,我们在1.x中没有任何具体的帮助,但您可以查看OpenMDAO classic中的一些旧代码,这些代码在这方面会有一些用处: