使用NSGA2解决多目标概率时出现'TypeError'。来自OpenMDAO 1.x中的pyopt-sparse

时间:2016-02-02 08:45:42

标签: python optimization openmdao

我正在尝试使用openMDAO的pyopt-sparse驱动程序和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

请告诉您是否可以解决上述错误以及如何修复错误。

此外,将以何种形式返回多目标问题解决方案的输出。我打算为此产生一个帕累托最优的前沿。 谢谢大家。

1 个答案:

答案 0 :(得分:2)

事实证明这不是OpenMDAO错误,而是NSGA2的Pyopt稀疏包装中的错误。解决方案并不可怕,我已经为pyoptsparse回购提交了pull request。与此同时,修补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是一个无梯度优化器,并且根本不会使用它。因此,除非您还计划测试一些基于渐变的方法,否则您可以将该方法从组件中删除。