首页 > 解决方案 > 是否可以将 SciPy Optimize 与外部应用程序调用一起使用

问题描述

我正在尝试使用 scipy.optimize.basinhopping 来找到具有许多潜在最小值的工程系统问题的最佳解决方案。

用于估计流体系统条件和特性的解析方程内置于预先存在的非 Python 应用程序中。这些方程是理想的,基于物理学和热力学。然后使用系数修改或“调整”这些方程以匹配在实验室测量的实际流体特性。我正在尝试使用 scipy.optimize.basinhopping 来找到最佳系数集,以最小化一系列属性(例如:压力、流速、湍流等)中预测值和测量值之间的预测误差或差异。误差通过所有属性的简单 SSE 测量。例如:

压力误差 = (Pprediced - Pmeasured)^2

Basinhopping 似乎正在努力寻找系统的解决方案,但它非常耗时。主要问题似乎是只有算法的步数部分起作用,而最小化部分无法与外部应用程序调用一起工作。我正在尝试确定问题是否与我的实现有关,或者是否根本无法使用外部应用程序进行优化。

这是我的实现:

minimizer_kwargs = {"method": "BFGS", "options":{"maxiter":1, "disp": True, "return_all": True}}

basinhopping(tuningRun,[ 1.00,  1.05,  0.80,  0.09, -1.22, 0.45], niter = 500, minimizer_kwargs=minimizer_kwargs, disp =True))

tuneRun 是一个调用外部应用程序、插入系数并返回误差/成本函数的函数。

这是我看到的输出示例:

求解器迭代 最终的盆地跳跃输出

从求解器迭代看来,成本/误差函数在 BFGS 函数评估之间没有变化。在这种情况下,它保持在 152.08 不变。在这种情况下效率特别低,因为应用程序调用非常昂贵(约 70 秒)。还要查看最终输出中的 hess 和 jac,该算法似乎无法收集任何导数。我尝试了其他最小化算法,例如 COBYLA,这似乎并没有改变最小化问题。我的问题是是否有可能改进我的实现,以便盆地跳跃算法可以使用差异来采取更有效的步骤,或者在这种情况下是否不可能(因为正在优化的函数不在 python 中)并且我应该覆盖/转-关闭最小化功能。

标签: pythonscipymathematical-optimization

解决方案


推荐阅读