检查优化器是否支持梯度

Checking if the optimizer support gradient

我想区分优化器(基于梯度的和免费的)。如果我在使用 SLSQP 的 OpenMDAO 的主要网页中使用示例优化并检查优化器是否支持渐变,我会得到 "False" ;

prob.driver.supports['gradients']

这是 OpenMDAO 还是 Scipy 相关问题?

在问题 运行.

之前,还有其他方法可以查看优化器是否会使用梯度计算吗?

根据下面的答案,我在脚本的开头添加了这个;谢谢!

    prob = om.api.Problem()
    prob.driver = user_driver_object
    prob.setup()
    prob.final_setup()
    grads.append(prob.driver.supports['gradients'])

ScipyOptimizeDriver 中,并非所有优化器都支持梯度优化,因此在设置驱动程序之前您无法确定正确的值这是在您的问题的 final_setup() 中完成的(调用 _setup_driver() 在你的驱动程序中)。此方法在 run_model()run_driver() 中调用,但您也可以自己调用它以获取优化器的正确属性。

在下面的示例中,我询问驱动程序 3 次是否支持渐变。第一次,在 problem 设置之后,它给出了一个错误的答案(默认),因为驱动程序还没有被触及。如果我调用 final_setup(),这将设置驱动程序,并且驱动程序的所有属性都是正确的。如果调用 run_model()run_driver(),当然这也会设置驱动程序。

所以我的建议是在从您的驱动程序查询任何内容之前使用 final_setup(),这可能会在设置过程中发生变化(主要是优化器特定的属性)。

import openmdao.api as om

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

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

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

# setup the optimization
driver = prob.driver = om.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('paraboloid.f')

prob.setup()
print("\nSupports gradients (after setup)?")
print(prob.driver.supports['gradients'])

prob.final_setup()
print("\nSupports gradients (after final setup)?")
print(prob.driver.supports['gradients'])

prob.run_driver()
print("\nSupports gradients (after run)?")
print(prob.driver.supports['gradients'])

这导致以下输出:

Supports gradients (after setup)?
False
Supports gradients (after final setup)?
True
Optimization terminated successfully.    (Exit mode 0)
            Current function value: -27.33333333333333
            Iterations: 5
            Function evaluations: 6
            Gradient evaluations: 5
Optimization Complete
-----------------------------------
Supports gradients (after run)?
True