使用 scipy linprog
Using scipy linprog
假设我有以下问题:
- objective函数
c1x1 + c2x2
(我们需要最小化)
-x1 + x2 <= 0
0 <= x1 <= 3
0 <= x2 <= 2
我们还假设 c1 = 1
和 c2 = -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 变为正数)。
假设我有以下问题:
- objective函数
c1x1 + c2x2
(我们需要最小化) -x1 + x2 <= 0
0 <= x1 <= 3
0 <= x2 <= 2
我们还假设 c1 = 1
和 c2 = -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 变为正数)。