实验目的:

  通过实验,掌握线性规划问题的求解过程。建立模型后,可以用Lingo软件求解,也可以用MATLAB软件求解,了解MATLAB和Lingo在求解线性规划问题中的不同之处。

实验要求:

要有建模过程。

实验内容:  

  (1)背包问题,某人打算外出旅游并登山, 路程比较远, 途中要坐火车和飞机, 考虑要带许多必要的旅游和生活用品, 如照相机, 摄像机, 食品, 衣服, 雨具, 书籍等, 共8件物品, 重量分别为1, 3, 4,3, 3, 1, 5, 10 (千克), 而受航空行李重量限制以及个人体力所限, 能带的行李总重量为15 千克, 8件物品的总重量超过了15千克, 需要裁减, 该旅行者为了决策带哪些物品, 对这些物品的重要性进行了量化, 价值分别为2, 9, 3, 8, 10, 6, 4, 10, 试建立该问题的数学模型.

 

  (2)配料问题,某疗养院营养师要为某类病人拟订本周蔬菜类菜单, 当前可供选择的蔬菜品种, 价格和营养成分含量, 以及病人所需养分的最低数量见表1所示. 病人每周需14份蔬菜, 为了口味的原因, 规定一周内的卷心菜不多于2份, 胡萝卜不多于3份, 其他蔬菜不多于4份且至少一份. 在满足要求的前提下, 制订费用最少的一周菜单方案.

  

线性规划问题 python 线性规划问题生活实例_贪心算法

 

 

 

(3)某航空公司每天有三个航班服务于A, B, C, H四个城市,其中城市H是可供转机使用的, 三个航班的出发地-目的地分别为AH, HB, HC,可搭乘旅客的最大数量分别为120人, 100人, 110人, 机票的价格分头等舱和经济舱两类. 经过市场调查, 公司销售部得到了每天旅客的相关信息, 见表1. 该公司应该在每条航线上分别分配多少头等舱和经济舱的机票?

  

线性规划问题 python 线性规划问题生活实例_MATLAB_02

 

 

 实验步骤:

  

线性规划问题 python 线性规划问题生活实例_贪心算法_03

 

 

   使用Lingo求解,

线性规划问题 python 线性规划问题生活实例_线性规划问题 python_04

线性规划问题 python 线性规划问题生活实例_贪心算法_05

1 MODEL:
 2 SETS:
 3 WP/W1..W8/:A,C,X;
 4 ENDSETS
 5 DATA:
 6 A=1,3,4,3,3,1,5,10;
 7 C=2,9,3,8,10,6,4,10;
 8 ENDDATA
 9 MAX=@SUM(WP(I):C(I)*X(I));
10 @SUM(WP(I):A(I)*X(I))<=15;
11 @FOR(WP(I):@BIN(X(I)));
12 END

题1_Lingo  

线性规划问题 python 线性规划问题生活实例_MATLAB_06

 

 

解得,该人带1~6号物品,价值达到38。

  使用贪心算法MATLAB程序,求得,

 

线性规划问题 python 线性规划问题生活实例_线性规划问题 python_04

线性规划问题 python 线性规划问题生活实例_贪心算法_05

1 function y=beibao(product,weight,value)
 2 fprintf('请输入数据(product,weight,value):\n');
 3 product=input('product=');
 4 weight=input('weigth=');
 5 value=input('value=');
 6 Total_value=0;
 7 Total_weight=15;
 8 j=1;
 9 len=length(product);
10 %chanpin_N=zeros(len);
11 %chanpin_W=zeros(len);
12 %chanpin_V=zeros(len);
13 for i=1:len
14     Total_value=Total_value+value(i);
15     Total_weight=Total_weight-weight(i);
16     if Total_weight<0
17         Total_value=Total_value-value(i);
18         Total_weight=Total_weight+weight(i);
19     else
20         chanpin_N(j)=product(i);
21         chanpin_W(j)=weight(i);
22         chanpin_V(j)=value(i);
23         j=j+1;
24     end
25 end
26 disp('输出对应装入背包的产品号')
27 chanpin_N
28 disp('输出装入产品后背包总重量')
29 sum(chanpin_W)
30 disp('输出装入产品后背包总重量')
31 sum(chanpin_V)
32 end

题1_MATLAB

 

  

线性规划问题 python 线性规划问题生活实例_贪心算法_09

 

 

 

线性规划问题 python 线性规划问题生活实例_线性规划问题 python_10

 

 

   使用Lingo求解,

线性规划问题 python 线性规划问题生活实例_线性规划问题 python_04

线性规划问题 python 线性规划问题生活实例_贪心算法_05

1 model:
 2 sets:
 3 r/1..6/:a,x;
 4 l/1..5/:b;
 5 links(r,l):c;
 6 endsets
 7 data:
 8 a=2.1,1.0,1.8,1.2,2.0,1.2;
 9 b=6,125,12500,345,5;
10 c=0.45,20,415,22,0.3,
11 0.45,28,4065,5,0.35,
12 0.65,40,850,43,0.6,
13 0.4,25,75,27,0.2,
14 0.5,26,76,48,0.4,
15 0.5,75,235,8,0.6;
16 enddata
17 min=@sum(r(I):a(I)*x(I));
18 0<x(1);x(1)<4;
19 0<x(3);x(3)<4;
20 0<x(5);x(5)<4;
21 0<x(6);x(6)<4;
22 1<x(2);x(2)<3;
23 1<x(4);x(4)<2;
24 @sum(r(I):x(I))=14;
25 @for(l(J):@sum(r(I):c(I,J)*x(I))>b(J));
26 @for(r(I):@gin(x(I)));
27 end

题2_Lingo  

线性规划问题 python 线性规划问题生活实例_MATLAB_13

 

 

解得:购买3份胡萝卜,4份花菜,2份卷心菜,2份芹菜,3份土豆所花费用20.2元最少。

 

线性规划问题 python 线性规划问题生活实例_贪心算法_14

 

   使用Lingo求解,

线性规划问题 python 线性规划问题生活实例_线性规划问题 python_04

线性规划问题 python 线性规划问题生活实例_贪心算法_05

1 MODEL: 
 2 TITLE 机票销售计划; 
 3 SETS:     
 4     route /AH,AB,AC,HB,HC/:a,b,p,q,x,y; 
 5 ENDSETS 
 6 DATA: 
 7 a p b q= 
 8     33 190 56 90 
 9     24 244 43 193 
10     12 261 67 199 
11     44 140 69 80 
12     16 186 17 103 ; 
13 c1 c2 c3 = 120 100 110; 
14 ENDDATA 
15 [obj] Max = @SUM(route: p*x+q*y ); 
16 [AH] @SUM(route(i)|i#ne#4#and#i#ne#5:x(i)+y(i)) < c1; 
17 [HB] @SUM(route(i)|i#eq#2#or#i#eq#4:x(i)+y(i))  < c2; 
18 [HC] @SUM(route(i)|i#eq#3#or#i#eq#5:x(i)+y(i))  < c3; 
19 @FOR(route: @bnd(0,x,a);@bnd(0,y,b) ); 
20 END

题3_Lingo  

线性规划问题 python 线性规划问题生活实例_MATLAB_17

 

解得,在AH航线33张头等舱,0张经济舱;AB航线10张头等舱,0张经济舱;AC航线12张头等舱,65张经济舱;HB航线44张头等舱,46张经济舱;HC航线103张头等舱,17张经济舱。当时,最优解中AB路线路上的头等舱需求并没有全部满足。

 

小结:

对于上述的三个问题,使用Lingo求解更为简单。在使用MATLAB自带的linprog()或者intlinprog()函数,都遇到了问题,总会出现Problem is unbounded.只能退而求其次,使用贪心算法或者动态规划求解了。所以,在解这一类题目,Lingo较之MATLAB更为友好。

 

【zlc】