【问题标题】:How to scale correctly with an offset (ref0) when using bounds in OpenMDAO在 OpenMDAO 中使用边界时如何使用偏移量 (ref0) 正确缩放
【发布时间】:2021-11-19 10:08:48
【问题描述】:

我试图在我的优化问题中包含一些 ref0= 缩放,但我不断收到边界错误:ValueError: SLSQP Error: lb > ub in bounds True, False.。如果没有 ref0= 缩放,优化运行良好。以文档中的抛物面优化示例(稍作修改以获得更大的值):

import openmdao.api as om

# build the model
prob = om.Problem()

prob.model.add_subsystem('paraboloid', om.ExecComp('f = (x-10)**2 + x*y + (y+40)**2 - 3'))

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

prob.model.add_design_var('paraboloid.x', lower=20, upper=60, ref=10, ref0=40)
prob.model.add_design_var('paraboloid.y', lower=-100, upper=50, ref=10)
prob.model.add_objective('paraboloid.f')

prob.setup()

# Set initial values.
prob.set_val('paraboloid.x', 40)
prob.set_val('paraboloid.y', -4.0)

# run the optimization
prob.run_driver()

# minimum value
print(prob.get_val('paraboloid.f'))

# location of the minimum
print(prob.get_val('paraboloid.x'))
print(prob.get_val('paraboloid.y'))

当然,这个简单的问题可能没有必要添加这样的缩放,但它的目的是重现问题。将 ref0=40 添加到“paraboloid.x”设计变量将导致边界错误。我如何/应该如何正确设置边界和比例因子以使优化器正常工作?

【问题讨论】:

    标签: openmdao


    【解决方案1】:

    ref0ref 分别指定优化器视为 0 和 1 的值。当您设置ref0 > ref 时,就优化器所知,您实际上是在翻转该变量的轴。

    然后将缩放应用于您的lowerupper 边界。因为轴被翻转了,upper 现在小于lower,优化器很不高兴。

    在这种情况下,可以通过交换 lowerupper 的值来获得正确的行为,尽管我认为提供 ref > ref0 更合乎逻辑。

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      相关资源
      最近更新 更多