ScipyOptimizer提供不正确的优化结果

时间:2016-04-19 22:26:55

标签: python optimization openmdao

我在OpenMDAO中运行非线性优化问题,我知道(我只是想验证解决方案)的最佳解决方案。我正在使用SLSQP ScipyOptimizer的{​​{1}}驱动程序配置。

我有3个设计变量A,B和C,它们各自的设计空间(A min 到A max 用于A等等)和单个目标函数Z.正如我所说,我知道所有三个设计变量的最佳值(让我们称之为A sol ,B sol 和C sol 产生Z的最小值(称为Z sol )。

当我运行此问题时,我得到的Z值大于Z sol ,表示它不是最佳解决方案。当我将C sol 分配给C并运行只有A和B作为设计变量的问题时,我得到Z的值更接近Z sol 哪个实际上比我之前得到的要少(在3个设计变量场景中)。

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

编辑:添加一些代码..

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 并为其分配最佳值时(从我的解决方案中),我得到了相当正确的结果,即目标函数的答案,它比前一个场景更小。

1 个答案:

答案 0 :(得分:0)

如果没有看到您的实际型号,我们就无法确定。但是, NOT 情况下,本地优化器的解决方案通常独立于起始条件。只有在问题凸出的情况下才是这种情况。所以我猜你的问题不是凸起的,而且你遇到了局部的最优问题。

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