首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“TypeError”,同时使用NSGA2解决多目标问题。从pyopt到OpenMDAO 1.x中的稀疏

“TypeError”,同时使用NSGA2解决多目标问题。从pyopt到OpenMDAO 1.x中的稀疏
EN

Stack Overflow用户
提问于 2016-02-02 08:45:42
回答 1查看 548关注 0票数 2

我试图用openMDAO的pyopt稀疏驱动程序和NSGA2算法来解决一个多目标优化问题.以下是守则:

代码语言:javascript
运行
复制
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()

我得到了以下错误-

代码语言:javascript
运行
复制
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

请告诉您是否可以对上述错误做任何事情,以及如何修复它。

同时,多目标问题解的输出将以何种形式返回.我打算为此建立一个帕累托最优的前线。谢谢你们所有人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-03 13:58:12

事实证明,这不是一个OpenMDAO错误,而是NSGA2稀疏包装器中的一个bug。修复并不糟糕,我已经向pyoptsparse提交了一个拉请求。在此期间,可以很容易地修补本地的pyopts解译副本。

你问过结果将如何报告。当前的NSGA2包装器不会对结果做任何事情。它只允许NSGA2将它们全部写入一系列文本文件,如如下所示的nsga2_best_pop.out

代码语言:javascript
运行
复制
# 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是一个没有梯度的优化器,根本不使用它。因此,除非您也计划测试一些基于梯度的方法,否则可以将该方法排除在组件之外。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35148660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档