我正在尝试使用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=100
、b=10
、c=740
达到最小值,该值位于边界的末尾
minimize函数不断尝试迭代超过绑定3的末尾(在最后一次迭代中获得740.0000000149012
的c0值)
有没有办法阻止这种情况发生?即在我的边界实际结束时停止迭代
这是由于数值微分,它本身不仅需要推断步长方向和大小,还需要推断终止
一般来说,对于正在使用的任何解算器(并且有许多后端解算器),如果不非常小心,您将无法做很多事情。基本思想是用您提供的方法替换自动数值微分:然后这一个尊重那些边界,并且必须小心解算器内部,例如“如何推断终止于此端”
修正一个:
当使用:Pull-request #10673时,您的问题应该自动消失,这涉及到您的配置:
L-BFGS-B
看起来,此PR不是当前版本SciPy 1.4.1的一部分(因为这是PR之前的2个月)
另请参见#6026,其中提到了1.5.0的里程碑,涉及一些变化,包括关于num diff中的边界
对于上述PR,您需要从以下来源安装scipy:
如果需要,请参阅文档
修正B:
除此之外,当您在进行无约束优化(具有可变边界)时,可以使用更多的解算器后端(与约束优化相比),您可以尝试另一个解算器
trust-constr
,它对此有明确的支持,请参见#9098请注意,在设置边界时,您需要显式地发出信号
相关问题 更多 >
编程相关推荐