数学规划模型
- 线性规划问题
- 线性规划求解
- Matlab中线性规划的标准型
- Matlab中线性规划的命令
- 例题
- 非线性规划问题
- Matlab中非线性规划的标准型
- matlab求解非线性规划的函数
- 例题
- 整数规划问题
- Matlab整数线性规划求解
- Matlab线性0-1规划求解
- 例题
- 经典整数规划例题
- 背包问题
- 指派问题
- 钢管切割问题
- 最大最小化模型
- 多目标规划模型
数学规划是运筹学的一个分支,用于:
在给定的条件下(约束条件),如何按照某一衡量指标(目标函数)来寻求计划、管理工作中的最优方案。
即 求目标函数在一定约束条件下的极值问题。
线性规划问题
目标函数f(x)和约束条件均是决策变量的线性表达式——解决:单纯形法
线性规划求解
Matlab中线性规划的标准型
min
c
T
x
\min c^{T}x
mincTx
向量的内积,c=(c1,c2,…,cn)^T, x=(x1,x2,…,xn)^T,n是决策变量。
s
.
t
.
{
A
x
<
=
b
A
e
q
⋅
x
=
b
e
q
l
b
<
=
x
<
=
u
b
.\left\{\begin{matrix} Ax <= b \\ Aeq\cdot x = beq\\ lb <= x <= ub \end{matrix}\right.
s.t.⎩⎨⎧Ax<=bAeq⋅x=beqlb<=x<=ub
.从上至下分别为:
1. 不等式约束
2. 等式约束
3. 上下界约束(也可以当成不等式约束)
注意:可能只对部分决策变量有约束
Matlab中线性规划的命令
代码:
[x, fval] = linprog[c, A, b, Aeq, beq, lb, ub, X0]
- X0 表示给定Matlab中迭代求解的初始值(一般不用给)
- c, A, b, Aeq, bee, lb, ub的意义和标准型中的意义一致
- 若不存在不等式约束,可用"[]"替代A和b
- 若不存在等式约束,可用"[]"替代Aeq和beq
- 若某个xi无下界或上界,则设置lb(i)=-inf, ub(i)=+inf
- 返回的x表示最小值处的x取值;fval表示最优解处时取得的最小值
- 不是所有的线性规划问题都有唯一解,kennel无解或者有无穷多的解
- 如果求的是最大值,在最后给fval加一个负号:[x, fval] = linprog[c, A, b, Aeq, beq, lb];fval=-fval; max z ⇔ min − z \max z \Leftrightarrow \min -z maxz⇔min−z
例题
min
z
=
0.04
x
1
+
0.15
x
2
+
0.1
x
3
+
0.125
x
4
\min z=0.04x_{1}+0.15x_{2}+0.1x_{3}+0.125x_{4}
minz=0.04x1+0.15x2+0.1x3+0.125x4
s
.
t
.
{
0.03
x
1
+
0.3
x
2
+
0.15
x
4
>
=
32
0.05
x
1
+
0.2
x
3
+
0.1
x
4
=
24
0.14
x
1
+
0.07
x
4
<
=
42
x
1
,
x
2
,
x
3
,
x
4
>
=
0
.\left\{\begin{matrix} 0.03x_{1}+0.3x_{2}+0.15x_{4} >= 32 \\ 0.05x_{1}+0.2x_{3}+0.1x_{4} = 24\\ 0.14x_{1}+0.07x_{4} <= 42\\ x_{1},x_{2},x_{3},x_{4}>=0 \end{matrix}\right.
s.t.⎩⎪⎪⎨⎪⎪⎧0.03x1+0.3x2+0.15x4>=320.05x1+0.2x3+0.1x4=240.14x1+0.07x4<=42x1,x2,x3,x4>=0
用线性代数形式写出目标函数和约束条件
目标函数c:
c
=
[
0.04
0.15
0.1
0.125
]
c=\begin{bmatrix} 0.04 \\ 0.15 \\ 0.1 \\ 0.125 \end{bmatrix}
c=⎣⎢⎢⎡0.040.150.10.125⎦⎥⎥⎤
x
=
[
x
1
x
2
x
3
x
4
]
x=\begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{bmatrix}
x=⎣⎢⎢⎡x1x2x3x4⎦⎥⎥⎤
约束条件:
- 不等式约束 A = [ − 0.03 − 0.3 0 − 0.15 0.14 0 0 0.07 ] A=\begin{bmatrix} -0.03 & -0.3&0&-0.15 \\ 0.14&0&0&0.07 \end{bmatrix} A=[−0.030.14−0.3000−0.150.07] b = [ − 32 42 ] b=\begin{bmatrix} -32 \\ 42 \end{bmatrix} b=[−3242]
- 等式约束 A e q = [ 0.05 0.2 0.1 ] Aeq=\begin{bmatrix} 0.05 \\ 0.2\\ 0.1 \end{bmatrix} Aeq=⎣⎡0.050.20.1⎦⎤ b e q = 24 beq=24 beq=24
- 上下界约束 l b = [ 0 0 0 0 ] lb=\begin{bmatrix} 0 \\ 0\\ 0\\ 0 \end{bmatrix} lb=⎣⎢⎢⎡0000⎦⎥⎥⎤ u b = [ + i n f + i n f + i n f + i n f ] ub=\begin{bmatrix} +inf \\ +inf\\ +inf\\ +inf \end{bmatrix} ub=⎣⎢⎢⎡+inf+inf+inf+inf⎦⎥⎥⎤ub可省略
Matlab代码
c = [0.04 0.15 0.1 0.125]';
A = [-0.03 -0.3 0 -0.15;
0.14 0 0 0.07];
b = [-32 42]';
Aeq = [0.05 0 0.2 0.1];
beq = 24;
lb = [0 0 0 0]';
[x fval] = linprog(c, A, b, Aeq, beq, lb);
%x =
% 0
% 106.6667
% 120.0000
% 0
%
%fval =
% 28
这个题可能有多个解,即有多个x可以使得目标函数的最小值为28(不同版本的到的x值可能不一样,但fval值一定是28)
若无解,则返回x与fval都为空
非线性规划问题
目标函数f(x)或者约束条件中有一个是决策变量x的非线性表达式——解决:Matlab中有4中方法,在选定决策变量的初始值后,通过一定的搜索方法寻求最优的决策变量
Matlab中非线性规划的标准型
min
f
(
x
)
\min f(x)
minf(x)
向量的内积,c=(c1,c2,…,cn)^T, x=(x1,x2,…,xn)^T,n是决策变量。
s
.
t
.
{
A
x
<
=
b
,
A
e
q
⋅
x
=
b
e
q
(
l
i
n
e
a
r
)
c
(
x
)
<
=
0
,
c
e
q
(
x
)
=
0
(
n
o
n
l
i
n
e
a
r
)
l
b
<
=
x
<
=
u
b
.\left\{\begin{matrix} Ax <= b,Aeq\cdot x = beq (linear) \\ c(x) <= 0,ceq(x) = 0(nonlinear)\\ lb <= x <= ub \end{matrix}\right.
s.t.⎩⎨⎧Ax<=b,Aeq⋅x=beq(linear)c(x)<=0,ceq(x)=0(nonlinear)lb<=x<=ub
注意:可能只对部分决策变量有约束
matlab求解非线性规划的函数
[x fval] = fmincon(@fun, X0, A, b, Aeq, beq, lb, ub, @nonlfun, option)
- 非线性规划中对于初始值X0的选取非常重要,因为非线性规划的算法求解出来的是一个局部最优解
- 如果要求“全局最优解”有两种思路:给定不同初始值,在里面找到一个最优解;先用蒙特卡洛模拟,得到一个蒙特卡洛解,然后将这个解作为初始值来求最优解。
- “option”选项可以给丁求解的算法,一共有四种:interior-point(内点法)、sqp(序列二次规划法)、active-set(有效集法)以及trust-region-reflective(信赖域反射算法)。
- 不同的算法有其各自的优缺点和适用情况,我们可以改变求解的算法来看求解的结果是否变好了。
- “@fun”表示目标函数,我们要编写一个独立的“m文件”存储目标函数
funciton f = fun(x); f = ......; end;
fun可以任意取名;f也可任意取名,但返回的f函数内部的f要完全一致;治理的x实际上是一个列向量,表示决策变量;调用函数:function(@fun,…)求解。 - “@nonlfun”表示非线性部分的约束,我们同样得编写一个独立的“m文件”存储约束条件
- 注意要把下标改写为括号
- 若不存在某种约束,则可用“[]”替代,若后面全为“[]”且不指定option(使用默认求解方法),则“[]”也可以略掉
例题
min
f
(
x
)
=
x
1
2
+
x
2
2
+
x
3
2
+
8
\min f(x) =x_{1}^2+x_{2}^2+x_{3}^2+8
minf(x)=x12+x22+x32+8
向量的内积,c=(c1,c2,…,cn)^T, x=(x1,x2,…,xn)^T,n是决策变量。
s
.
t
.
{
x
1
2
−
x
2
+
x
3
2
>
=
0
x
1
+
x
2
2
+
x
3
2
<
=
20
−
x
1
−
x
2
2
+
2
=
0
−
x
1
+
2
x
3
2
=
3
x
1
,
x
2
,
x
3
>
=
0
.\left\{\begin{matrix} x_{1}^2-x_{2}+x_{3}^2>=0\\ x_{1}+x_{2}^2+x_{3}^2<=20\\ -x_{1}-x_{2}^2+2=0\\ -x_{1}+2x_{3}^2=3\\ x_{1},x_{2},x_{3}>=0 \end{matrix}\right.
s.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x12−x2+x32>=0x1+x22+x32<=20−x1−x22+2=0−x1+2x32=3x1,x2,x3>=0
化为标准型
其中A,b,Aeq,beq,ub均为"[]"
c
=
[
−
x
1
2
+
x
2
−
x
3
2
;
x
1
+
x
2
2
+
x
3
2
−
20
]
c=[-x_{1}^2+x_{2}-x_{3}^2; x_{1}+x_{2}^2+x_{3}^2-20]
c=[−x12+x2−x32;x1+x22+x32−20]
c
e
q
=
[
−
x
1
−
x
2
2
+
2
;
x
2
+
2
x
3
2
−
3
]
ceq=[-x_{1}-x_{2}^2+2;x_{2}+2x_{3}^2-3]
ceq=[−x1−x22+2;x2+2x32−3]
l
b
=
[
0
,
0
,
0
]
′
lb=[0,0,0]'
lb=[0,0,0]′
整数规划问题
一类要求变量取整数值的数学规划:线性整数规划(在线性模型中,有决策变量限定为整数);非线性整数规划(无特定算法,只能用近似,如蒙特卡洛模拟、智能算法)
整数规划的特例:0-1规划——特殊的证书规划,Matlab中也只能求解线性0-1规划,对于非线性0-1规划也只能近似求解。
Matlab整数线性规划求解
与线性规划求解命令[x, fval] = linprog[c, A, b, Aeq, beq, lb, ub, X0]很相似
[x fval] = intlinprog[c, intcon, A, b, Aeq, beq, lb, ub]
- intlinprog不能指定初始值
- 加入了intcon参数可以指定那些决策变量是整数(例如:决策变量有三个:x1,x2,x3;若x1和x3是整数,则intcon=[1, 3])
Matlab线性0-1规划求解
仍使用intlinprog函数,只不过在lb和ub上作文章。
例如:三个决策变量x1,x2,x3中,x1和x3是0-1变量,x2不限制,则intcon=[1, 3],lb=[0;-inf;0],ub=[1;+inf,1]
例题
min
z
=
18
x
1
+
23
x
2
+
5
x
3
\min z=18x_{1}+23x_{2}+5x_{3}
minz=18x1+23x2+5x3
s
.
t
.
{
500
<
=
107
x
1
+
500
x
2
<
=
50000
2000
<
=
72
x
1
+
121
x
2
+
65
x
3
<
=
2250
x
3
∈
z
x
1
,
x
2
,
x
3
>
=
0
.\left\{\begin{matrix} 500<=107x_{1}+500x_{2}<=50000 \\ 2000<=72x_{1}+121x_{2}+65x_{3} <= 2250\\ x_{3} \in z\\ x_{1},x_{2},x_{3}>=0 \end{matrix}\right.
s.t.⎩⎪⎪⎨⎪⎪⎧500<=107x1+500x2<=500002000<=72x1+121x2+65x3<=2250x3∈zx1,x2,x3>=0
Matlab代码
c = [18 23 5]';
intcon = 3; %限定为整数
A = [107 500 0;
72 121 65;
-107 -500 0;
-72 -121 -65];
b = [50000 2250 -500 -2000]';
lb = [0 0 0]';
[x fval] = linprog(c, intcon, A, b, [], [], lb);
%x =
% 0
% 1
% 29
%
%fval =
% 168
%
经典整数规划例题
背包问题
有10件货物要从甲地运到乙地,每件货物重量(单位:吨)和利润(单位:元)如下表所示
物品 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
重量(t) | 6 | 3 | 4 | 5 | 1 | 2 | 3 | 5 | 4 | 2 |
利润(元) | 540 | 200 | 180 | 350 | 60 | 150 | 280 | 450 | 320 | 120 |
由于只有一辆载重为30t的货车能用来运送货物,所以只能选择部分货物进行运送。
要求确定运送那些货物,使得运送这些货物的总利润最大。
解:写出目标函数和约束条件
记
x
i
{
1
,
运
送
了
第
i
件
货
物
0
,
没
有
运
送
第
i
件
货
物
x_{i}\left\{\begin{matrix} 1, 运送了第i件货物\\ 0, 没有运送第i件货物 \end{matrix}\right.
xi{1,运送了第i件货物0,没有运送第i件货物
i=1,2,…,10
记wi表示第i件物品的重量,pi表示第i件物品的利润
则目标函数:
max
∑
i
=
1
10
p
i
x
i
\max \sum_{i=1}^{10} p_{i}x_{i}
maxi=1∑10pixi
约束条件:
s
.
t
.
{
∑
i
=
1
10
w
i
x
i
<
=
30
x
i
∈
0
,
1
.\left\{\begin{matrix} \sum_{i=1}^{10} w_{i}x_{i} <= 30 \\ x_{i} \in {0, 1} \end{matrix}\right.
s.t.{∑i=110wixi<=30xi∈0,1
指派问题
5名候选人的百米成绩(s)
蝶泳 | 仰泳 | 蛙泳 | *泳 | |
---|---|---|---|---|
甲 | 66.8 | 75.6 | 87 | 58.6 |
乙 | 57.2 | 66 | 66.4 | 53 |
丙 | 78 | 67.8 | 84.6 | 59.4 |
丁 | 70 | 74.2 | 69.6 | 57.2 |
戊 | 67.4 | 71 | 83.8 | 62.4 |
怎么选拔队员组成4×100米混合泳接力队伍?
解:写出目标函数和约束条件
记
{
i
=
1
,
2
,
.
.
.
,
5
⇒
五
名
队
员
j
=
1
,
2
,
3
,
4
⇒
四
种
泳
姿
x
i
{
1
,
队
员
i
参
加
第
j
中
泳
姿
0
,
队
员
i
不
参
加
第
j
中
泳
姿
t
i
j
⇒
队
员
i
参
加
第
j
种
泳
姿
的
耗
时
\left\{\begin{matrix} i=1,2,...,5 \Rightarrow 五名队员\\ j=1,2, 3,4 \Rightarrow 四种泳姿\\ x_{i}\left\{\begin{matrix} 1, 队员i参加第j中泳姿\\ 0, 队员i不参加第j中泳姿 \end{matrix}\right. \\ t_{ij} \Rightarrow 队员i参加第j种泳姿的耗时 \end{matrix}\right.
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧i=1,2,...,5⇒五名队员j=1,2,3,4⇒四种泳姿xi{1,队员i参加第j中泳姿0,队员i不参加第j中泳姿tij⇒队员i参加第j种泳姿的耗时
则目标函数:
min
∑
j
=
1
4
∑
i
=
1
5
t
i
j
x
i
j
\min \sum_{j=1}^{4} \sum_{i=1}^{5} t_{ij}x_{ij}
minj=1∑4i=1∑5tijxij
约束条件:
s
.
t
.
{
∑
j
=
1
4
x
i
j
<
=
1
,
i
=
1
,
2
,
3
,
4
,
5
(
每
个
人
只
能
入
选
4
种
泳
姿
之
一
)
∑
i
=
1
5
x
i
j
=
1
,
j
=
1
,
2
,
3
,
4
(
美
中
泳
姿
有
且
仅
有
1
人
参
加
)
x
i
j
∈
0
,
1
.\left\{\begin{matrix} \sum_{j=1}^{4}x_{ij} <= 1, i=1,2,3,4,5( 每个人只能入选4种泳姿之一) \\ \sum_{i=1}^{5} x_{ij} = 1 ,j=1,2,3,4(美中泳姿有且仅有1人参加) \\ x_{ij}\in {0, 1} \end{matrix}\right.
s.t.⎩⎨⎧∑j=14xij<=1,i=1,2,3,4,5(每个人只能入选4种泳姿之一)∑i=15xij=1,j=1,2,3,4(美中泳姿有且仅有1人参加)xij∈0,1
钢管切割问题
假设按照方案A-G切割的原材料数量分别为xi(i = 1,2,…,7),根据上表的数据我们可以建立以下线性整数规划模型:
目标函数:
min
∑
i
=
1
7
x
i
j
\min \sum_{i=1}^{7} x_{ij}
mini=1∑7xij
约束条件:
{
x
1
+
2
x
2
+
x
7
>
=
100
x
3
+
2
x
4
+
x
5
+
x
7
>
=
100
4
x
1
+
x
2
+
2
x
4
+
6
x
6
+
x
7
>
=
100
x
i
⇒
非
负
整
数
(
i
=
1
,
2
,
3
,
4
,
5
,
6
,
7
)
\left\{\begin{matrix} x_{1} + 2x_{2} + x_{7} >= 100 \\ x_{3} + 2x_{4} + x_{5}+x_{7} >= 100\\ 4x_{1} + x_{2} +2x_{4} + 6x_{6}+x_{7} >= 100 \\ x_{i} \Rightarrow 非负整数(i=1,2,3,4,5,6,7) \end{matrix}\right.
⎩⎪⎪⎨⎪⎪⎧x1+2x2+x7>=100x3+2x4+x5+x7>=1004x1+x2+2x4+6x6+x7>=100xi⇒非负整数(i=1,2,3,4,5,6,7)
求解结果如下表所示
A | B | C | D | E | F | G | |
---|---|---|---|---|---|---|---|
原材料数量 | 14 | 43 | 32 | 2 | 0 | 0 | 0 |
所花费的原材料数量为:91
Matlab代码
最大最小化模型
在对策论中,我们常遇到这样的问题:在最不利的条件下,寻求最有利的策略。如:急救中心选址,投资规划中确定最大风险的最低限度。
为此对每个x
最大最小化问题的一般数学模型
min
x
{
m
a
x
[
f
1
(
x
)
,
f
2
(
x
)
,
.
.
.
,
f
m
(
x
)
]
}
\min_{x} \left\{max[f_{1}(x),f_{2}(x),...,f_{m}(x)]\right\}
xmin{max[f1(x),f2(x),...,fm(x)]}
s
.
t
.
{
A
x
<
=
b
A
e
q
⋅
x
=
b
e
q
C
(
x
)
<
=
0
C
e
q
(
x
)
=
0
V
L
B
<
=
X
<
=
V
U
B
.\left\{\begin{matrix} Ax <= b\\ Aeq\cdot x = beq \\ C(x) <= 0\\ Ceq(x) = 0\\ VLB <= X <= VUB \end{matrix}\right.
s.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧Ax<=bAeq⋅x=beqC(x)<=0Ceq(x)=0VLB<=X<=VUB
Matlab
[x fval] = fminimax(@Fun, X0, A, b, Aeq, beq, lb, ub, @nonlfun, option)
目标函数@Fun用一个函数向量表示 code11
funciton f = Fun(x)
f = zeros(m, 1)
f(1) = ...
f(2) = ...
...
f(m) = ...
end
多目标规划模型
若一个规划问题中有多个目标,例如企业在保证利润最大时也要保证生产时产生的污染最少,这种情况下我们可以对多目标函数进行加权组合,是问题变为单目标规划,然后利用前面的模型进行求解
注意:
- 要先将多个目标函数统一为最大化或最小化问题后才可以进行加权组合
- 如果目标函数的量纲不同,则需要对其进行标准化后再进行加权,标准化的方法一般是用目标函数除以某个常量,该常量是这个目标函数的某个取值,具体取值可以根据经验确定
- 对多目标函数进行加权求和时,权重需要由该问题领域的专家给出,在实际建模比赛中,若无特殊说明,我们可令权重相同。