求解具有许多变量和不等式约束的多个方程

时间:2016-10-03 04:38:11

标签: python scipy linear-algebra linear-programming

我正在尝试使用scipy和线性编程来解决许多变量的问题。我有一组变量X,它们是0.5到3之间的实数,我必须解决以下等式:

346 <= x0*C0 + x1*C1 + x2*C2 +......xN*CN <= 468
25 <= x0*p0 + x1*p1 + x2*p2 +......xN*pN <= 33
12 <= x0*c0 + x1*c1 + x2*c2 +......xN*cN <= 17
22 <= x0*f0 + x1*f1 + x2*f2 +......xN*fN <= 30

数字C0 ... CN,p0 ... pN,c0 ... cN,f0 ... fN已经给我了。我试着通过以下方式解决这个问题:

import numpy as np
from scipy.optimize import linprog
from numpy.linalg import solve
A_ub = np.array([
    [34, 56, 32, 21, 24, 16, 19, 22, 30, 27, 40, 33],
    [2, 3, 2, 1.5, 3, 4, 1, 2, 2.5, 1, 1.2, 1.3],
    [1, 2, 3, 1.2, 2, 3, 0.6, 1, 1, 1.2, 1.1, 0.8],
    [0.5, 2, 2, 1, 3, 4, 1, 1, 1, 0.5, 0.3, 1.2],
    [-34, -56, -32, -21, -24, -16, -19, -22, -30, -27, -40, -33],
    [-2, -3, -2, -1.5, -3, -4, -1, -2, -2.5, -1, -1.2, -1.3],
    [-1, -2, -3, -1.2, -2, -3, -0.6, -1, -1, -1.2, -1.1, -0.8],
    [-0.5, -2, -2, -1, -3, -4, -1, -1, -1, -0.5, -0.3, -1.2]])
b_ub = np.array([468, 33, 17, 30, -346, -25, -12, -22])
c = np.array([34, 56, 32, 21, 24, 16, 19, 22, 30, 27, 40, 33])
res = linprog(c, A_eq=None, b_eq=None, A_ub=A_ub, b_ub=b_ub, bounds=(0.5, 3))

A_ub的第一行与b_ub相同的等式的解释,因为我们试图使等式最大化并确保它在给定的边界限制内,即468和346意味着我想得到值尽可能接近上限。

我把[-34, -56, -32, -21, -24, -16, -19, -22, -30, -27, -40, -33]放在A_ub中,将-346放在b_ub中,并附带逻辑:

-346 > -(x0*C0 + x1*C1 + x2*C2 +......xN*CN)这将解决方程的下界问题。我和其他人一样。

但是我认为我的方法是错误的,因为0.425res.fun的答案为nan res.x

x的上限为3,下限为0.5

如何定义问题如上所示,以便在保持上限的同时获得接近468的最大值?如何使用scipy定义下界?我是第一次从事线性编程工作,所以我可能错过了可以帮助我的想法。

我也对任何其他解决方案持开放态度。

1 个答案:

答案 0 :(得分:3)

这种不等式系统是不可行的:没有满足所有约束的解决方案。您可以从res

中看到
     fun: 0.42500000000000243
 message: 'Optimization failed. Unable to find a feasible starting point.'
     nit: 28
  status: 2
 success: False
       x: nan

我相信这是一个正确的结果(我用另一个LP系统验证了这一点。)

注意:如果您将界限更改为(0,3),您将获得可行的解决方案。