【问题标题】:Using scipy linprog使用 scipy linprog
【发布时间】:2020-03-20 04:19:40
【问题描述】:

假设我有以下问题:

  1. 目标函数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 是指下限吗?

感谢您的帮助。

【问题讨论】:

  • 你的等式约束是什么意思?当然,将相同的表达式限制为等于三个不同的事物会使您的程序不可行。

标签: python optimization scipy mathematical-optimization linear-programming


【解决方案1】:

忽略评论中提到的不可能等式约束的问题,我们只需要参考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(这也很明显:获得负目标的唯一方法是让x2 为正,但您的第一个约束将要求x1 至少与x2 一样大,这反过来会导致您的目标变得积极)。

【讨论】:

  • 如果下界不为零,调用函数时如何使用lb?我认为它与bounds arg 有关。你能告诉我怎么做吗?
  • 是的,根据文档“请注意,默认情况下 lb = 0ub = None 除非使用 bounds 指定。”此外,bounds 的文档指定您应该为每个变量提供一个元组,例如类似[(-5, 10), (-4, 5)] 来指定-5 &lt;= x1 &lt;= 10-4 &lt;= x2 &lt;= 5。或者,可以通过翻转符号直接将下界编码为A_ub
猜你喜欢
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多