Python线性程序最小化--单纯形法
问题描述
我正在使用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, '
X:', res.x)
输出:
Optimal value: -18400.0
X: [ 0. 660. 340.]
我预计是:
Optimal value: -15100.0
X: [ 660. 0. 340.]
我似乎找不到这个函数的一致性,但可能是我使用它的方式。
解决方案
您的输入设置略有错误;请参见the manual。具体地说,您有许多签名错误。
您的向量
中的系数c
符号错误;linprog
最小化c x
,因此c
应该只是w = c x
您的向量
b
和矩阵A
符号错误。它们的符号应该颠倒,以便从f(x) >= const
的约束形式切换到linprog
方法所需的形式,即小于或等于,即-f(x) <= - const
您缺少最后两个约束。
您建议的最小值是<;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, '
X:', res.x)
# python2
# ('Optimal value:', 15100.0, '
X:', array([ 660., 0., 340.]))
# python3
# Optimal value: 15099.999961403426
# X: [6.59999996e+02 1.00009440e-07 3.40000000e+02]
相关文章