数学规划模型
什么是数学规划
- 数学规划是运筹学的一个分支,用来研究:在给定的条件下(约束条件),如何按照某一衡量指标(目标函数)来寻求计划、管理工作中的最优方案
数学规划的一般形式
min ( 或 max ) z = f ( x ) s . t { g i ( x ) ≤ 0 i = 1 , 2 , . . . , m 1 h i ( x ) = 0 i = 1 , 2 , . . . , m 2 \min(或\max)\quad z=f(x)\\ s.t \begin{cases} g_i(x)\le0 & i=1,2,...,m_1\\ h_i(x)=0 & i=1,2,...,m_2\\ \end{cases} min(或max)z=f(x)s.t{gi(x)≤0hi(x)=0i=1,2,...,m1i=1,2,...,m2
- x x x称为决策变量,(1)称为问题的目标函数,(2)称为问题的约束条件,是规划问题数学模型的三个要素
数学规划的分类
- 线性规划:目标函数及约束条件均为线性函数,故被称为线性规划问题,通用的算法有单纯形法
- 整数规划:变量取整数值的数学规划,包括线性整数规划和非线性整数规划,目前所流行的求解整数规划的算法往往只适用于线性整数规划
- 非线性规划:目标函数或约束条件是非线性表达的数学规划。目前没有通用算法,大多数算法都是在选定决策变量的初始值后,通过一定的搜索方法寻求最优的决策变量
线性规划问题解的概念
- 一般线性规划的标准型为
min
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
\min\quad z=\sum_{j=1}^nc_jx_j\\ s.t \begin{cases} \sum_{j=1}^na_{ij}x_j\leq b_i&i=1,2,...,m\\ x_j\ge0&j=1,2,...,n \end{cases}
minz=∑j=1ncjxjs.t{∑j=1naijxj≤bixj≥0i=1,2,...,mj=1,2,...,n
满足约束条件的解称为线性规划问题的可行解,而使目标函数达到最小值的可行解称为最优解,所有可行解构成的集合称为问题的可行域,记为R。
线性规划的Matlab标准形式及解法
min x f T x s . t . { A x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b \min_x\quad f^T\boldsymbol x \\ s.t. \begin{cases} A\boldsymbol x\leq b\\ Aeq\cdot\boldsymbol x=beq\\ lb\le\boldsymbol x\le ub \end{cases} minxfTxs.t.⎩⎪⎨⎪⎧Ax≤bAeq⋅x=beqlb≤x≤ub
- 基本调用函数 [x,fval]=linprog(c,A,b,Aeq,Beq,lb,ub,X0,options)
例:
max
z
=
2
x
1
+
3
x
2
−
5
x
3
s
.
t
.
{
x
1
+
x
2
+
x
3
=
7
2
x
1
−
5
x
2
+
x
3
≥
10
x
1
+
3
x
2
+
x
3
≤
12
x
1
,
x
2
,
x
3
≥
0
\max \quad z=2x_1+3x_2-5x_3\\ s.t. \begin{cases} x_1+x_2+x_3=7 \\ 2x_1-5x_2+x_3\ge 10 \\ x_1+3x_2+x_3\le 12\\ x_1,x_2,x_3\ge 0 \end{cases}
maxz=2x1+3x2−5x3s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧x1+x2+x3=72x1−5x2+x3≥10x1+3x2+x3≤12x1,x2,x3≥0
f=[-2 -3 5];
A=[-2 5 -1 ;1 3 1];
b=[-10;12];
Aeq=[1 1 1];
beq=7;
lb=zeros(3,1);
[x,fval]=linprog(f,A,b,Aeq,beq,lb);
disp(["最优解为:" num2str(x')]);
disp(["最优值为:" num2str(-fval)]);
from scipy.optimize import linprog
import numpy as np
f=np.array([2,3,-5])
A=np.array([[-2,5,-1],[1,3,1]])
b=np.array([-10,12])
Aeq=np.array([[1,1,1]])
beq=np.array([7])
res=linprog(f,A_ub=A,b_ub=b,A_eq=Aeq,b_eq=beq,bounds=[(0, None), (0, None), (0, None)])
可以转化为线性规划的问题
- 很多看起来不是线性规划的问题可以通过变换变成线性规划的问题来解决
- 数学规划问题
min
∣
x
1
∣
+
∣
x
2
∣
+
.
.
.
+
∣
x
n
∣
s
.
t
.
A
x
≤
b
\min\quad|x_1|+|x_2|+...+|x_n|\\ s.t.\quad A\boldsymbol x\le b
min∣x1∣+∣x2∣+...+∣xn∣s.t.Ax≤b
因为对任意的
x
i
x_i
xi存在
u
i
,
v
i
≥
0
u_i,v_i\ge0
ui,vi≥0满足
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
所以问题可以转化为
min
x
∑
i
=
1
n
(
u
i
+
v
i
)
s
.
t
.
{
A
(
u
−
v
)
≤
b
u
,
v
≥
0
\min_x\quad \sum_{i=1}^n(u_i+v_i) \\ s.t. \begin{cases} A\boldsymbol {(u-v)}\leq b\\ \boldsymbol {u,v}\ge0 \end{cases}
minx∑i=1n(ui+vi)s.t.{A(u−v)≤bu,v≥0
- min x i { max ∣ ε i ∣ } , 其 中 ε i = x i − y i \min_{x_i}\{\max|\varepsilon_i|\},其中\varepsilon_i=x_i-y_i minxi{max∣εi∣},其中εi=xi−yi
若取
v
=
max
∣
ε
i
∣
v=\max|\varepsilon_i|
v=max∣εi∣,则问题可转化为
min
v
s
.
t
.
{
x
1
−
y
1
≤
v
,
.
.
.
,
x
n
−
y
n
≤
v
y
1
−
x
1
≤
v
,
.
.
.
,
y
n
−
x
n
≤
v
\min\quad v\\s.t. \begin{cases} x_1-y_1\le v,...,x_n-y_n\le v\\ y_1-x_1\le v,...,y_n-x_n\le v \end{cases}
minvs.t.{x1−y1≤v,...,xn−yn≤vy1−x1≤v,...,yn−xn≤v