我正在使用SciPy进行优化,而SLSQP方法似乎忽略了我的约束。Scipy.optimize.minimize method ='SLSQP'忽略约束
具体而言,我想X [3]和X [4]是在范围[0-1]
我收到一条消息: '不等式约束不相容'
这里是执行随后的示例代码的结果(使用一个虚拟函数):
status: 4
success: False
njev: 2
nfev: 24
fun: 0.11923608071680103
x: array([-10993.4278558 , -19570.77080806, -23495.15914299, -26531.4862831 ,
4679.97660534])
message: 'Inequality constraints incompatible'
jac: array([ 12548372.4766904 , 12967696.88362279, 39928956.72239509,
-9224613.99092537, 3954696.30747453, 0. ])
nit: 2
这是我的代码:
from random import random
from scipy.optimize import minimize
def func(x):
""" dummy function to optimize """
print 'x'+str(x)
return random()
my_constraints = ({'type':'ineq', 'fun':lambda(x):1-x[3]-x[4]},
{'type':'ineq', 'fun':lambda(x):x[3]},
{'type':'ineq', 'fun':lambda(x):x[4]},
{'type':'ineq', 'fun':lambda(x):1-x[4]},
{'type':'ineq', 'fun':lambda(x):1-x[3]})
minimize(func, [57.9499 ,-18.2736,1.1664,0.0000,0.0765],
method='SLSQP',constraints=my_constraints)
编辑 - 即使删除第一个约束,问题仍然存在。
当我尝试使用变量的界限时,问题仍然存在。 即
bounds_pairs = [(None,None),(None,None),(None,None),(0,1),(0,1)]
minimize(f,initial_guess,method=method_name,bounds=bounds_pairs,constraints=non_negative_prob)
为什么使用无意义函数进行优化?如果函数只是返回'random()'(特别是,甚至不会为同样的输入返回一致的结果),SciPy当然会感到困惑。 – user2357112
为了举例。不管我使用的功能如何,都会发生此问题。我不认为这是问题@ user2357112 – Zahy
至少在scipy文档中,当使用lambda时,他们会努力返回一个np.array(),如:'fun':lambda x:np.array([x [ 0] ** 3 - x [1]])。 –