ScipyOptimizer给出了错误的优化结果



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

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

当我运行这个问题时,我得到的Z值大于Zsol,这意味着它不是一个最优解。当我将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,并为其分配最优值(从我的解决方案中)时,我得到了相当正确的结果,即目标函数的答案,该答案小于前一种情况。

如果没有看到您的实际模型,我们就无法确定。然而,通常情况下,本地优化器的解决方案与启动条件无关,这是NOT的情况。只有当问题是凸的时,才会出现这种情况。所以我猜你的问题不是凸的,你正陷入局部最优。

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

最新更新