我正在使用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]])。 –