相同的优化代码在不同的计算机上有不同的结果

Same optimization code different results on different computers

我在运行宁嵌套优化代码

sp.optimize.minimize(fun=A, x0=D, method="SLSQP", bounds=(E), constraints=({'type':'eq','fun':constrains}), options={'disp': True, 'maxiter':100, 'ftol':1e-05})

sp.optimize.minimize(fun=B, x0=C, method="Nelder-Mead", options={'disp': True})

第一个最小化是函数 B 的一部分,所以它有点 运行在第二个最小化中。

而且整个优化都是基于数据的,不涉及随机数。

我运行在两台不同的电脑上使用完全相同的代码,却得到了完全不同的结果。

我安装了不同版本的anaconda,但是

scipy、numpy,所有使用的包版本相同

我真的不认为 OS 会很重要,但一个是 windows 10(64 位),另一个是 windows 8.1(64 位)

我正在尝试找出可能导致此问题的原因。

尽管我没有说明所有选项,但如果两台计算机运行使用相同的代码,结果不应该相同吗?

或者 sp.optimize 是否有任何选项可以将默认值设置为因计算机而异?

PS。我正在查看选项 "eps"。这些计算机上 "eps" 的默认值是否可能不同?

您永远不要指望数值方法在不同设备上表现相同;甚至同一设备上相同代码的不同运行。由于机器的有限精度,您永远无法计算 "real" 结果,只能计算数值近似值。在长时间的优化任务中,这些差异可以总结。

此外,一些优化方法在内部使用某种随机性来解决陷入局部极小值的问题:它们在先前计算的解决方案中添加一个小的、几乎消失的噪声,使算法能够更快地收敛全局最小值而不是陷入局部最小值或鞍点。

你能试着画出你想最小化的函数的风景吗?这可以帮助你分析问题:如果两个结果(在每台机器上)都是局部最小值,那么这个行为可以用我之前的描述来解释。

如果不是这种情况,您应该检查在两台机器上安装的 scipy 版本。也许您在一台设备上隐含地使用 float 值,而在另一台设备上也隐含地使用 double 值?

你看:对于这种(乍一看)奇怪的数字行为有很多可能的解释;你必须给我们更多的细节才能解决这个问题。