说明:linprog一般用来求解线性最优化问题(目标函数和约束条件均为线性)。
【例1】生产决策问题。某厂生产甲、乙两种产品,已知制成一吨产品甲需用A资源3吨,B资源4m3;制成一吨产品乙需用A资源2吨,B资源6m3,C资源7个单位。若一吨产品甲和乙的经济价值分别为7万元和5万元,三种资源的限制量分别为90吨、200m3和210个单位。试应生产这两种产品各多少吨才能使创造的总经济价值最高?
解:资源耗费如表4-1所示
表4-1 生产BOM表
|
A(吨) |
B(m3) |
C(个) |
甲 |
3 |
4 |
0 |
乙 |
2 |
6 |
7 |
总资源量 |
90 |
200 |
210 |
设生产甲x1吨,乙x2吨,由已知条件有:
化为标准型有:
应用Matlab的linpro工具求解过程如下:
主程序:
f=[-7,-5];
A=[3,2;4,6;0,7];
b=[90;200;210];
Aeq=[];beq=[];
lb=zeros(2,1);ub=[];
[x,z,exitflag,output,lambda]=linprog(f,A,b,Aeq,beq,lb,ub)
解得:
x =
14.0000
24.0000
z =
-218.0000
即生产甲14吨,乙24吨可使得利润最大为218万元。
exitflag =
1
output =
iterations: 5
algorithm: 'interior-point'
cgiterations: 0
message: 'Optimization terminated.'
constrviolation: 0
firstorderopt: 4.3909e-07
lambda =
ineqlin: [3x1 double]
eqlin: [0x1 double]
upper: [2x1 double]
lower: [2x1 double]
【例2】投资问题。某单位有一批资金用于4个工程项目的投资,各工程项目所得的净收益(投入资金的百分比)如表4-2所示。由于某种原因,决定用于项目A的投资不大于其他各项投资之和;而用于项目B和C 的投资要大于项目D 的投资。试确定使该单位收益最大的投资分配方案。
表4-2 工程项目收益表
工程项目 |
A |
B |
C |
D |
收益(%) |
15 |
10 |
8 |
12 |
解:设用x1、x2、x3、x4分别代表用于项目A,B,C,D的投资比例,则有线性规划:
用Matlab的linprog工具求解该线性规划。
主程序:
f=-[15 10 8 12];
A=[1 -1 -1 -1;0 -1 -1 1];
b=zeros(2,1);
Aeq=ones(1,4);
beq=1;
lb=zeros(4,1);
ub=ones(4,1);
[x,z,exitflag,output]=linprog(f,A,b,Aeq,beq,lb,ub)
解得
x =
0.5000
0.2500
0.0000
0.2500
z =
-13.0000
即A,B,C,D分别投资50%,25%,0%,25%时收益最大为13%。
exitflag =1
output =
iterations: 8
【例3】在某建筑工程施工中需要制作10000套钢筋,每套钢筋由2.9m、2.1m和1.5m三种不同长度的钢筋各一根组成,它们的直径和材质不同。目前在市场上采购到的同类钢筋的长度每根均为7.4m,问应购进多少根7.4m长的钢筋才能满足工程的需要?
首先分析共有多少种不同的套裁方法,该问题的可能材料方案如表4-3所示。
表4-3 材料方案表
下料长度(m) |
裁料方案编号i |
|||||||
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
2.9 |
2 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
2.1 |
0 |
2 |
1 |
0 |
3 |
2 |
1 |
0 |
1.5 |
1 |
0 |
1 |
3 |
0 |
2 |
3 |
4 |
料头长度(m) |
0.1 |
0.3 |
0.9 |
0 |
1.1 |
0.2 |
0.8 |
1.4 |
S.t.
Aeq*x=beq
其中,f为系数矩阵,x为变量,x=[x1,…,x8],Aeq为等式约束系数矩阵,beq为右端值。
用matlab的linprog求解该问题。
fun005.m
clc
f=ones(1,8);
A=[];b=[];
Aeq=[2 1 1 1 0 0 0 0
0 2 1 0 3 2 1 0
1 0 1 3 0 2 3 4];
beq=10000*ones(3,1);
lb=zeros(8,1);ub=[];
x=linprog(f,A,b,Aeq,beq,lb,ub);
%以下部分是为了进行整数规划,因为7.4米的钢筋不可能卖半根。
for i=1:8
if abs(x(i)-fix(x(i)))<1e-4
x(i)=fix(x(i)); %截断取整,即舍去小数部分
else x(i)=ceil(x(i)); %向上取整 如ceil(3.08)=4
i=i+1;
end
end
x
total=sum(x) %求和
解得:
x =[2253 3748 0 1748 0 1253 0 0]'
total =9002
因此至少需要9002根7.4m长的钢筋,方案一2253根,方案二3748根,方案四1748根,方案六1253根,其它方案不用。
说明:我们看到采用的方案1,2,4,6的料头长度(浪费的)分别为0.1、0.3、0、0.2,而不采用的方案3,5,7,8的料头长度分别为0.9、1.1、0.8、1.4,浪费程度远大于所采用方案的,这从现实意义上佐证了我们线性规划的科学性和必要性。
【例4】工作人员计划安排问题
某昼夜服务的公共交通系统每天各时间段(每4小时为一个时间段)所需的值班人数如表4-4所示,这些值班人员在某一时段开始上班后要连续工作8个小时(包括轮流用膳时间),问该公交系统至少需要多少名工作人员才能满足值班的需要?
表4-4 各时段所需值班人数表
班次 |
时间段 |
所需人数 |
1 |
6:00—10:00 |
60 |
2 |
10:00—14:00 |
70 |
3 |
14:00—18:00 |
60 |
4 |
18:00—22:00 |
50 |
5 |
22:00—2:00 |
20 |
6 |
2:00—6:00 |
30 |
设xi为第i个时段开始上班的人员数,据题意建立下面的数学模型:
需要对前面六个约束条件进行形式变换,是不等式为非正不等式。只需要在不等式两侧取负即可。
fun006.m
clear
clc
f=ones(1,6);
A=-[1 0 0 0 0 1
1 1 0 0 0 0
0 1 1 0 0 0
0 0 1 1 0 0
0 0 0 1 1 0
0 0 0 0 1 1];
b=-[60;70;60;50;20;30];
Aeq=[];beq=[];
lb=zeros(6,1);
ub=[];
x=round(linprog(f,A,b,Aeq,beq,lb,ub))%四舍五入
total=sum(x)
解得
x =[42 28 35 15 10 20]’
total =150
exitflag = 1
所以,6个时段分别安排42、28、35、15、10、20人即可满足值班需求,供需150人。计算正常收敛。
说明:本题目的近似方法为四舍五入法(认为工作人员正常情况下都没有完全发挥能力),不同于例3的严格朝正无穷方向取整(因为对工程材料而言,失之毫厘谬以千里,因此必须给与足够的安全系数)。