【问题标题】:OpenMDAO: Solver converging to non-optimal pointOpenMDAO:求解器收敛到非最优点
【发布时间】:2018-06-25 15:36:45
【问题描述】:

我试图了解 OpenMDAO 优化算法的局限性。特别是我设置了以下简单的例子:

from openmdao.api import Problem, ScipyOptimizeDriver, ExecComp, IndepVarComp, ExplicitComponent

class AddComp(ExplicitComponent):

    def setup(self):
        self.add_input("x")
        self.add_input("y")
        self.add_output("obj")

    def compute(self, inputs, outputs):
        outputs['obj'] = inputs["x"] + inputs["y"]

# build the model
prob = Problem()
indeps = prob.model.add_subsystem('indeps', IndepVarComp())
indeps.add_output('x', 3.0)
indeps.add_output('y', -4.0)

prob.model.add_subsystem("simple", AddComp())

prob.model.connect('indeps.x', 'simple.x')
prob.model.connect('indeps.y', 'simple.y')

# setup the optimization
prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'

prob.model.add_design_var('indeps.x', lower=-50, upper=50)
prob.model.add_design_var('indeps.y', lower=-50, upper=50)
prob.model.add_objective('simple.obj')

prob.setup()
prob.run_driver()
# minimum value
print(prob['simple.obj'])
# location of the minimum
print(prob['indeps.x'])
print(prob['indeps.y'])

打印出来的是:

Optimization terminated successfully.    (Exit mode 0)
            Current function value: -1.0
            Iterations: 1
            Function evaluations: 1
            Gradient evaluations: 1
Optimization Complete
-----------------------------------
[-1.]
[ 3.]
[-4.]

但是,最佳解决方案当然是 x=y=-50。怎么找不到这个解决方案?

出于某种原因,我认为驱动程序应该为凸问题找到正确的解决方案。但我意识到这听起来像是对求解器限制的粗略总结。有人能指出哪些问题可以通过哪些方法解决吗?

【问题讨论】:

    标签: openmdao


    【解决方案1】:

    这里发生的情况是,OpenMDAO 没有为优化器计算目标梯度,因为您必须明确声明部分。

    在组件的 setup 方法中添加以下内容将声明部分的常量值(在这种情况下我们不需要 compute_partials 方法,因为目标是输入的线性函数,因此部分是常量)。

    self.declare_partials(of='obj', wrt='x', val=1.0)
    self.declare_partials(of='obj', wrt='y', val=1.0)
    

    或者,您可以告诉 OpenMDAO 通过有限差分或复数步计算组件的所有部分:

    self.declare_partials(of='*', wrt='*', method='cs')
    

    其中方法是“cs”或“fd”之一。

    通过该更改找到预期的最佳值:

    Optimization terminated successfully.    (Exit mode 0)
                Current function value: -99.99999999983521
                Iterations: 7
                Function evaluations: 7
                Gradient evaluations: 7
    Optimization Complete
    -----------------------------------
    [-100.]
    [-50.]
    [-50.]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      相关资源
      最近更新 更多