[英]Linear programming using scipy.optimize.linprog returns suboptimal solution
我正在尝试解决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中发现了一些问题。 这可能是我面临的问题,还是我做错了什么? 任何帮助将不胜感激! 谢谢。
我确实在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])
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.