【问题标题】:ScipyOptimizer gives incorrect optimization resultScipyOptimizer 给出不正确的优化结果
【发布时间】:2016-04-19 22:26:55
【问题描述】:

我在OpenMDAO 中运行一个非线性优化问题,我知道它的最优解(我只是想验证解)。我正在使用来自openmdao.apiScipyOptimizerSLSQP 驱动程序配置。

我有 3 个设计变量 A、B 和 C,它们各自的设计空间(A 的 Amin 到 Amax 等等)和一个目标函数Z. 正如我所说,我知道所有三个设计变量的最佳值(我们称它们为 Asol、Bsol 和 Csol ) 产生 Z 的最小值(称为 Zsol)。

当我运行这个问题时,我得到一个大于 Zsol 的 Z 值,表明它不是最优解。当我将 Csol 分配给 C 并仅使用 A 和 B 作为设计变量来运行问题时,我得到的 Z 值更接近 Zsol 并且实际上比我之前得到的要小(在 3 个设计变量场景中)。

为什么我会观察到这种行为? ScipyOptimizer 不应该在这两种情况下都给出相同的解决方案吗?

编辑:添加一些代码..

from openmdao.api import IndepVarComp, Group, Problem
from openmdao.api import ScipyOptimizer

class RootGroup(Group):
    def __init__(self):
        super(RootGroup, self).__init__()

        self.add('desvar_f', IndepVarComp('f', 0.08))
        self.add('desvar_twc', IndepVarComp('tool_wear_compensation', 0.06))
        self.add('desvar_V', IndepVarComp('V', 32.0))
        # Some more config (adding components, connections etc.)

class TurningProblem_singlepart(Problem):
    def __init__(self):
        super(TurningProblem_singlepart, self).__init__()

        self.root = RootGroup()

        self.driver = ScipyOptimizer()
        self.driver.options['optimizer'] = 'SLSQP'

        self.driver.add_desvar('desvar_f.f', lower=0.08, upper=0.28)
        self.driver.add_desvar('desvar_twc.tool_wear_compensation', lower=0.0, upper=0.5)
        self.driver.add_desvar('desvar_V.V', lower=32.0, upper=70.0)
        self.driver.add_objective('Inverse_inst.comp_output')
        # Other config

这段代码给了我不正确的结果。当我从两个类中删除 desvar_twc 并为其分配最佳值(从我拥有的解决方案中)时,我得到了相当正确的结果,即目标函数的答案小于前一个场景。

【问题讨论】:

  • 你能告诉我们任何代码吗?
  • 是的,我正在整理代码 sn-ps 以使其更清晰。实际代码要大得多,这就是为什么我没有把它放在帖子里。我会尽快编辑帖子。
  • 太棒了!这总是有很长的路要走:)
  • 谢谢。 :) 如果您需要更多代码解释,请告诉我。
  • 你期待这个优化器做全局优化吗? ScipyOptimizerscipy.optimize.minimize 的包装器,用于进行局部优化。

标签: python optimization openmdao


【解决方案1】:

没有看到您的实际模型,我们无法肯定地说什么。但是,不是本地优化器的解决方案通常独立于起始条件的情况。只有当问题是凸的时才会出现这种情况。所以我猜你的问题不是凸的,你遇到了局部最优。

您可以尝试通过使用 COBYLA 优化器而不是 SLSQP 来解决此问题,根据我的经验,它可以更好地跳过一些局部最优值。但是如果你的问题真的很棘手,那么我建议你从pyopt-sparse library 切换到 NSGA-II 或 ALPSO。这些是基于启发式的优化器,可以很好地找到“最大的山丘”,尽管它们并不总是一直爬到它的顶部(它们不会收敛得那么紧密)。启发式算法通常也比基于梯度的方法更昂贵。

【讨论】:

  • 谢谢指点。我现在正在尝试用 COBYLA 解决问题,并将用结果更新帖子。我唯一感到困惑的是desvar_twc=0.05 是最佳解决方案,即使我用 0.06 初始化优化器,优化器也给了我 0.00 作为最佳值。我在这里错过了什么?
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 2012-08-27
  • 2017-12-14
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多