使用scipy.optimize.linprog进行线性编程会返回次优解

时间:2017-10-12 06:35:21

标签: python scipy linear-programming

我试图在Python 2.7中解决以下线性编程问题,由于某些原因,linprog没有返回正确的结果。

Minimize: -x2 -x3

这样:

x0 + 0.33*x2 + 0.67*x3 = 0.5
x1 + 0.67*x2 + 0.33*x3 = 0.5
x0 + x1 + x2 + x3 = 1.0

这是我的代码:

from scipy.optimize import linprog

a_eq = [[1.0, 0.0, 0.33, 0.67],
        [0.0, 1.0, 0.67, 0.33], 
        [1, 1, 1, 1]]

b_eq = [0.5, 0.5, 1.0]

c = [0, 0, -1.0, -1.0]

x = linprog(c=c, A_eq=a_eq, b_eq=b_eq)
print x

以上是

的输出
fun: -0.0
message: 'Optimization terminated successfully.'
nit: 4
slack: array([], dtype=float64)
status: 0
success: True
x: array([ 0.5,  0.5,  0. ,  0. ])

显然,以下解决方案更为理想:

x: array([0.0, 0.0, 0.5, 0.5])

使得目标函数值:

fun: -1.0

我确实在github中发现了一些问题。这可能是我面临的问题还是我做错了什么?任何帮助将不胜感激!感谢。

1 个答案:

答案 0 :(得分:3)

  

我确实在github中发现了一些问题。这可能是我面临的......?

完全:

  

事实证明,问题中的A_eq是排名不足的。找到并删除其他行的线性组合后,linprog的解决方案与另一个解决方案一致。

矩阵a_eq排名不足。最后一行是前两行的线性组合。这使得约束的行成为冗余,因此我们可以简单地删除它以及b_eq中的相应条目:

a_eq = [[1.0, 0.0, 0.33, 0.67],
        [0.0, 1.0, 0.67, 0.33]]

b_eq = [0.5, 0.5]

这会产生最佳解决方案x: array([ 0. , 0. , 0.5, 0.5])