我在使用method='COBYLA'的basinhopping指定约束时遇到了问题。以下是一个测试案例,其中出现了错误。基本上,约束被忽略,并且有函数试验超出了指定范围。我指定了一个简单的二次方程,最小值为[0,0],搜索-3<x[0]
,但是从输出中可以看到,有很多搜索超出了该范围(我增加了步长以使其明显)。
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