实验目的:
通过实验,掌握线性规划问题的求解过程。建立模型后,可以用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份且至少一份. 在满足要求的前提下, 制订费用最少的一周菜单方案.
(3)某航空公司每天有三个航班服务于A, B, C, H四个城市,其中城市H是可供转机使用的, 三个航班的出发地-目的地分别为AH, HB, HC,可搭乘旅客的最大数量分别为120人, 100人, 110人, 机票的价格分头等舱和经济舱两类. 经过市场调查, 公司销售部得到了每天旅客的相关信息, 见表1. 该公司应该在每条航线上分别分配多少头等舱和经济舱的机票?
实验步骤:
使用Lingo求解,
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~6号物品,价值达到38。
使用贪心算法MATLAB程序,求得,
1 function y=beibao(product,weight,value) 2 fprintf('请输入数据(product,weight,value): '); 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
使用Lingo求解,
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
解得:购买3份胡萝卜,4份花菜,2份卷心菜,2份芹菜,3份土豆所花费用20.2元最少。
使用Lingo求解,
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
解得,在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更为友好。