【问题标题】:Does openmdao optimization drivers support array types, if only one objective is present?如果只存在一个目标,openmdao 优化驱动程序是否支持数组类型?
【发布时间】:2019-02-21 21:00:35
【问题描述】:

我已经设置了一个目标函数 - obj = (x0-u0)^2 + (u0)^2 我正在使用带有 SLSQP 的 Scipyoptimizer 计算最小值。我将 x0 作为输入,因此它会即时计算 u0,同时也最小化 obj。现在,我尝试使用值数组而不是 x0,但它会给出错误并抛出 - 仅返回标量值。

我已经尝试过函数 run_model()。模型工作完美。 但是在运行函数 - run_driver() 时,它会抛出一个错误。

p.model.add_subsystem('obj_f', ExecComp('obj = (x0-u0)**2 + (u0)**2', u0={'shape': (2, )}, x0= {'shape': (2, )}, obj={'shape': (2, )}), Promotions=['x0', 'u0'])

对于 x0 = [1.5, 1.2] 它应该给出结果 = 0.72,这是 x0=1.2 在 u0=0.6 时的最佳值

【问题讨论】:

  • 我正在尝试了解您到底想要做什么。当它是一个 2 向量时,你如何定义最小化目标?如果您的意思是找到 obj 的最小量值,则需要显式计算该标量值并将其用作目标。
  • 一个完整的代码 sn-p 示例会很有帮助。
  • @JustinGray 有什么解决方案吗? gist.github.com/shreyanshmohnot/…
  • @RobFalck 我想在 'x' 的不同值处找到 'obj' 和 'u' 的最小幅度。
  • 大多数优化器需要一个标量目标函数。由于混合目标函数通常是相互竞争的(将一个值驱动到较小的值必然会驱动其他值到较大的值),我们通常处理此问题的方式是将其中一个值固定为约束,并将另一个值最小化为目标。这可以让您扫除帕累托边界。

标签: optimization scipy openmdao


【解决方案1】:

您得到的错误是由于您的目标值是一个向量。基于梯度的优化器需要一个标量值作为目标。您可以尝试对数组求和以生成标量。

p.model.add_subsystem('obj_f', ExecComp('obj = sum((x0-u0)**2 + (u0)**2)', u0={'shape': (2, )}, 
                                                                           x0={'shape': (2, )}, 
                                                                           obj={'shape': (1, )}), 
                                        promotes=['x0', 'u0'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多