我正在使用Python 2.7.12和Numpy 1.11.0尝试以下代码。
import numpy as np
from scipy.optimize import linprog
A = np.matrix([[1,0,0,1], [0, 1, 0 ,1], [0, 1, 1, 0]])
c = np.zeros(A.shape[1])
res = linprog(c,A_eq = A, b_eq = [0,1,-1], options=dict(bland=True))
print (res.x)
print (A.dot([0, 1, -2, 0]))
以上的输出是
nan
[[ 0 1 -1]]
所以scipy.optimize.linprog找不到解决方案,即使存在一个解决方案,A_eq的点乘法与[0,1,-2,0]的输出也很明显。
提出了类似的问题here,我尝试了那里建议的解决方案(即添加options = dict(bland = True)或更新容差值)。我仍然得到与上面公布的相同的错误输出。 这种行为可能是什么原因?谢谢。
答案 0 :(得分:1)
我是OP,解决方案是明确添加边界,如下所示:
res = linprog(c, A_eq = A, b_eq = [0,1,-1], bounds=(None, None))
我的印象是默认情况下,linprog假定解决方案没有界限,但事实上默认边界是(0,无),即非负值。
docs:
中提到了这一点bounds:sequence,optional
x中每个元素的(min,max)对,定义该参数的边界。当在该方向上没有约束时,使用None作为min或max之一。默认情况下,边界为(0,无)(非负)...