数学建模——线性规划
参考博客:用python解决线性规划
模型标准型:
所需库:scipy、pulp(可选)
例题1
转化为标准形:
{ − x + y ≤ 5 − x − y ≤ 0 x ≤ 3 \begin{cases}-x+y\le 5\\-x-y\le 0\\x\le 3\end{cases} ⎩⎪⎨⎪⎧−x+y≤5−x−y≤0x≤3
import numpy as np
from scipy import optimize
#以下符号与标准形对应
z = np.array([4,-1]) #z = 4x-y
A = np.array([[-1,1],
[-1,-1]]) # 约束条件系数矩阵
b = np.array([5,0])
x = (None,3) #x<=3
y = (None,None)
res = optimize.linprog(z,A,b,bounds=(x,y))
res
con: array([], dtype=float64)
fun: -12.499999999587356
message: 'Optimization terminated successfully.'
nit: 4
slack: array([1.52723167e-10, 2.05568895e-11])
status: 0
success: True
x: array([-2.5, 2.5])
例题2
转化为标准型:
{ − 2 x 1 + 5 x 2 − x 3 ≤ − 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 + x 2 + x 3 = 7 x 1 , x 2 , x 3 ≥ 0 \begin{cases}-2x_1+5x_2-x_3\le-10\\x_1+3x_2+x_3\le 12\\x_1+x_2+x_3=7\\x_1,x_2,x_3\ge 0\end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧−2x1+5x2−x3≤−10x1+3x2+x3≤12x1+x2+x3=7x1,x2,x3≥0
import numpy as np
from scipy import optimize
z = np.array([2,3,-5]) #要求最大值,只要在最后调用函数时乘一个-1就行,系数不用改
A = np.array([[-2,5,-1],[1,3,1]])
b = np.array([-10,12])
Aeq = np.array([[1,1,1]]) #注意是二维数组
beq = np.array([7])
x1 = (0,None)
x2 = (0,None)
x3 = (0,None)
res = optimize.linprog(-z,A,b,Aeq,beq,(x1,x2,x3))
res
con: array([1.80712245e-09])
fun: -14.571428565645084
message: 'Optimization terminated successfully.'
nit: 5
slack: array([-2.24599006e-10, 3.85714286e+00])
status: 0
success: True
x: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])
pulp库可选学,此不附,可参见参考博客
总结步骤:
- 列出标准型方程
- 调包(doge)
- 根据方程列出价值向量、约束条件的系数矩阵、常数向量(注意是小于等于条件下的),等于条件分开列,以及决策变量的范围
- 调用函数,依次输入价值向量、系数矩阵、常数向量、等式条件的系数矩阵、常数向量、决策向量
来个综合题
习题来源:《数学建模算法与程序》司守奎
分析题目,可知决策向量为每个货舱内各个货物的质量,可视为三行四列的矩阵