我在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
并为其分配最佳值时(从我的解决方案中),我得到了相当正确的结果,即目标函数的答案,它比前一个场景更小。
答案 0 :(得分:0)
如果没有看到您的实际型号,我们就无法确定。但是, NOT 情况下,本地优化器的解决方案通常独立于起始条件。只有在问题凸出的情况下才是这种情况。所以我猜你的问题不是凸起的,而且你遇到了局部的最优问题。
您可以尝试通过使用COBYLA优化器而不是SLSQP来解决这个问题,根据我的经验,可以设法更好地跳过某些本地优化。但如果您的问题非常棘手,那么我建议您从pyopt-sparse library切换到NSGA-II或ALPSO。这些是基于启发式的优化器,可以很好地找到“最大的山丘”,尽管它们并不总是一直爬到它的顶部(它们不会紧密地聚合)。启发式算法通常也比基于梯度的方法更昂贵。