Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ';类型错误';同时利用NSGA2解决多目标问题。从OpenMDAO 1.x中的pyopt稀疏_Python_Optimization_Openmdao - Fatal编程技术网

Python ';类型错误';同时利用NSGA2解决多目标问题。从OpenMDAO 1.x中的pyopt稀疏

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

我正在尝试使用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, 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中的一些旧代码,这些代码在这方面会有一些用处: