Python linprog minimization--simplex method



我正在使用scipy.optimize.linprog库来使用单纯形方法计算最小化。我正在教科书中解决这个问题,我希望有人能指出我正确的方向,因为我没有得到我期望的输出。问题是:

Minimize          w = 10*y1 + 15*y2 + 25*y3
Subject to:       y1 + y2 + y3 >= 1000
y1 - 2*y2    >= 0
y3 >= 340
with              y1 >= 0, y2 >= 0

我为此编写的代码是:

import numpy as np
import pandas as pd
from scipy.optimize import linprog
A = np.array([
[1, 1, 1],
[1,-2, 0],
[0, 0, 1]])
b = np.array([1000,0,340])
c = np.array([-10,-15,-25])
res = linprog(c, A_ub=A, b_ub=b,
bounds=(0, None))
print('Optimal value:', res.fun, 'nX:', res.x)

这给出了输出:

Optimal value: -18400.0
X: [   0.  660.  340.]

我希望它是:

Optimal value: -15100.0
X: [   660.  0.  340.]

我似乎找不到与此功能的一致性,但也许这是我使用它的方式。

您设置的输入略有错误;请参阅手册。具体来说,您有许多符号错误。

  1. 您的矢量c有错误的符号;linprog最小化c x因此c应该只是系数w = c x

  2. 您的向量b和矩阵A有错误的符号。它们的符号应该反转,以从约束形式f(x) >= const切换到linprog方法的所需形式,即小于或等于,即-f(x) <= - const

  3. 您缺少最后两个约束。

  4. 您建议的最小值是 <0,这显然是不可能的,因为w = 10*x1 + 15*x2 + 25*x3始终是积极的,您的约束x1,x2,x3>=0.

正确的代码如下:

import numpy as np
from scipy.optimize import linprog
A = np.array([[-1, -1, -1], [-1,2, 0], [0, 0, -1], [-1, 0, 0], [0, -1, 0]])
b = np.array([-1000, 0, -340, 0, 0])
c = np.array([10,15,25])
res = linprog(c, A_ub=A, b_ub=b,bounds=(0, None))
print('Optimal value:', res.fun, 'nX:', res.x)
# python2
# ('Optimal value:', 15100.0, 'nX:', array([ 660.,    0.,  340.]))
# python3
# Optimal value: 15099.999961403426 
# X: [6.59999996e+02 1.00009440e-07 3.40000000e+02]

由于 y1 和 y2 的正性可以在 bounds=(0, None( 下得到保证,因此简化版本的代码如下所示:

import numpy as np
from scipy.optimize import linprog
A = np.array([[-1, -1, -1], [-1,2, 0], [0, 0, -1]])
b = np.array([-1000, 0, -340])
c = np.array([10,15,25])
res = linprog(c, A_ub=A, b_ub=b,bounds=(0, None))
print('Optimal value:', res.fun, 'nX:', res.x) 

输出:

Optimal value: 15099.999961403195 
X: [6.59999996e+02 1.00009440e-07 3.40000000e+02]

相关内容

  • 没有找到相关文章

最新更新