我正在使用scipy.optimish.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.]
我似乎找不到这个函数的一致性,但也许这是我使用它的方式。
3条答案
按热度按时间xj3cbfub1#
你把输入设置得有点错误;请参见the manual。具体来说,您有许多符号错误。
1.向量
c
的符号错误;linprog
使c x
最小化,因此c
应该正好是w = c x
中的系数1.向量
b
和矩阵A
的符号错误。应反转它们的符号,以便从约束f(x) >= const
的形式切换到linprog
方法所需的形式,即小于或等于,即-f(x) <= - const
1.您缺少最后两个约束。
1.您建议的最小值为〈0,这显然是不可能的,因为
w = 10*x1 + 15*x2 + 25*x3
总是正的,您的约束为x1,x2,x3>=0
。正确代码为:
vfhzx4xs2#
由于y1和y2的正性可以在bounds =(0,None)下得到保证,因此代码简化如下:
fwzugrvs3#
有人能帮我把这个matlab代码转换成python吗?我卡在linprog里了,出错了