Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SLSQP与COBYLA的产量完全不同_Python_Optimization_Openmdao - Fatal编程技术网

Python SLSQP与COBYLA的产量完全不同

Python SLSQP与COBYLA的产量完全不同,python,optimization,openmdao,Python,Optimization,Openmdao,为什么SLSQP停留在初始值附近,而COBYLA则朝着初始值移动 正确的方向 使用OpenMDAO 2.2.X实现优化问题 3个设计变量-->输入到输出y的外部代码comp-->中 目标(y,scaler=-1)。没有任何限制 下图显示了两个优化器针对同一问题的行为。我曾尝试更改SLSQP的有限差分设置,但无济于事。输出已成功终止。(退出模式0) 将上载示例驱动程序和包装器代码: 我看不出您的问题设置有任何明显的错误,但是如果没有gf\u run.py就不可能运行您提供的模型进行测试。因此,作

为什么SLSQP停留在初始值附近,而COBYLA则朝着初始值移动 正确的方向

使用OpenMDAO 2.2.X实现优化问题

3个设计变量-->输入到输出y的外部代码comp-->中
目标(y,scaler=-1)。没有任何限制

下图显示了两个优化器针对同一问题的行为。我曾尝试更改SLSQP的有限差分设置,但无济于事。输出已成功终止。(退出模式0)

将上载示例驱动程序和包装器代码:


我看不出您的问题设置有任何明显的错误,但是如果没有
gf\u run.py
就不可能运行您提供的模型进行测试。因此,作为替代,我能给你的最佳猜测是以下选项之一:

1) COBYLA是一个无梯度的优化器,在设计空间中搜索的能力更强。也许是因为找到了一个不同的最优值,而SLSQP在接近起始点时陷入了一个较小的最优值。为了测试这一点,您可以使用COBYLA的结果作为SLSQP的初始猜测。如果SLSQP收敛到与COBYLA相同(或接近相同)的点,则可能是局部最优问题


2) SLSQP使用渐变,您使用中心差分近似渐变。即使使用二阶中心差分,这些导数近似也可能很差。不清楚底层代码中是否包含某种隐式解算器(如牛顿解算器或while循环收敛)。如果它确实有某种内部解算器,那么你需要确保公差设置得非常严格——至少比你的FD步长低两个数量级会更好。即使这样,也不可能在有解算器的代码周围获得高质量的FD近似值。您还可以尝试稍微更改FD步长

我看不出您的问题设置有任何明显的错误,但是如果没有
gf_run.py
就不可能运行您提供的模型来测试它。因此,作为替代,我能给你的最佳猜测是以下选项之一:

1) COBYLA是一个无梯度的优化器,在设计空间中搜索的能力更强。也许是因为找到了一个不同的最优值,而SLSQP在接近起始点时陷入了一个较小的最优值。为了测试这一点,您可以使用COBYLA的结果作为SLSQP的初始猜测。如果SLSQP收敛到与COBYLA相同(或接近相同)的点,则可能是局部最优问题


2) SLSQP使用渐变,您使用中心差分近似渐变。即使使用二阶中心差分,这些导数近似也可能很差。不清楚底层代码中是否包含某种隐式解算器(如牛顿解算器或while循环收敛)。如果它确实有某种内部解算器,那么你需要确保公差设置得非常严格——至少比你的FD步长低两个数量级会更好。即使这样,也不可能在有解算器的代码周围获得高质量的FD近似值。您还可以尝试稍微更改FD步长

我认为原因是FD步长太小,梯度不准确。到目前为止,我已经使用了1e-3到1e-6的步骤。现在我使用1,优化器并没有被所有设计变量的步骤1卡住。我猜外部代码的输出差异非常小,FD步长很小(1e-3),因此优化器无法准确计算梯度

我认为原因是FD步长太小,梯度不准确。到目前为止,我已经使用了1e-3到1e-6的步骤。现在我使用1,优化器并没有被所有设计变量的步骤1卡住。我猜外部代码的输出差异非常小,FD步长很小(1e-3),因此优化器无法准确计算梯度

这些解算器的状态输出是什么?除非你确信你的lib在任何状态下都会引发异常,但成功除外。你是说像这样的状态输出吗?这是成功终止的SLSQP优化。(退出模式0)当前函数值:-272708.4836453次迭代:5次函数评估:49次梯度评估:5次优化完成----------------------这些解算器的状态输出是什么?除非你确信你的lib在任何状态下都会引发异常,但成功除外。你是说像这样的状态输出吗?这是成功终止的SLSQP优化。(退出模式0)当前函数值:-272708.4836453次迭代:5次函数评估:49次梯度评估:5次优化完成------------------我无法上载外部代码,因为它需要许可证才能运行。我正在使用Python调用终端并运行该代码。我在一开始就想到了你的第一条建议,并对最初的猜测胡思乱想,没有任何帮助。但我现在将更彻底地检查这是否是问题所在。因为第二个在我看来不太可能,但我也会调整FD步长。当然,这整件事可能会产生这样一个问题:基于梯度的优化器最终是否会比无梯度的优化器慢。因为设计变量的数量很少。可能是这样。我无法上载外部代码,因为它需要许可证才能运行。我正在使用Python调用终端并运行该代码。我在一开始就想到了你的第一条建议,并对最初的猜测胡思乱想,没有任何帮助。但我会