离散 Independent/Design 变量 ? openmdao 2.2.0

Discrete Independent/Design Variables ? openmdao 2.2.0

可以确定设计变量的下限和上限,例如在抛物面样本内:

top.model.add_design_var('p1.x', lower=-50, upper=50)

但是是否可以通过用户输入步骤强制优化器扫描设计变量?

类似于

top.model.add_design_var('p1.x', lower=-50, upper=50, increment=2)

或者将其作为数组引入

top.model.add_design_var('p1.x', [-50,-25,25,50])

使用基于梯度的优化器是不可能的。您将需要使用无梯度方法。与 OpenMDAO 2.2 一样,没有任何内置的方式来强制执行这种离散化。您需要围绕问题 class 使用外部循环才能使其正常工作。

这是一个简单的例子:

import numpy as np
from openmdao.api import Problem, ScipyOptimizeDriver, ExecComp, IndepVarComp

# 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('paraboloid', 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
prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'

prob.model.add_design_var('indeps.y', lower=-50, upper=50)
prob.model.add_objective('paraboloid.f')

prob.setup()


for x in np.arange(-10,12,2): 
    prob['indeps.x'] = x

    # could call just run_model if no optimization was desired
    #prob.run_model()

    # for each value of x, optimize for y
    prob.run_driver()

    # minimum value
    print(prob['paraboloid.f'])

    # location of the minimum
    print(prob['indeps.x'])
    print(prob['indeps.y'])