数据建模 - 用单纯形法解决LP问题

    线性规划研究时间较早,在实际应用中也比较成熟,它是一种辅助人们进行科学管理的数学方法,为合理地利用有限的人力、物力、财力等资源作出的最优决策,提供科学的依据。

课题名称:配货问题,使运费收入最大

   现有一艘轮船,分前中后三个舱位,相应的容积与最大允许载重量如表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.7722
    318.2278
    75.00000
    0.000000
    0.000000
    150.0000
    69.16460
    90.83540
    0.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.0
  Infeasibilities:                                 0.000000
  Total solver iterations:                               9

                       Variable           Value          Reduced Cost
                       X( 1, 1)        206.7722            0.000000
                       X( 1, 2)        318.2278            0.000000
                       X( 1, 3)        75.00000            0.000000
                       X( 2, 1)        0.000000            0.000000
                       X( 2, 2)        0.000000            0.000000
                       X( 2, 3)        150.0000            0.000000
                       X( 3, 1)        69.16460            0.000000
                       X( 3, 2)        90.83540            0.000000
                       X( 3, 3)        0.000000            0.000000

                            Row       Slack or Surplus       Dual Price
                              1           801000.0              1.000000
                              2           4000.000              0.000000
                              3           5400.000              0.000000
                              4           1500.000              0.000000
                              5           2000.000              0.000000
                              6           3000.000              0.000000
                              7           1500.000              0.000000
                              8           0.000000              938.7026
                              9           0.000000              924.9588
                             10           0.000000              954.5080
                             11           600.0000              0.000000
                             12           1000.000              0.000000
                             13           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问题上有着极其突出的优势,操作简单,不易出错!


猜你喜欢

转载自blog.csdn.net/weixin_40683253/article/details/80984874