我试图在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中发现了一些问题。这可能是我面临的问题还是我做错了什么?任何帮助将不胜感激!感谢。
答案 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])
。