一.例题
以《数学建模算法与应用》中的题为例:
二.线性规划问题
数学建模旨在将复杂问题抽象为更加本质的模型
线性规划问题的标准形式:
min c T x c^Tx cTx
s.t.{
A u b x < = b u b A_{ub}x<=b_{ub} Aubx<=bub
A e q x = b e q A_{eq}x=b_{eq} Aeqx=beq
l b < = x < = r b lb<=x<=rb lb<=x<=rb
}
min:标准形式中求的是最小值,如果想求最大值只要将系数矩阵取负数,再将得到的最小值取负数即得
c T c^T cT是系数,是一个值不变的向量(一维矩阵),T表示转置,系数向量转置后变为行向量
x在这里表示决策变量,也是一个向量,形如: [ x 1 , x 2 , x 3 … … ] [x_1,x_2,x_3……] [x1,x2,x3……]
c T x c^Tx cTx就是目标函数
s.t.是subject to的缩写,后面的式子是约束条件,有三种类型的约束条件(ub表示upper bound,eq表示equal)
线性规划问题,就是在约束条件的限制下求目标函数最大值/最小值的问题
三.linprog
1.导入模板
import numpy as np
from scipy.optimize import linprog
2.参数解释
解决线性规划问题使用的函数是linprog(linear programming):
scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method=‘interior-point’, callback=None, options=None, x0=None)
①参数c:表示目标函数中的系数,一个一维的数组
②参数A_ub:该参数为可选参数,若线性规划问题中的约束条件含有不等式则使用该参数,A_ub是一个二维的矩阵(数组),它的每一行都代表一个不等式的系数
以例题的约束条件中的三个不等式为例:
2 x 1 + x 2 < = 10 2x_1+x_2<=10 2x1+x2<=10
x 1 + x 2 < = 8 x_1+x_2<=8 x1+x2<=8
x 2 < = 7 x_2<=7 x2<=7
则系数矩阵应该表示为:
2 1
1 1
0 1
③参数b_ub:该参数为可选参数,对应上面的系数矩阵,是一个一维的列向量
④参数A_eq和b_eq大同小异,分别为等式约束条件中的系数矩阵和约束向量
⑤参数bound:是一个由元组(min,max)组成的序列,限定决策变量的取值范围,用None表示无限制
3.例
例题的代码:
import numpy as np
from scipy.optimize import linprog
c=np.array([4,3])
A=np.array([[2,1],[1,1],[0,1]])
b=np.array([10,8,7])
ret=linprog(-c,A_ub=A,b_ub=b,bounds=((0,None),(0,None)))
print(ret)
print(ret.x) #表示最优解
print(ret.fun) #表示最值