我在使用基于方法='COBYLA'的盆地跳跃来指定约束时遇到麻烦。这是一个出问题的测试案例。本质上,约束被忽略,并且功能试验超出了指定范围。我指定了一个最小值为[0,0]的简单二次项,搜索-3<x[0]
,但是正如您从输出中看到的那样,该范围之外有很多搜索(我增加了步长以使其明显)< / p>
import numpy as np
from scipy.optimize import basinhopping
def f(x):
if x[0]<-3 :
print('outside range ',x[0])
return x[0]**2+x[1]**2
cons = [{'type':'ineq','fun': lambda x: x[0]+3}]
kwargs = {'method':'COBYLA','constraints':cons}
ret=basinhopping(f, [5,1],T=1,stepsize=1000,niter=1,minimizer_kwargs=kwargs)
print(ret)
runfile('py/cobyla_test', wdir='/py', post_mortem=True)
outside range -446.14581341127945
outside range -445.14581341127945
outside range -445.14581341127945
outside range -444.14581341127945
[etc... lots of output deleted]
[-4.81217825e-05 -5.23242054e-05] 5.0535284302996725e-09
答案 0 :(得分:1)
如scipy.optimize.basinhopping — SciPy v1.1.0 Reference Guide所述,流域跳水是一种两步法:
take_step
回调)accept_test
回调)您指定的约束是针对最小化方法的,它们不影响跳转步骤。对于跳转步骤,请调整stepsize
(随机跳转的最大位移),或定义自己的take_step
。
“我认为约束的关键是它永远不会在约束之外尝试x” –数学问题中的约束(包括constrained optimization problem)不起作用办法。它们仅指定解决方案本身必须满足的条件。他们不限制在获得该解决方案时可以使用的点,这完全取决于算法的选择。
限制数值方法搜索范围的方法是以特定于函数和方法的性质的某种方式调整方法参数,以将方法“引导”到正确的方向。