目录
前言
本文大部分是对于数学建模清风老师的课程学习总结归纳而来,我的理解可能有错误,大家发现错误可以在评论区批评指正,课程地址:《数学建模清风》
一、模型定义
1. 规划模型概述
1.1. 什么是规划问题?
数学规划是运筹学的一个分支,其用来研究:在给定的条件下(约束条件),如何按照某一衡量指标(目标函数)来寻求计划、管理工作中的最优方案。即求目标函数在一定约束条件下的极值问题。
1.2. 数学规划的一般形式
m
i
n
(
m
a
x
)
z
=
f
(
x
)
,
s
.
t
.
g
i
(
x
)
≤
0
,
(
i
=
1
,
2
⋯
,
m
)
min(max)z=f(x),s.t.g_i(x)\leq 0,(i=1,2\cdots,m)
min(max)z=f(x),s.t.gi(x)≤0,(i=1,2⋯,m)
其中
x
x
x代表决策变量(一般有多个自变量),
f
(
x
)
f(x)
f(x)代表目标函数
s
.
t
.
s.t.
s.t.(即subject to)代表约束条件,上面的
g
i
(
x
)
≤
0
,
(
i
=
1
,
2
⋯
,
m
)
g_i(x)\leq 0,(i=1,2\cdots,m)
gi(x)≤0,(i=1,2⋯,m)是不等式约束,一个规划模型中还可能存在等式约束和整数约束。
1.3. 数学规划的分类
- 线性规划(Linear Programming)
如果 ⽬标函数 和和约束条件 均是决策变量的 线性表达式 , 那么 此时的 数学规划问题就属于线性规划 。1947年,美国数学家丹⻬格 (G.B.Dantzing)提出了求解线性规划的单纯形法 ,奠定了这⻔学科的基础 。 - 非线性规划(Nonlinear Programming)
当⽬标函数和或者约束条件中有⼀个是决策变量 x x x 的非线性表达式 , 那么此时的数学规划问题就属于非线性规划 。
解决非线性规划要比线性规划困难得多 , ⽬前没有通⽤算法,⼤多数算法都是在选定决策变量的初始值后 ,通过一定的搜索⽅法寻求最优的决策变量 。 - 整数规划(Integer Programming)
整数规划是⼀类要求变量取整数值的 数学规划(在线性规划模型中,有决策变量限定为整数)。
⽬前, 所流⾏的求解整数规划的算法往往只适⽤于线性整数规划, 所以之后在整数规划的学习文章中均针对线性整数规划。 - 0-1规划(0-1 Programming)
整数规划的特例 ,整数变量的取值只能为0和1。
二、线性规划问题的求解
1. M a t l a b Matlab Matlab中线性规划的标准型
m
i
n
(
c
T
x
)
min(c^Tx)
min(cTx),其中
c
=
(
c
1
,
c
2
,
⋯
,
c
n
)
′
,
x
=
(
x
1
,
x
2
,
⋯
,
x
n
)
′
c=(c_1,c_2,\cdots,c_n)',x=(x_1,x_2,\cdots,x_n)'
c=(c1,c2,⋯,cn)′,x=(x1,x2,⋯,xn)′,n是决策变量的个数。
s
.
t
.
{
A
x
≤
b
(
不等式约束
)
A
e
q
⋅
x
=
b
e
q
(等式约束)
l
b
≤
x
≤
u
b
(上下界约束,也可以当成不等式约束)
s.t.\left\{ \begin{array}{c} Ax\leq b(不等式约束)\\ Aeq·x=beq(等式约束)\\ lb\leq x\leq ub(上下界约束,也可以当成不等式约束) \end{array} \right.
s.t.⎩
⎨
⎧Ax≤b(不等式约束)Aeq⋅x=beq(等式约束)lb≤x≤ub(上下界约束,也可以当成不等式约束)
PS:可能只对部分决策变量有约束。
2. 转换标准型举例
3. M a t l a b Matlab Matlab求解线性规划的函数
[ 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 , x 0 ) [x,fval]=linprog(c,A,b,Aeq,beq,lb,ub,x_0) [x,fval]=linprog(c,A,b,Aeq,beq,lb,ub,x0)
- x 0 x_0 x0表示给定 M a t l a b Matlab Matlab迭代求解的初始值 (⼀般不⽤给)。
- c , A , b , A e q , b e q , l b , u b c,A,b,Aeq,beq,lb,ub c,A,b,Aeq,beq,lb,ub的意义和标准型中的意义⼀致。
- 若不存在不等式约束 , 可⽤" [] "替代 A A A和 b b b。
- 若不存在等式约束, 可⽤" [] "替代 A e q Aeq Aeq和 b e q beq beq。
- 若某个 x i x_i xi无下界或上界,则设置 l b ( i ) = − i n f , u b ( i ) = + i n f lb(i)=-inf,ub(i)=+inf lb(i)=−inf,ub(i)=+inf。
- 返回的 x x x表示最小值处的 x x x取值, f v a l fval fval表示表示最优解处取得的最小值。
- 不是所有的线性规划问题都有唯一解,可能无解或有无穷多的解。
- 如果求的是最大值,别忘记在最后给fval加一个负号。
2中例题的matlab求解代码
三、线性规划的典型例题
%% 生产决策问题
format long g %可以将Matlab的计算结果显示为一般的长数字格式(默认会保留四位小数,或使用科学计数法)
% (1) 系数向量
c = zeros(9,1); % 初始化目标函数的系数向量全为0
c(1) = 1.25 -0.25 -300/6000*5; % x1前面的系数是c1
c(2) = 1.25 -0.25 -321/10000*7;
c(3) = -250 / 4000 * 6;
c(4) = -783/7000*4;
c(5) = -200/4000 * 7;
c(6) = -300/6000*10;
c(7) = -321 / 10000 * 9;
c(8) = 2-0.35-250/4000*8;
c(9) = 2.8-0.5-321/10000*12-783/7000*11;
c = -c; % 我们求的是最大值,所以这里需要改变符号
% (2) 不等式约束
A = zeros(5,9);
A(1,1) = 5; A(1,6) = 10;
A(2,2) = 7; A(2,7) = 9; A(2,9) = 12;
A(3,3) = 6; A(3,8) = 8;
A(4,4) = 4; A(4,9) = 11;
A(5,5) = 7;
b = [6000 10000 4000 7000 4000]';
% (3) 等式约束
Aeq = [1 1 -1 -1 -1 0 0 0 0;
0 0 0 0 0 1 1 -1 0];
beq = [0 0]';
%(4)上下界
lb = zeros(9,1);
% 进行求解
[x fval] = linprog(c, A, b, Aeq, beq, lb)
fval = -fval
% fval =
% 1146.56650246305
PS:这题本质上应该是一个整数规划,我们的件数不应该出现小数,我们在后面的文章再来求解。
四、模型总结
⽬标函数 和 约束条件 均是决策变量的 线性表达式 , 那么 此时的 数学规划问题就属于线性规划 。
线性规划问题的求解过程如下:
- 对题目进行分析,抽离出 目标函数 以及 约束条件。
- 然后将目标函数与约束条件化成matlab标准型。
- matlab线性规划函数默认取最小值,所以当出现max时,需要将目标函数化成min,然后对最终得fval求负。
- 对于不等式约束条件同理化成小于等于形式,当极值点时,可以适当进行放缩。
- x 0 x_0 x0,即预设值在线性规划中可有可无,一般选择忽视掉,若题中给出明确的预设值则进行设置(加在matlab求解函数的最后一位)。
- 若没有不等式、等式或上下界约束条件,则在求解函数中用“[]"占位。