第一章 线性规划
P: 如何利用现有资源来安排生产,以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支——数学规划,而线性规划(Linear Programming,LP)则是数学规划的一个重要分支。
1.1 线性规划模型及概念
1.线性规划建模过程
(1)问题分析
①如何制定一个最优的计划
②有何约束条件
③达到最终目标的最值函数
(2)模型假设
①条件假设:
②符号说明:
(通常情况
x
i
x_i
xi为决策变量)
③模型建立:
建立最终目标函数
添加约束条件
(3)综上所述,可以为该类问题建模
线性规划的一般形式为:
m
a
x
(
或
m
i
n
)
z
=
∑
j
=
1
n
c
j
x
j
s
.
t
.
=
{
∑
j
=
1
n
a
i
j
x
j
≥
(或
=
,
≤
)
b
i
,
i
=
1
,
2
,
.
.
.
,
m
,
x
j
≥
0
,
j
=
1
,
2
,
.
.
.
,
n
.
max(或min) z=\sum_{j=1}^{n}c_jx_j\\ \begin{equation} {\boldsymbol{s.t.}} =\left\{ \begin{array}{ll} \sum_{j=1}^{n}a_{ij}x_j \geq(或=,\leq)b_i,i=1,2,...,m, \\ x_j \geq0,j=1,2,...,n. \end{array}\right. \end{equation}
max(或min)z=j=1∑ncjxjs.t.={∑j=1naijxj≥(或=,≤)bi,i=1,2,...,m,xj≥0,j=1,2,...,n.
其向量表示形式为:
m
a
x
(
或
m
i
n
)
z
=
c
T
x
s
.
t
.
=
{
∑
j
=
1
n
P
j
x
j
≥
(或
=
,
≤
)
b
,
x
≥
0.
max(或min) z=c^Tx\\ \begin{equation} {\boldsymbol{s.t.}} =\left\{ \begin{array}{ll} \sum_{j=1}^{n}P_jx_j \geq(或=,\leq)b, \\ x \geq0. \end{array}\right. \end{equation}
max(或min)z=cTxs.t.={∑j=1nPjxj≥(或=,≤)b,x≥0.
其矩阵表示形式为:
m
a
x
(
或
m
i
n
)
z
=
c
T
x
s
.
t
.
=
{
A
x
≥
(或
=
,
≤
)
b
,
x
≥
0.
max(或min) z=c^Tx\\ \begin{equation} {\boldsymbol{s.t.}} =\left\{ \begin{array}{ll} Ax \geq(或=,\leq)b, \\ x \geq0. \end{array}\right. \end{equation}
max(或min)z=cTxs.t.={Ax≥(或=,≤)b,x≥0.
式中:
c
=
[
c
1
,
c
2
,
.
.
.
,
c
n
]
T
c=[c_1,c_2,...,c_n]^T
c=[c1,c2,...,cn]T为目标函数的系数向量,又称为价值向量;
x
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
T
x=[x_1,x_2,...,x_n]^T
x=[x1,x2,...,xn]T为决策向量;
A
=
(
a
i
j
)
m
∗
n
A=(a_{ij})_{m*n}
A=(aij)m∗n为约束方程组的系数矩阵;
P
j
=
[
a
1
j
,
a
2
j
,
.
.
.
,
a
m
j
]
T
,
j
=
1
,
2
,
.
.
.
,
n
P_j=[a_{1j},a_{2j},...,a_{mj}]^T,j=1,2,...,n
Pj=[a1j,a2j,...,amj]T,j=1,2,...,n为A的列向量,又称为约束方程组的系数向量;
b
=
[
b
1
,
b
2
,
.
.
.
,
b
n
]
T
b=[b_1,b_2,...,b_n]^T
b=[b1,b2,...,bn]T为约束方程组的常数向量。
2.线性规划问题的标准式
一般的,称
m
a
x
z
=
∑
j
=
1
n
c
j
x
j
s
.
t
.
=
{
∑
j
=
1
n
a
i
j
x
j
=
b
i
,
i
=
1
,
2
,
.
.
.
,
m
,
x
j
≥
0
,
j
=
1
,
2
,
.
.
.
,
n
.
maxz=\sum_{j=1}^{n}c_jx_j\\ \begin{equation} {\boldsymbol{s.t.}} =\left\{ \begin{array}{ll} \sum_{j=1}^{n}a_{ij}x_j=b_i,i=1,2,...,m, \\ x_j \geq0,j=1,2,...,n. \end{array}\right. \end{equation}
maxz=j=1∑ncjxjs.t.={∑j=1naijxj=bi,i=1,2,...,m,xj≥0,j=1,2,...,n.
式中:
b
i
≥
0
,
i
=
1
,
2
,
.
.
.
,
m
b_i\geq0,i=1,2,...,m
bi≥0,i=1,2,...,m,
为线性规划问题的数学标准型。
可行解:满足约束条件(4)的解 x = [ x 1 , x 2 , . . . , x n ] T x=[x_1,x_2,...,x_n]^T x=[x1,x2,...,xn]T,成为线性规划问题的可行解,而使(4)中 m a x z = ∑ j = 1 n c j x j maxz=\sum_{j=1}^{n}c_jx_j maxz=∑j=1ncjxj达到最大值的可行解称为最优解。
可行域:所有可行解构成的集,记为 R ′ R' R′
3.灵敏度分析
是指对系统因周围条件变化显示出来的敏感程度的分析。
对于数学规划模型,一定要做灵敏度分析(详见第3章)
1.2 线性规划模型求解及应用
1.线性规划的Matlab求解
(1)Matlab基于求解器的求解方法:
①Matlab基于求解器的求解方法中规定线性规划的标准形式为:
m
i
n
x
=
f
T
x
s
.
t
.
=
{
A
⋅
x
≤
b
,
A
e
q
⋅
x
=
b
e
q
,
l
b
≤
x
≤
u
b
.
\underset{x}{min}=f^Tx\\ \begin{equation} {\boldsymbol{s.t.}} =\left\{ \begin{array}{ll} A·x\leq b, \\ Aeq·x=beq,\\ lb\leq x\leq ub. \end{array}\right. \end{equation}
xmin=fTxs.t.=⎩
⎨
⎧A⋅x≤b,Aeq⋅x=beq,lb≤x≤ub.
式中:
f
,
x
,
b
,
b
e
q
,
l
b
,
u
b
f,x,b,beq,lb,ub
f,x,b,beq,lb,ub为列向量,其中,
f
f
f为价值向量,
b
b
b为资源向量;
A
,
A
q
e
A,Aqe
A,Aqe分别为不等式约束对应的矩阵。
②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)
其中,
x返回决策向量的取值;
fval返回目标函数的最优值;
f为价值向量;
A,b对应线性不等式约束;
Aeq,beq,对应线性等式约束;
lb和ub分别对应决策向量的下界向量和上界向量。
(2)Matlab基于问题的求解方法
Resource: https://blog.csdn.net/weixin_52901292/article/details/119385051
相比于matlab求解器linprog函数,fmincon等函数,它们更适合用于一些简单约束条件和目标函数条件的方程,如下所举的例题(但是是用optimproblem做的),但是如果当约束条件和目标函数比较复杂,运用求和符号或者连乘符号表示的话,就用optimproblem函数比较简便
e.g.:
这里设置目标函数为f=4x1+3x2
约束条件为:
2*x1+x2<=10;
x1+x2<=8;
x2<=7.
x的下界为0,上界为正无穷
具体详解和例子如代码:
%基于问题求解
clear
clc
prob=optimproblem('ObjectiveSense','max');
%这里ObjectiveSense是目标类型为求最大值的意思
%有时候直接是prob=optimproblem就是默认求最小值
b=[10;8;7];
A=[2,1
1,1
0,1];
x=optimvar('x',1,2,'TYPE','integer','LowerBound',0,'UpperBound',inf);
%optimvar函数是一种类似于赋值的函数
%第一个‘x’里面是变量名,后面说的是该变量所包含的行数和列数
%‘TYPE’,后面定义的是该函数所属类型,比如说integer整数型,double双精度型号等
%‘LowerBound'与'UpperBound'表示下界与上界所跟的0,inf分别是范围
prob.Objective=f*x;
%目标函数需要得到一个标量数值,不是矩阵向量!,所以注意自己不能用.*
%这里是设置目标函数
prob.Constraints.con=A*x<=b;
%注意这里不是.*!那个得到的是一个矩阵,这个是线性代数里的矩阵相乘,得到数值,注意维度
[sol fval flag]=solve(prob);
fval
sol.x
2.可以转化为线性规划的问题
很多看起来不是线性规划的问题,也可以转变为线性规划的问题来解决。
(1)数学规划问题:
m
i
n
∣
x
1
∣
+
∣
x
2
∣
+
.
.
.
+
∣
x
n
∣
,
s
.
t
.
A
x
≤
b
.
min|x_1|+|x_2|+...+|x_n|,\\ s.t.Ax \leq b.
min∣x1∣+∣x2∣+...+∣xn∣,s.t.Ax≤b.
式中:
x
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
T
x=[x_1,x_2,...,x_n]^T
x=[x1,x2,...,xn]T;
A和b为相应维数的矩阵和向量。
要把上面的问题变换成线性规划问题,只要注意到事实:对任意的
x
i
x_i
xi,存在
u
i
,
v
i
≥
0
u_i,v_i \geq 0
ui,vi≥0满足
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,∣x−i∣=ui+vi,
事实上,只要取 u i = x i + ∣ x i ∣ 2 , v i = ∣ x i ∣ − x i 2 u_i=\cfrac{x_i+|x_i|}{2},v_i=\cfrac{|x_i|-x_i}{2} ui=2xi+∣xi∣,vi=2∣xi∣−xi就可以满足上面的条件。
这样,记
u
=
[
u
1
,
u
2
,
.
.
.
,
u
n
]
T
,
v
=
[
v
1
,
v
2
,
.
.
.
,
v
n
]
T
u=[u_1,u_2,...,u_n]^T,v=[v_1,v_2,...,v_n]^T
u=[u1,u2,...,un]T,v=[v1,v2,...,vn]T,从而可以把上面的问题变成
m
i
n
∑
i
=
1
n
(
u
i
+
v
i
)
s
.
t
.
=
{
A
(
u
−
v
)
≤
b
,
u
,
v
≥
0.
min\sum_{i=1}^{n}(u_i+v_i)\\ \begin{equation} {\boldsymbol{s.t.}} =\left\{ \begin{array}{ll} A(u-v)\leq b, \\ u,v \geq 0. \end{array}\right. \end{equation}
mini=1∑n(ui+vi)s.t.={A(u−v)≤b,u,v≥0.
进一步将矩阵改写成
m
i
n
∑
i
=
1
n
(
u
i
+
v
i
)
s
.
t
.
=
{
[
A
,
−
A
]
[
u
v
]
≤
b
,
u
,
v
≥
0.
min\sum_{i=1}^{n}(u_i+v_i)\\ \begin{equation} {\boldsymbol{s.t.}} =\left\{ \begin{array}{ll} [A,-A] \begin{bmatrix} u\\ v\\ \end{bmatrix} \leq b, \\ u,v \geq 0. \end{array}\right. \end{equation}
mini=1∑n(ui+vi)s.t.=⎩
⎨
⎧[A,−A][uv]≤b,u,v≥0.
(2)对于带有绝对值的非线性规划问题,尽量先手工进行线性化,再使用软件求解,这样可以提高求解效率。
e.g. m i n x i \underset{x_i}{min} ximin{ m a x y i ∣ ε i ∣ \underset{y_i}{max}|\varepsilon_i| yimax∣εi∣},其中 ε i = x i − y i \varepsilon_i=x_i-y_i εi=xi−yi。
对于这个问题,如果我们取
v
=
m
a
x
y
i
∣
ε
i
∣
v=\underset{y_i}{max}|\varepsilon_i|
v=yimax∣εi∣,这样,上述问题可以变换成
m
i
n
v
,
s
.
t
.
=
{
x
1
−
y
1
≤
v
,
x
2
−
y
2
≤
v
,
.
.
.
,
x
n
−
y
n
≤
v
,
y
1
−
x
1
≤
v
,
y
2
−
x
2
≤
v
,
.
.
.
,
y
n
−
x
n
≤
v
.
minv,\\ \begin{equation} {\boldsymbol{s.t.}} =\left\{ \begin{array}{ll} x_1-y_1 \leq v,x_2-y_2 \leq v,...,x_n-y_n \leq v, \\ y_1-x_1 \leq v,y_2-x_2 \leq v,...,y_n-x_n \leq v. \end{array}\right. \end{equation}
minv,s.t.={x1−y1≤v,x2−y2≤v,...,xn−yn≤v,y1−x1≤v,y2−x2≤v,...,yn−xn≤v.
此即通常的线性规划问题。