在 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 我如何正确设置边界和比例因子以使优化器正常工作?
ref0
和 ref
分别指定优化器认为是 0 和 1 的值。当您设置 ref0 > ref
时,您实际上是在翻转该变量的轴,就优化器而言。
然后将缩放应用于您的 lower
和 upper
边界。因为轴翻转了,upper
现在小于 lower
并且优化器不高兴。
在这种情况下,可以通过交换 lower
和 upper
的值来获得正确的行为,尽管我认为提供 ref > ref0
更符合逻辑。
我试图在我的优化问题中包含一些 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 我如何正确设置边界和比例因子以使优化器正常工作?
ref0
和 ref
分别指定优化器认为是 0 和 1 的值。当您设置 ref0 > ref
时,您实际上是在翻转该变量的轴,就优化器而言。
然后将缩放应用于您的 lower
和 upper
边界。因为轴翻转了,upper
现在小于 lower
并且优化器不高兴。
在这种情况下,可以通过交换 lower
和 upper
的值来获得正确的行为,尽管我认为提供 ref > ref0
更符合逻辑。