大学生数学建模大赛知识笔记
Matlab编程Part1
1.线性规划
线性规划:在一组约束条件下,选择合适的决策变量,求目标函数的最大或最小值(最优解)。
Matlab标准形式:
min
c
T
x
s
.
t
.
{
A
⋅
x
⩽
b
A
e
q
⋅
x
=
b
e
q
l
b
⩽
x
⩽
u
b
\min{\ \ c^Tx} \\ s.t.\left\{ \begin{array}{c} A\cdot x\leqslant b\\ Aeq\cdot x=beq\\ lb\leqslant x\leqslant ub\\ \end {array}\right.
min cTxs.t.⎩
⎨
⎧A⋅x⩽bAeq⋅x=beqlb⩽x⩽ub
其中c和x为n维列向量,A,Aeq为矩阵,b,beq为适当维数列向量。
式子分别为不等式约束,等式约束,决策变量取值范围。
注:Matlab一般求最小值,如果求最大值可以在函数前加负号;约束条件只能为
⩽
\leqslant
⩽号。
Matlab中求解线性规划的命令为:
[
x
,
f
v
a
l
]
=
l
i
n
p
r
o
g
(
c
,
A
,
b
)
[
x
,
f
v
a
l
]
=
l
i
n
p
r
o
g
(
c
,
A
,
b
,
A
e
q
,
b
e
q
)
[
x
,
f
v
a
l
]
=
l
i
n
p
r
o
g
(
c
,
A
,
b
,
A
e
q
,
b
e
q
,
l
b
,
u
b
)
\left[x,fval \right]=linprog \left(c,A,b\right) \\ \left[x,fval \right]= linprog \left(c,A,b,Aeq,beq \right) \\ \left[x,fval \right]=linprog \left(c,A,b,Aeq,beq,lb,ub \right)
[x,fval]=linprog(c,A,b)[x,fval]=linprog(c,A,b,Aeq,beq)[x,fval]=linprog(c,A,b,Aeq,beq,lb,ub)其中,x返回的是决策变量的取值,fval返回的是目标函数最优解。
不同的约束条件选用不同的命令。
示例:
其中zeros(x,y)为生成3行1列的零矩阵。本题中是求max,所以f=f*(-1),并最后使y=-y。
其他一些问题也可以化为线性规划问题,如求
∑
n
=
1
∞
∣
x
n
∣
s
.
t
.
A
x
⩽
b
\sum_{n=1}^{\infty}{\left |x_n \right |} \\ s.t.Ax\leqslant b
n=1∑∞∣xn∣s.t.Ax⩽b
可令
u
i
=
x
i
+
∣
x
i
∣
2
,
v
i
=
∣
x
i
∣
−
x
i
2
u_i=\frac{x_i+\left |x_i \right |}{2},v_i=\frac{\left |x_i \right |-x_i}{2}
ui=2xi+∣xi∣,vi=2∣xi∣−xi
即将x与|x|视为两个有关系的变量化为线性规划问题。
某些多元函数问题,可以转化成线性规划问题,在Matlab中循环求解。
1.将其它函数转化成约束条件(如小于a),只关注决策变量和a的关系。
2.设置一个权重,每个函数乘以权重求和,依次增大权重。
示例
其中diag[]为对角阵。之后要重点分析拐点处情况。
2.整数线性规划
线性规划模型中的变量为整数时为整数线性规划(ILP)。
当原线性规划最优解全为整数时,整数规划最优解与线性规划最优解一致。当原线性规划最优解为非整数时,不能将最优解取整作为整数规划最优解。
类型
1.纯整数规划:决策变量为整数。(松弛变量与剩余变量不要求)
2.全整数规划:决策变量,系数和常数都为整数。
3.混合整数规划:只有部分决策变量要取整数。
4.0-1整数规划:决策变量只取0或1。
松弛变量:添加变量使
⩽
\leqslant
⩽不等式约束变为等式约束,且该变量有范围。
剩余变量:添加变量使
⩾
\geqslant
⩾不等式约束变为等式约束,且该变量有范围。
基本解法
Matlab标准形式:
min
c
T
x
s
.
t
.
{
A
⋅
x
⩽
b
A
e
q
⋅
x
=
b
e
q
l
b
⩽
x
⩽
u
b
x
(
i
n
t
c
o
n
)
a
r
e
i
n
t
e
g
e
r
s
\min{\ \ c^Tx} \\ s.t.\left\{ \begin{array}{c} A\cdot x\leqslant b\\ Aeq\cdot x=beq\\ lb\leqslant x\leqslant ub\\ x(intcon)\,\, are\,\, integers \end {array}\right.
min cTxs.t.⎩
⎨
⎧A⋅x⩽bAeq⋅x=beqlb⩽x⩽ubx(intcon)areintegers
其中c和x为n维列向量,A,Aeq为矩阵,b,beq为适当维数列向量,intcon为整数变量个数维的向量。
Matlab中求解线性规划的命令为:
[
x
,
f
v
a
l
]
=
i
n
t
l
i
n
p
r
o
g
(
c
,
i
n
t
c
o
n
,
A
,
b
)
[
x
,
f
v
a
l
]
=
i
n
t
l
i
n
p
r
o
g
(
c
,
i
n
t
c
o
n
,
A
,
b
,
A
e
q
,
b
e
q
)
[
x
,
f
v
a
l
]
=
i
n
t
l
i
n
p
r
o
g
(
c
,
i
n
t
c
o
n
,
A
,
b
,
A
e
q
,
b
e
q
,
l
b
,
u
b
)
[
x
,
f
v
a
l
]
=
i
n
t
l
i
n
p
r
o
g
(
c
,
i
n
t
c
o
n
,
A
,
b
,
A
e
q
,
b
e
q
,
l
b
,
u
b
,
x
0
,
o
p
t
i
o
n
s
)
\left[x,fval \right]=intlinprog \left(c,intcon,A,b \right) \\ \left[x,fval \right]=intlinprog \left(c,intcon,A,b,Aeq,beq \right) \\ \left[x,fval \right]=intlinprog \left(c,intcon,A,b,Aeq,beq,lb,ub \right) \\ \left[x,fval \right]=intlinprog \left(c,intcon,A,b,Aeq,beq,lb,ub,x_0,options \right)
[x,fval]=intlinprog(c,intcon,A,b)[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq)[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub,x0,options)
其中
x
0
x_0
x0为初始值,选用合适的命令,如果有不存在的项,将其设置为[ ],不能直接不写。
如果需要更高阶的用法,用法详情
options用法如下:
示例
1.纯整数规划
所以
x
1
=
0
,
x
2
=
5
x_1=0,x_2=5
x1=0,x2=5时有最优解。
2.0-1整数规划
0-1整数规划解决互斥约束问题
如果1,2式互斥,则两式分别加 xM,(1-x)M,x为只能取0,1的变量,M为无穷大的数。
推广:从p个约束条件中选择q个约束条件:
∑
j
=
1
n
a
i
j
x
j
⩽
b
i
(
i
=
1
,
2
,
⋯
,
p
)
y
=
{
0
选第i个约束条件
1
不选第i个约束条件
所以:
{
∑
j
=
1
n
a
i
j
x
j
⩽
b
i
+
M
y
i
(
i
=
1
,
2
,
⋯
,
p
)
∑
i
=
1
n
y
i
=
p
−
q
\sum_{j=1}^n{a_{ij} x_j\leqslant b_i}\ \ (i=1,2,\cdots,p) \\ y=\left\{ \begin{array}{c} 0 \ \ \text{ 选第i个约束条件}\\ 1 \ \ \text{ 不选第i个约束条件}\\ \end{array}\right. \\ \text{所以:}\left\{\begin{array}{c} \sum_{j=1}^n{a_{ij} x_j\leqslant b_i+My_i}\ \ (i=1,2,\cdots,p)\\ \sum_{i=1}^n{y_i= p-q}\\ \end{array}\right.
j=1∑naijxj⩽bi (i=1,2,⋯,p)y={0 选第i个约束条件1 不选第i个约束条件所以:{∑j=1naijxj⩽bi+Myi (i=1,2,⋯,p)∑i=1nyi=p−q
0-1整数规划解决指派问题
问题标准形式:有n个人和n项工作,已知第
i
i
i个人做第
j
j
j个工作代价为
c
i
j
c_{ij}
cij,要求每个工作只能由一人完成,每个人只能完成一项工作,如何分配使总代价最小。
min
z
=
∑
i
=
1
n
∑
j
=
1
n
c
i
j
x
i
j
s
.
t
.
{
∑
i
=
1
n
x
i
j
(
j
=
1
,
⋯
,
n
)
∑
j
=
1
n
x
i
j
(
i
=
1
,
⋯
,
n
)
x
i
j
=
0
或
1
\min \ \ z={\sum_{i=1}^n\sum_{j=1}^nc_{ij}x_{ij}} \\ s.t.\left\{ \begin{array}{c} \sum_{i=1}^n x_{ij}(j=1,\cdots,n)\\ \sum_{j=1}^n x_{ij}(i=1,\cdots,n)\\ x_{ij}=0\text{或}1 \end{array}\right.
min z=i=1∑nj=1∑ncijxijs.t.⎩
⎨
⎧∑i=1nxij(j=1,⋯,n)∑j=1nxij(i=1,⋯,n)xij=0或1
0-1整数规划转换非标准形式的指派问题
1.最大化指派问题
令
B
=
(
b
i
j
)
n
×
n
=
(
m
−
c
i
j
)
n
×
n
B=(b_{ij})_{n\times n}=(m-c_{ij})_{n\times n}
B=(bij)n×n=(m−cij)n×n
m
m
m为
C
C
C中的最大元素
2.人数和工作数不等
人少工作多:添加虚拟人,代价为0
人多工作少:添加虚拟工作,代价为0
3.一个人可做多件工作
将该人化为几个相同的人
4.某工作一定不能由某人做
该人做该工作代价取足够大
算法介绍
没有具体Matlab命令实例
a.分支定界算法
在不考虑整数限制下的相应松弛问题中有最优解且最优解不符合整数条件时,任选一个不满足整数条件的变量
x
x
x来构造新的约束添加到原松弛问题中,新约束包括以下两个分支:
x
i
⩽
[
x
i
]
;
x
i
⩾
[
x
i
]
+
1
x_i \leqslant \left[ x_i \right];x_i \geqslant \left[ x_i \right]+1
xi⩽[xi];xi⩾[xi]+1
分支的条件下如果有符合整数条件的最优解,记录这个解;如果有不符合整数条件的最优解,重复上面的步骤,任选变量构造两个新分支,直到找到整数解或无解的情况。最后比较所有整数解,取最优解。
Matlab中求解命令注意:
round()为四舍五入取整;inf为无穷;I为决策变量个数;abs()为取绝对值;e为一个很小的数;[x,y,c]=linprog(),c判断有无解,无解时为小于零的数;
自创函数:branchbound()求解整数规划的函数;intprog()进行有无解的判断,有解才继续求解;
b.割平面算法
在不考虑整数限制下的相应松弛问题中有最优解且最优解不符合整数条件后:
1)将不等式约束通过添加松弛变量和剩余变量变为等式约束,变量范围为
⩾
\geqslant
⩾ 0且为整数。
2)将每个等式约束化为一个决策变量与一个或多个松弛,剩余变量的和,且决策变量系数为1。
3)将系数和beq分为整数和小于1的小数部分,整数的放一边,小数的放另一边,于是有小数部分运算后一定为整数得到新的约束方程,再求最优解。
c.匈牙利算法 (0-1规划)
指派问题:
把条件化为
C
=
(
c
i
j
)
n
×
n
C=(c_{ij})_{n\times n}
C=(cij)n×n的矩阵,再按一定的方法变为只有0,1的矩阵。
Matlab解法:P11 50:00
3.非线性规划
基本类型解法
Matlab标准形式:
min
f
(
x
)
s
.
t
.
{
A
⋅
x
⩽
b
A
e
q
⋅
x
=
b
e
q
c
(
x
)
⩽
0
c
e
q
(
x
)
=
0
l
b
⩽
x
⩽
u
b
\min{\ \ f(x)} \\ s.t.\left\{ \begin{array}{c} A\cdot x\leqslant b\\ Aeq\cdot x=beq\\ c(x)\leqslant 0\\ ceq(x)=0\\ lb\leqslant x\leqslant ub\\ \end {array}\right.
min f(x)s.t.⎩
⎨
⎧A⋅x⩽bAeq⋅x=beqc(x)⩽0ceq(x)=0lb⩽x⩽ub
其中c和x为n维列向量,
A
,
A
e
q
A,Aeq
A,Aeq为矩阵,
b
,
b
e
q
b,beq
b,beq为适当维数列向量,
c
(
x
)
,
c
e
q
(
x
)
c(x),ceq(x)
c(x),ceq(x)为非线性函数。
注:Matlab一般求最小值,如果求最大值可以在函数前加负号;约束条件只能为
⩽
\leqslant
⩽号。
Matlab中求解线性规划的命令为:
[
x
,
f
v
a
l
]
=
f
m
i
n
c
o
n
(
f
u
n
,
x
0
,
A
,
b
,
A
e
q
,
b
e
q
,
l
b
,
u
b
,
n
o
n
l
c
o
n
,
o
p
t
i
o
n
s
)
\left[x,fval \right]=fmincon \left(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options\right)
[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)其中,x返回的是决策变量的取值,fval返回的是目标函数最优解。
x
0
x0
x0是
x
x
x的初始值,
n
o
n
l
c
o
n
nonlcon
nonlcon是定义的非线性向量函数
c
(
x
)
,
c
e
q
(
x
)
c(x),ceq(x)
c(x),ceq(x),
o
p
t
i
o
n
s
options
options定义了优化参数。
示例:
二次规划
二次规划:非线性规划的目标函数为自变量的二次函数,约束条件全为线性的。
Matlab标准形式:
min
1
2
x
T
H
x
+
f
T
x
s
.
t
.
{
A
⋅
x
⩽
b
A
e
q
⋅
x
=
b
e
q
l
b
⩽
x
⩽
u
b
\min{\ \ \frac{1}{2}x^THx+f^Tx } \\ s.t.\left\{ \begin{array}{c} A\cdot x\leqslant b\\ Aeq\cdot x=beq\\ lb\leqslant x\leqslant ub\\ \end {array}\right.
min 21xTHx+fTxs.t.⎩
⎨
⎧A⋅x⩽bAeq⋅x=beqlb⩽x⩽ub
其中
H
H
H是实对称矩阵,
A
,
A
e
q
A,Aeq
A,Aeq为矩阵,
f
,
b
,
b
e
q
,
l
b
,
u
b
f,b,beq,lb,ub
f,b,beq,lb,ub为列向量。
Matlab中求解线性规划的命令为:
[
x
,
f
v
a
l
]
=
q
u
a
d
p
r
o
g
(
H
,
f
,
A
,
b
,
A
e
q
,
b
e
q
,
l
b
,
u
b
,
x
0
,
o
p
t
i
o
n
s
)
\left[x,fval \right]=quadprog \left(H,f,A,b,Aeq,beq,lb,ub,x0,options \right)
[x,fval]=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)