【发布时间】:2016-02-04 07:45:56
【问题描述】:
我正在使用 SciPy 进行优化,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 变量时,问题仍然存在。 即,
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
-
至少在 scipy 文档中,当使用 lambda 时,他们会煞费苦心地返回一个 np.array(),例如:'fun' : lambda x: np.array([x[0]* *3 - x[1]])。
-
感谢@JonCuster,但事实并非如此。无论我使用 np.array 还是仅使用序列,问题仍然存在。我试图用最小的例子来重现这个问题。
-
@JonCuster 我实际上也需要这个约束。当我删除第一个约束时问题仍然存在。我之前也尝试过 bounds 变量,但没有成功!
标签: python numpy scipy mathematical-optimization