繁体   English   中英

使用scipy.optimize.linprog的线性编程返回次优解决方案

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM