Scipy 最小化迭代越界

Scipy minimize iterating past bounds

我正在尝试使用 scipy 最小化 3 个输入变量的函数。该函数读起来像这样-

def myfunc(x):
    x[0] = a
    x[1] = b
    x[2] = c
    n = f(a,b,c)
    return n

bound1 = (80,100)
bound2 = (10,20)
bound3 = (312,740)
guess = [a0,b0,c0]
bds = (bound1,bound2,bound3)
result = minimize(myfunc, guess,method='L-BFGS-B',bounds=bds)

我正在尝试的函数目前 运行 在 a=100b=10c=740 处达到最小值,这是边界的末端。

最小化函数不断尝试迭代越过边界 3 的末尾(在最后一次迭代中达到 740.0000000149012 的 c0 值。

有什么办法可以阻止这种情况发生吗?即在我的边界的实际结束时停止迭代?

这是由于数值微分,它本身不仅需要推断步长方向和大小,而且还需要推断终止.

一般来说,如果不非常小心地使用任何求解器(并且有许多后端求解器),您将无能为力。基本思想是用你提供的替换 automatic numerical-differentiation:然后这个 respects those bounds 和必须小心求解器内部,例如"how to reason about termination at this end".

修复 A:

您的问题应该自动消失 使用时:Pull-request #10673,这涉及到您的配置:L-BFGS-B

看来,这个 PR 不是当前版本的一部分 SciPy 1.4.1(因为这是 PR 之前的 2 个月)。

另见 #6026,其中提到了 1.5.0 的一个里程碑,涉及一些变化,包括 尊重 num-diff 中的界限.

对于上述 PR,您需要从源安装 scipy,即:

  • linux 上完全可行(也许 os x)
  • 你不应该试穿 windows
    • 相信我...

如果需要,请参阅文档。

修复 B:

除此之外,由于您正在执行无约束优化(具有变量边界),其中有更多求解器后端可用(与约束优化相比),您可以尝试另一个求解器,trust-constr,它对此有明确的支持,请参阅 #9098.

请注意,您需要在设置边界时明确指出这一点!