线性规划的目标:寻求决策变量最优的组合方案
模型建立步骤:
- 模型假设:需要假设不同决策变量之间相互独立,以及约束条件与价值向量的值是固定
- 求解线性规划
- 非线性尽可能转化为线性
- 多目标规划:
- 控制变量:逐个目标考虑(先固定一个目标)
- 同时考虑两个目标,设置两个目标之间的权重分配
- 灵敏性分析:对系数的波动影响可视化结果
符号说明
- 🍁 不要求掌握
- ✅要求掌握
解决工具:
- matlab
- python
- lingo
线性规划(linear programming) 三要素:
- 决策变量 :控制量
- 目标函数:决策变量的线性函数
- 约束条件:限制范围
线性规划模型的一般形式:
m
a
x
(
m
i
n
)
z
=
∑
j
=
1
n
c
j
x
j
s
.
t
.
{
∑
j
n
a
i
j
x
j
≤
(
≥
,
=
)
b
i
,
i
=
1
,
2
,
…
,
m
,
x
j
≥
0
,
i
=
1
,
2
,
…
,
m
,
max(min) ~z=\sum_{j=1}^{n}c_jx_j\\ s.t. \left\{ \begin{aligned} \sum_{j}^{n}a_{ij}x_j &\le(\ge,=)b_i,&i=1,2,\dots,m,\\ x_j\ge0, &&i=1,2,\dots,m, \end{aligned} \right.
max(min) z=j=1∑ncjxjs.t.⎩
⎨
⎧j∑naijxjxj≥0,≤(≥,=)bi,i=1,2,…,m,i=1,2,…,m,
- 目标函数是 x j x_j xj j个变量的线性组合
- 约束条件的形式:
- 不等式
- 等式
- 整数(整数规划)
矩阵形式:
m
a
x
(
m
i
n
)
z
=
c
T
x
s
.
t
.
{
A
x
≤
(
≥
,
=
)
b
,
x
≥
0
,
max(min)~z=c^Tx\\ s.t. \left\{ \begin{aligned} Ax\le&(\ge,=)b,\\ x\ge0, \end{aligned} \right.
max(min) z=cTxs.t.{Ax≤x≥0,(≥,=)b,
- x 为 [ x 1 , x 2 . . . ] [x_1,x_2...] [x1,x2...] ,矩阵A的列数等于决策变量个数,每行为线性组合的系数: A x = ∑ j = 1 n p j x j Ax=\sum_{j=1}^{n}p_jx_j Ax=∑j=1npjxj
- matlab中以矩阵为单位求解线性规划问题(不等号统一用 ≤ \le ≤)
- c T c^T cT为价值向量, b b b 为资源向量(约束资源), x x x 为决策向量,A 为决策向量的系数矩阵
线性规划模型标准型
m
a
x
z
=
c
T
x
s
.
t
.
{
A
x
=
b
,
x
≥
0.
max~z=c^Tx\\ s.t.\left\{ \begin{aligned} Ax=b,\\ x\ge0. \end{aligned} \right.
max z=cTxs.t.{Ax=b,x≥0.
线性规划定理:
- 满足全部约束条件的决策向量 x ∈ R n x\in R^n x∈Rn 称为可行解
- 全部可行解的集合称为可行域
- 使目标函数达到最大值的可行解为最优解
- 存在最优解时:
- 无穷多个最优解(对应的目标函数值都相等)
- 一个最优解
有限个最优解- 无最优解
- 可行域为空集
- 可行域非空,但目标函数无界
- 求解线性规划问题:单纯型法
线性规划问题转换
-
绝对值变换:
m i n ∣ x 1 ∣ + ∣ x 2 ∣ + … ∣ x n ∣ s . t . A x ≤ b min~|x_1|+|x_2|+\dots|x_n|\\ s.t.~Ax\le b min ∣x1∣+∣x2∣+…∣xn∣s.t. Ax≤b
变量替换: x i = u i − v i , ∣ x i ∣ = u i + v i x_i=u_i-v_i,|x_i|=u_i+v_i xi=ui−vi,∣xi∣=ui+vi u i = x i + ∣ x i ∣ 2 , v i = ∣ x i ∣ − x i 2 u_i=\frac{x_i+|x_i|}{2},v_i=\frac{|x_i|-x_i}{2} ui=2xi+∣xi∣,vi=2∣xi∣−xi
表达式变换为:
m i n ∑ i = 1 n ( u i + v i ) s . t . [ A , − A ] [ u i v i ] ≤ b u i ≥ 0 , v i ≥ 0 min~\sum_{i=1}^{n}(u_i+v_i)\\ s.t.[A,-A]\left[\begin{array}{rrr} u_i\\v_i\end{array}\right] \le b\\ u_i\ge0,v_i\ge0 min i=1∑n(ui+vi)s.t.[A,−A][uivi]≤bui≥0,vi≥0
变量 u i , v i u_i,v_i ui,vi都大于零则 ∣ x ∣ ≥ 0 |x|\ge0 ∣x∣≥0恒成立,将绝对值问题化为两个决策变量之和 -
最大(小)值变换:
m i n { m a x c i x i } s . t . A x ≤ b min~\{max~c_{i}x_i\}\\ s.t. Ax\le b min {max cixi}s.t.Ax≤b
令 x n + 1 = m a x c i x i x_{n+1}=max~c_ix_i xn+1=max cixi,得到:
m i n x n + 1 A x ≤ b c i x i − x n + 1 ≤ 0 , i = 1 , 2 , . . n min~ x_{n+1}\\ Ax\le b\\ c_ix_i-x_{n+1}\le0 ,i=1,2,..n min xn+1Ax≤bcixi−xn+1≤0,i=1,2,..n -
引入松弛变量:将不等式转化为等式
求解线性规划问题
线性规划标准型:
m
i
n
z
=
c
T
x
s
.
t
.
{
A
x
≤
b
,
A
e
q
x
=
b
e
q
,
L
b
≤
x
≤
U
b
.
min~z=c^Tx\\ s.t.\left\{ \begin{aligned} Ax\le b,\\ Aeq~x=&~beq,\\ Lb\le x\le& Ub. \end{aligned} \right.
min z=cTxs.t.⎩
⎨
⎧Ax≤b,Aeq x=Lb≤x≤ beq,Ub.
-
matlab
- [x,fval]=linprog(f,A,b)
- [x,fval]=linprog(f,A,b,Aeq,beq)
- [x,fval]=linprog(f,A,b,Aeq,beq,lb,ub)
- lb 和 ub 分别对应决策变量的下界,上界列向量
- 如果没有等式约束:Aeq=[],beq=[] 设置为空矩阵
-
python
-
scipy.optimize求解器(求解简单的线性规划和非线性规划)
-
函数:linprog (c,A,b,Aeq,beq,bounds,method) ✅
- c:目标向量
- A:约束矩阵
- b:资源向量
- Aeq,beq :等式矩阵
- bounds:x的取值,默认为 0 ≤ x ≤ + ∞ 0\le x\le +\infty 0≤x≤+∞
- method:算法(单纯型法‘simplex’,内点法…)
-
代码:
from scipy.optimize import linprog res=linprog(c,A,b,Aeq,beq,bounds,method) res.fun#目标函数最小值 res.x#最有解
-
对于max 用负号转化为最小值标准型
范例:
m i n z = − x 1 + 4 x 2 s . t . { − 3 x 1 + x 2 ≤ 6 x 1 + 2 x 2 ≤ 4 x 2 ≥ 3 min~z=-x_1+4x_2\\ s.t.\left\{ \begin{aligned} -3x_1+x_2\le6\\ x_1+2x_2\le4\\ x_2\ge3 \end{aligned} \right. min z=−x1+4x2s.t.⎩ ⎨ ⎧−3x1+x2≤6x1+2x2≤4x2≥3from scipy.optimize import linprog c = [-1, 4]; A = [[-3, 1], [1, 2]] b = [[6], [4]] bound=((None,None),(-3,None))# bound ((x1min,x1max),(x2min,x2max)) res=linprog(c,A,b,None,None,bound) print("目标函数的最小值:",res.fun) print("最优解为:",res.x) #result: 目标函数的最小值: -21.99999984082492 最优解为: [ 9.99999989 -2.99999999]
-
对于无约束的边界设置为None
-
向量也可以传入数组代替列表(numpy)
-
注意向量的维度
-
构造bounds也可以像这样:
Lb=[None,None] Ub=[-3,None] bound=tuple(zip(Lb,Ub))
-
cvxopt.solvers 模块求解线性规划:🍁
m i n z = c T x s . t . { A x ≤ b , A e q x = b e q , min~z=c^Tx\\ s.t.\left\{ \begin{aligned} Ax\le b,\\ Aeq~x=&~beq,\\ \end{aligned} \right. min z=cTxs.t.{Ax≤b,Aeq x= beq,- 必须加载numpy 库
- 构造矩阵 cvxpot.matrix()
- 求解线性规划:cvxpot.solvers.lp(c,A,b) (x默认大于0)
- 最优值cvxpot.solvers.lp(c,A,b)[‘x’]
- 最优解cvxpot.solvers.lp(c,A,b) [‘primal objective’]
-
凸优化库cvxpy 求解线性规划✅(最专业,可以求解线性,非线性,整数规划)
- 构造决策变量矩阵
- cvxpy.Variable((m,n))
- cvxpy.Variable(n)
- 构造目标函数 cvxpy.Minimize()
- 构造约束条件(列表)
- 构造模型 p=cvxpy.Problem()
- 求解模型 p.solve(solver,verbose): 求解器(str),是否展示过程(bool)
求解参照:
import cvxpy as cp import numpy as np import pandas as pd d1=pd.read_excel("Pdata5_6.xlsx",header=None) d2=d1.values; #获取DataFrame 的值 c=d2[:-1,:-1]# 构造价值矩阵 d=d2[-1,:-1].reshape(1,-1); e=d2[:-1,-1].reshape(-1,1) x=cp.Variable((6,8))#决策变量6*8 obj=cp.Minimize(cp.sum(cp.multiply(c,x))) #构造目标函数 con=[cp.sum(x,axis=1,keepdims=True)<=e, cp.sum(x,axis=0,keepdims=True)==d,x>=0] #构造约束条件 prob=cp.Problem(obj,con) #构造模型 prob.solve(solver='GLPK_MI',verbose =True)#求解模型 print("最优值为:",prob.value) print("最优解为:\n",x.value)
灵敏度分析
灵敏度分析:对系统因周围变化显示出来的敏感程度的分析
分析如下:
- 如果系数 a i j , b i ( 资源约束 ) , c j ( 价值系数 ) a_{ij},bi(资源约束),c_j(价值系数) aij,bi(资源约束),cj(价值系数) 发生改变,当前的最优方案会发生什么改变
- 将这些系数限制在什么范围内仍是最优解
-
可以使用计算机迭代的方法(控制变量)寻求变换规律( f ( x ) f(x) f(x))
- 控制步长,控制变量循环求最优解
- 绘制散点图,可视化结果
-