线性规划
1、所有线性规划问题化成matlab中规定的标准形式:
f, x, b, beq, lb, ub为列向量,其中f为价值向量,b为资源向量,A,Aeq为矩阵。
2、linprog函数
上述对应Matlab中的求解命令为:
[x,fval] = linprog(f,A,b)
[x,fval] = linprog(f,A,b,Aeq,beq)
[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub)
x返回决策向量的取值;fval返回目标函数的最优值;f为价值向量;
A、b对应不等式约束
Aeq和beq对应线性等式约束
lb和ub分别对应决策向量的下界和上界
3、Easy example:
m a x z = 2 x 1 + 3 x 2 − 5 x 3 , { 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\ z=2x_1+3x_2-5x_3,\\ \begin{cases} x_1+x_2+x_3=7,\\ 2x_1-5x_2+x_3 ≥ 10,\\ x_1+3x_2+x_3≤12,\\ x_1,x_2,x_3≥0 \end{cases} max z=2x1+3x2−5x3,⎩ ⎨ ⎧x1+x2+x3=7,2x1−5x2+x3≥10,x1+3x2+x3≤12,x1,x2,x3≥0
①化为matlab标准型:
m
i
n
w
=
−
2
x
1
−
3
x
2
+
5
x
3
,
(
−
2
5
−
1
1
3
1
)
(
x
1
x
2
x
3
)
≤
(
−
10
12
)
,
[
1
,
1
,
1
]
⋅
[
x
1
,
x
2
,
x
3
]
T
=
7
,
[
x
1
,
x
2
,
x
3
]
T
≥
[
0
,
0
,
0
]
T
min\ w = -2x_1-3x_2+5x_3,\\ \left(\begin{matrix} -2 & 5 & -1\\ 1 & 3 & 1 \end{matrix}\right) \left(\begin{matrix} x_1\\x_2\\x_3 \end{matrix}\right)≤ \left(\begin{matrix} -10\\12 \end{matrix}\right),\\ \left[1,\ 1,\ 1\right]\cdot{\left[x_1,\ x_2,\ x_3\right]}^T=7,\\ {\left[x_1,\ x_2,\ x_3\right]}^T≥[0,\ 0,\ 0]^T
min w=−2x1−3x2+5x3,(−2153−11)
x1x2x3
≤(−1012),[1, 1, 1]⋅[x1, x2, x3]T=7,[x1, x2, x3]T≥[0, 0, 0]T
>> f=[-2;-3;5]; % 价值向量
>> a=[-2,5,-1;1,3,1]; % a、b对应不等式的左边和右边
>> b=[-10;12];
>> aeq=[1,1,1]; % aeq和beq对应等式的左边和右边
>> beq=7;
>> [x,y]=linprog(f,a,b,aeq,beq,zeros(3,1));
Optimal solution found.
>> x % x=[x1;x2;x3]最优解
x =
6.4286
0.5714
0
>> y=-y % 最优值(该题所求为max,但linprog函数求得的是min,故只需加个-)
y =
14.5714
4、example2:
某架货机有三个货舱:前仓、中仓、后仓。三个货舱所能装载的货物的最大重量和体积都有限制,如表2所示。并且,为了保持飞机的平衡,三个货舱中实际装载货物的重量必须与其最大容许重量成比例。
现有四类货物用该货机进行装运:
货物规格及利润表
假设:
(1)每种货物可以无限细分
(2)每种货物可以分布在一个或者多个货舱内
(3)不同的货物可以放在同一个货舱内,并且可以保证不留空隙
问:应如何装运,使货机飞行利润最大?
解:
用 i = 1,2,3,4表示货物1、2、3、4;用 j =1,2,3表示前舱、中仓、后仓。
设
x
i
j
表示第
i
种货物在第
j
个货舱内的重量
,
w
j
和
v
j
表示可以运输的第
j
个舱的重量限制和提及限制
,
a
i
,
b
i
,
c
i
表示
第
i
种货物的重量,单位重量所占的空间体积
,
单位货物的利润。
设x_{ij}表示第i种货物在第j个货舱内的重量,w_j和v_j表示可以运输的第j个舱的重量限制和提及限制,a_i,b_i,c_i表示\\第i种货物的重量,单位重量所占的空间体积,单位货物的利润。
设xij表示第i种货物在第j个货舱内的重量,wj和vj表示可以运输的第j个舱的重量限制和提及限制,ai,bi,ci表示第i种货物的重量,单位重量所占的空间体积,单位货物的利润。
(1)目标函数:
z
=
c
1
∑
j
=
1
3
x
1
j
+
c
2
∑
j
=
1
3
x
2
j
+
c
3
∑
j
=
1
3
x
3
j
+
c
4
∑
j
=
1
3
x
4
j
=
∑
i
=
1
4
c
i
∑
j
=
1
3
x
i
j
z=c_1\sum_{j=1}^{3}{x_{1j}}+c_2\sum_{j=1}^{3}{x_{2j}}+c_3\sum_{j=1}^{3}{x_{3j}}+ c_4\sum_{j=1}^{3}{x_{4j}}=\sum_{i=1}^{4}{c_i}\sum_{j=1}^{3}{x_{ij}}
z=c1j=1∑3x1j+c2j=1∑3x2j+c3j=1∑3x3j+c4j=1∑3x4j=i=1∑4cij=1∑3xij
(2)约束条件:
① 四种货物的重量约束:
∑
j
=
1
3
x
i
j
≤
a
i
,
i
=
1
,
2
,
3
,
4
\sum_{j=1}^{3}{x_{ij}}≤a_i\ ,i=1,2,3,4
j=1∑3xij≤ai ,i=1,2,3,4
② 三个货舱的重量限制:
∑
i
=
1
4
x
i
j
≤
w
j
,
j
=
1
,
2
,
3
\sum_{i=1}^{4}{x_{ij}}≤w_{j}\ ,j=1,2,3
i=1∑4xij≤wj ,j=1,2,3
③ 三个货舱的体积限制:
∑
i
=
1
4
b
i
x
i
j
≤
v
j
,
j
=
1
,
2
,
3
\sum_{i=1}^{4}{b_ix_{ij}}≤v_{j}\ ,j=1,2,3
i=1∑4bixij≤vj ,j=1,2,3
④ 三个货舱的平衡限制:
∑
i
=
1
4
x
i
1
10
=
∑
i
=
1
4
x
i
2
16
=
∑
i
=
1
4
x
i
3
8
\frac{\sum_{i=1}^{4}{x_{i1}}}{10}=\frac{\sum_{i=1}^{4}{x_{i2}}}{16}= \frac{\sum_{i=1}^{4}{x_{i3}}}{8}
10∑i=14xi1=16∑i=14xi2=8∑i=14xi3
综上,建立线性规划模型:
m
a
x
z
=
∑
i
=
1
4
c
i
∑
j
=
1
3
x
i
j
{
∑
j
=
1
3
x
i
j
≤
a
i
,
i
=
1
,
2
,
3
,
4
∑
i
=
1
4
x
i
j
≤
w
j
,
j
=
1
,
2
,
3
∑
i
=
1
4
b
i
x
i
j
≤
v
j
,
j
=
1
,
2
,
3
∑
i
=
1
4
x
i
1
10
=
∑
i
=
1
4
x
i
2
16
=
∑
i
=
1
4
x
i
3
8
max\ z=\sum_{i=1}^{4}{c_i}\sum_{j=1}^{3}{x_{ij}}\\ \begin{cases} \sum_{j=1}^{3}{x_{ij}}≤a_i\ ,i=1,2,3,4\\ \sum_{i=1}^{4}{x_{ij}}≤w_{j}\ ,j=1,2,3\\ \sum_{i=1}^{4}{b_ix_{ij}}≤v_{j}\ ,j=1,2,3\\ \frac{\sum_{i=1}^{4}{x_{i1}}}{10}=\frac{\sum_{i=1}^{4}{x_{i2}}}{16}= \frac{\sum_{i=1}^{4}{x_{i3}}}{8} \end{cases}
max z=i=1∑4cij=1∑3xij⎩
⎨
⎧∑j=13xij≤ai ,i=1,2,3,4∑i=14xij≤wj ,j=1,2,3∑i=14bixij≤vj ,j=1,2,310∑i=14xi1=16∑i=14xi2=8∑i=14xi3
% 目标函数
c=[3100;3800;3500;2850]; % 由目标函数可知有12个变量
c=c*ones(1,3); % 使c变成4行3列,对应目标函数未知量前面的系数
c=c(:); % c每列合并成一个长的列向量
% 约束条件1,需要构造如下数组
a1=zeros(4,12);
for i=1:4
a1(i,i:4:12)=1;
end
b1=[18 15 23 12]';
% 约束条件2
a2=zeros(3,12);
for i=1:3
a2(i,4*i-3:4*i)=1;
end
b2=[10 16 8]';
% 约束条件3
bb=[480;650;580;390];
a3=zeros(3,12);
for i=1:3
a3(i,4*i-3:4*i)=bb;
end
b3=[6800 8700 5300]';
a=[a1;a2;a3];
b=[b1;b2;b3];
%----------------------------
% 等式条件
aeq=zeros(2,12);
aeq(1,1:4)=1/10;
aeq(1,5:8)=-1/16;
aeq(2,5:8)=1/16;
aeq(2,9:12)=-1/8;
beq=[0;0];
lb=zeros(12,1);
[x,y]=linprog(-c,a,b,aeq,beq,lb,[])
x=reshape(x,[4,3]) % 化为3*4的数组
x=sum(x') % 舱1,2,3分别放入货物的总重量
y=-y;
y =
-1.2152e+05
x =
0 0 0
7.0000 0 8.0000
3.0000 12.9474 0
0 3.0526 0
x =
0 15.0000 15.9474 3.0526
答: 求得的四种货物的吨数分别为 0, 15 ,15.9474 ,3.0526
总利润为 1.2152×10^5元。