ScipyOptimizer给出了不正确的优化结果

2024-04-26 18:59:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有3个设计变量A,B和C,它们各自的设计空间(Amin到Amax对于A等等)和一个单一的目标函数Z。正如我所说,我知道所有三个设计变量的最佳值(我们称它们为Asol,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,并用它的最优值(从我得到的解中)赋值时,我得到了相当正确的结果,即目标函数的答案比前面的场景小。你知道吗


Tags: selfaddapi目标initdriverupperlower
1条回答
网友
1楼 · 发布于 2024-04-26 18:59:26

如果没有看到你的实际模型,我们就不能肯定了。然而,一般情况下,局部优化器的解与初始条件无关,这是而不是的情况。这是唯一的情况,如果问题是凸的。所以我猜你的问题不是凸的,你正在陷入局部最优。你知道吗

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

相关问题 更多 >