scipy.optimize.linprog即使存在解决方案也找不到解决方案

时间:2017-07-31 12:36:17

标签: python linear-programming

我正在使用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)或更新容差值)。我仍然得到与上面公布的相同的错误输出。 这种行为可能是什么原因?谢谢。

1 个答案:

答案 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,无)(非负)...