线性规划研究时间较早,在实际应用中也比较成熟,它是一种辅助人们进行科学管理的数学方法,为合理地利用有限的人力、物力、财力等资源作出的最优决策,提供科学的依据。
课题名称:配货问题,使运费收入最大
现有一艘轮船,分前中后三个舱位,相应的容积与最大允许载重量如表1所示。现有一批A,B,C三种货物待运,已知相关数据如表2所示。
表1 各船舱的容积和最大载重量
前舱 | 中舱 | 后舱 | |
容积/m | 4000 | 5400 | 1500 |
最大载重量/t | 2000 | 3000 | 1500 |
表2 三种货物的相关数据
货物 | 数量/件 | 体积/(m/件) | 重量/(t/件) | 运价/(元/件) |
A | 600 | 10 | 8 | 1000 |
B | 1000 | 5 | 6 | 700 |
C | 800 | 7 | 5 | 600 |
为了保证航运安全,要求前中后舱在实际载重量上大体保持各船舱最大允许载重量的比例要求,具体要求:前后舱分别与中舱之间载重量比例上偏差不超过15%,前后舱之间不超过10%,问题是:在保证航运安全要求的条件下,轮船应装载A,B,C三种货物各多少件,使运费收入最大。
解法一:matlab解法
解:设轮船前舱应装载A,B,C三种货物各x11,x21,x31件;轮船中舱应装载A,B,C三种货物各x12,x22,x32件;轮船后舱应装载A,B,C三种货物各x13,x23,x33件;则有:
max z=1000*(x(11)+x(12)+x(13))+700*(x(21)+x(22)+x(23))+600*(x(31) +x(32)+x(33))
st.
转化为求最小问题:
min w= - 1000*(x(11)+x(12)+x(13))-700*(x(21)+x(22)+x(23))-600*(x(31)+x(32)+x(33))
st.
Matlab程序:
c=[-1000,-1000,-1000,-700,-700,-700,-600,-600,-600];
A=[10,0,0,5,0,0,7,0,0;
0,10,0,0,5,0,0,7,0;
0,0,10,0,0,5,0,0,7;
8,0,0,6,0,0,5,0,0;
0,8,0,0,6,0,0,5,0;
0,0,8,0,0,6,0,0,5;
9.2,-8,0,6.9,-6,0,5.75,-5,0;
-8, 9.2,0, -6, 6.9,0, -5, 5.75,0;
0,-8, 9.2,0, -6, 6.9,0, -5, 5.75;
0,9.2,-8,0,6.9,-6,0,5.75,-5;
-8,0,8.8,-6,0,6.6,-5,0,5.5;
8.8,0,-8,6,0,-6.6,5.5,0,-5;
1,1,1,0,0,0,0,0,0;
0,0,0,1,1,1,0,0,0;
0,0,0,0,0,0,1,1,1;];
b=[4000,5400,1500,2000,3000,1500,0,0,0,0,0,0,600,1000,800];
Aeq=[];
beq=[];
lb=[0,0,0,0,0,0,0,0,0];
ub=[];
[x,w]=linprog(c,A,b,Aeq,beq,lb,ub)
Optimization terminated.
Matlab运行结果:
x =206.7722318.227875.000000.0000000.000000150.000069.1646090.835400.000000
w =-801000
方案:
因为:z=-w,所以z=801000,即轮船前舱应装载A,B,C三种货物各207,0,69件;轮船中舱应装载A,B,C三种货物各318,0,91件;轮船后舱应装载A,B,C三种货物各75,150,0件,才能使运费收入最大且满足其他条件。
解法二:用lingo求解:
lingo程序:
model:
sets:
row/1..3/;
arrange/1..3/;
link(row,arrange):x;
endsets
max=1000*(x(1,1)+x(1,2)+x(1,3))+700*(x(2,1)+x(2,2)+x(2,3))+600*(x(3,1)+x(3,2)+x(3,3));
10*x(1,1)+5*x(2,1)+7*x(3,1)<=4000;
10*x(1,2)+5*x(2,2)+7*x(3,2)<=5400;
10*x(1,3)+5*x(2,3)+7*x(3,3)<=1500;
8*x(1,1)+6*x(2,1)+5*x(3,1)<=2000;
8*x(1,2)+6*x(2,2)+5*x(3,2)<=3000;
8*x(1,3)+6*x(2,3)+5*x(3,3)<=1500;
(8*x(1,1)+6*x(2,1)+5*x(3,1))*1.15-(8*x(1,2)+6*x(2,2)+5*x(3,2))<=0;
(8*x(1,2)+6*x(2,2)+5*x(3,2))*1.15-(8*x(1,1)+6*x(2,1)+5*x(3,1))<=0;
(8*x(1,3)+6*x(2,3)+5*x(3,3))*1.15-(8*x(1,2)+6*x(2,2)+5*x(3,2))<=0;
(8*x(1,2)+6*x(2,2)+5*x(3,2))*1.15-(8*x(1,3)+6*x(2,3)+5*x(3,3))<=0;
(8*x(1,3)+6*x(2,3)+5*x(3,3))*1.10-(8*x(1,1)+6*x(2,1)+5*x(3,1))<=0;
(8*x(1,1)+6*x(2,1)+5*x(3,1))*1.10-(8*x(1,3)+6*x(2,3)+5*x(3,3))<=0;
x(1,1)+x(1,2)+x(1,3)<=600;
x(2,1)+x(2,2)+x(2,3)<=1000;
x(3,1)+x(3,2)+x(3,3)<=800;
end
lingo运行结果:
Global optimal solution found.Objective value: 801000.0Infeasibilities: 0.000000Total solver iterations: 9Variable Value Reduced CostX( 1, 1) 206.7722 0.000000X( 1, 2) 318.2278 0.000000X( 1, 3) 75.00000 0.000000X( 2, 1) 0.000000 0.000000X( 2, 2) 0.000000 0.000000X( 2, 3) 150.0000 0.000000X( 3, 1) 69.16460 0.000000X( 3, 2) 90.83540 0.000000X( 3, 3) 0.000000 0.000000Row Slack or Surplus Dual Price1 801000.0 1.0000002 4000.000 0.0000003 5400.000 0.0000004 1500.000 0.0000005 2000.000 0.0000006 3000.000 0.0000007 1500.000 0.0000008 0.000000 938.70269 0.000000 924.958810 0.000000 954.508011 600.0000 0.00000012 1000.000 0.00000013 800.0000 0.000000
所得方案与matlab一致,即轮船前舱应装载A,B,C三种货物各207,0,69件;轮船中舱应装载A,B,C三种货物各318,0,91件;轮船后舱应装载A,B,C三种货物各75,150,0件,才能使运费收入最大且满足其他条件。
相对于matlab,Lingo在LP问题上有着极其突出的优势,操作简单,不易出错!