在 OpenMDAO 中使用边界时如何使用偏移量 (ref0) 正确缩放

How to scale correctly with an offset (ref0) when using bounds in OpenMDAO

我试图在我的优化问题中包含一些 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' 设计变量将导致边界错误。 can/should 我如何正确设置边界和比例因子以使优化器正常工作?

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

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

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