线性规划 ( Linear Programming ,简称LP )特指目标函数和约束条件皆为线性的最优化问题。在作业研究中所面临的许多实际问题都可以用线性规划来处理,特别是某些特殊情况,例如:网路流、多商品流量等问题,都被认为非常重要。 目前已有大量针对线性规划算法的研究。 很多最优化问题算法都可以分解为线性规划子问题,然后逐一求解。
概念
线性规划问题其实一直陪伴着我们,上中学时有一类题目其实就是简单的线性规划问题。比如:A、B两件商品的利润分别为 2 元与 3 元。同时满足商品 A 的个数加商品 B 的个数不超过8个,A的个数不小于 4 个,B 的个数不大于 5 个,怎样使利润最大?
而面对这类问题时,一般是通过列方程和不等式来构造约束条件,满足线性规划问题约束条件的所有点组成的集合就是线性规划的可行域。若可行域有界,线性规划问题的目标函数最优解必然在可行域的顶点上达到最优
线性规划的一般形式:
M
a
x
(
M
i
n
)
z
=
c
1
x
1
+
c
2
x
2
+
…
+
c
n
x
n
s
.
t
.
{
a
11
x
1
+
a
12
x
2
+
…
+
a
1
n
x
n
≥
(
≤
)
b
1
a
21
x
1
+
a
22
x
2
+
…
+
a
2
n
x
n
≥
(
≤
)
b
2
…
…
a
m
1
x
1
+
a
m
2
x
2
+
…
+
a
m
n
x
n
≥
(
≤
)
b
m
Max(Min) \quad \quad z=c_1x_1+c_2x_2+\ldots+c_nx_n \\ \quad\\ s.t. \begin{cases} a_{11}x_1+a_{12}x_2+\ldots+a_{1n}x_n\geq(\leq)b_1 \\ a_{21}x_1+a_{22}x_2+\ldots+a_{2n}x_n\geq(\leq)b_2\\ \ldots\ldots \\ a_{m1}x_1+a_{m2}x_2+\ldots+a_{mn}x_n\geq(\leq)b_m \end{cases}
Max(Min)z=c1x1+c2x2+…+cnxns.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧a11x1+a12x2+…+a1nxn≥(≤)b1a21x1+a22x2+…+a2nxn≥(≤)b2……am1x1+am2x2+…+amnxn≥(≤)bm
案例解读
例题:某厂每日 8 小时的产量不低于 1800 件。为了进行质量控制,计划聘请两种不同水平的检验员。一级检验员的标准为:速度 25件/小时,正确率 98%,计时工资 4元/小时;二级检验员的标准为:速度 15件/小时,正确率 95%,计时工资 3元/小时。检验员没错检一次,工厂要损失 2 元。为使总检验费用最省,该工厂应聘一级、二级检验员各几名?
解题过程:
设需要一级、二级检验员的人数分别为
x
1
、
x
2
x_1、x_2
x1、x2 人,则应付检验员的工资为:
8
∗
4
∗
x
1
+
8
∗
3
∗
x
2
=
32
x
1
+
24
x
2
8*4*x_1+8*3*x_2=32x_1+24x_2
8∗4∗x1+8∗3∗x2=32x1+24x2
因检验员错检而造成的损失为:
(
8
∗
25
∗
2
%
∗
x
1
+
8
∗
15
∗
5
%
∗
x
2
)
∗
2
=
8
x
1
+
12
x
2
(8*25*2\%*x_1+8*15*5\%*x_2)*2=8x_1+12x_2
(8∗25∗2%∗x1+8∗15∗5%∗x2)∗2=8x1+12x2
则目标函数:
m
i
n
z
=
(
32
x
1
+
24
x
2
)
+
(
8
x
1
+
12
x
2
)
=
40
x
1
+
36
x
2
min\quad z=(32x_1+24x_2)+(8x_1+12x_2)=40x_1+36x_2
minz=(32x1+24x2)+(8x1+12x2)=40x1+36x2
约束条件:
{
8
∗
25
∗
x
1
+
8
∗
15
∗
x
2
≥
1800
8
∗
25
∗
x
1
≤
1800
8
∗
15
∗
x
2
≤
1800
x
1
≥
0
x
2
≥
0
\begin{cases} 8*25*x_1+8*15*x_2\geq 1800 \\ 8*25*x_1\leq 1800 \\ 8*15*x_2\leq 1800 \\ x_1\geq 0 \\ x_2\geq 0 \end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧8∗25∗x1+8∗15∗x2≥18008∗25∗x1≤18008∗15∗x2≤1800x1≥0x2≥0
使用 MatLab 语言
其自带一个优化函数:linprog()
%首先输入下列系数:
c = [40; 36];
A=[-5 -3];
b=[-45];
Aeq=[];
beq=[];
vlb = zeros(2, 1);
vub=[9; 15];
%然后调用linprog函数:
[x,fval] = linprog(c, A, b, Aeq, beq, vlb, vub)
结果为:
只需聘用 9 个一级检察员
而且这题需要注意的是结果必须为整数,程序得出的结果正好为整数,则不需要进行下一步的处理