使用 scipy linprog

Using scipy linprog

假设我有以下问题:

  1. objective函数c1x1 + c2x2(我们需要最小化)
  2. -x1 + x2 <= 0
  3. 0 <= x1 <= 3
  4. 0 <= x2 <= 2

我们还假设 c1 = 1c2 = -0.5 以及另一个约束已添加 c1x1 + c2x2 = P, were P = -1,0,1

为了解决这个问题,使用 linprog 的正确方法是什么? bounds 是指下限吗?

感谢您的帮助。

忽略评论中提到的不可能相等约束的问题,我们只需要参考the documentation:

A_ub @ x <= b_ub
A_eq @ x == b_eq
lb <= x <= ub

这里,lb默认为0,所以你根本不用管下界,你的问题归结为c = [1, -0.5]A_ub = [[-1, 1], [1, 0], [0, 1]],和 b_ub = [0, 3, 2]:

In [57]: linprog(c, A_ub, b_ub)                                                                          
Out[57]: 
     con: array([], dtype=float64)
     fun: 9.37460773860971e-11
 message: 'Optimization terminated successfully.'
     nit: 4
   slack: array([7.91922932e-11, 3.00000000e+00, 2.00000000e+00])
  status: 0
 success: True
       x: array([1.08299862e-10, 2.91075683e-11])

也就是说,对于数值问题,最优解是 x1 = x2 = 0(这也很明显:获得负值 objective 的唯一方法是让 x2 成为正数,但你的第一个约束要求 x1 至少与 x2 一样大,这反过来会导致你的 objective 变为正数)。