【数学建模算法】(5)整数规划应用实例:生产与销售计划问题
之前的几篇番外,我们介绍了运筹学软件Lingo的用法,之后对于规划问题的处理,如无特殊说明,均视为采用Lingo求解。
例1 生产与销售问题
某公司用两种原油( A 和 B )混合加工成两种汽油(甲和乙)。甲、乙两种汽油含原油的最低比例分别为 50%和 60%,每吨售价分别为 4800 元和 5600 元。该公司现有原油 A 和 B 的库存量分别为 500 吨和 1000 吨,还可以从市场上买到不超过 1500吨的原油 A 。原油 A 的市场价为:购买量不超过 500 吨时的单价为 10000 元/吨;购买量超过 500 吨单不超过 1000 吨时,超过 500 吨的部分 8000 元/吨;购买量超过 1000 吨时,超过 1000 吨的部分 6000 元/吨。该公司应如何安排原油的采购和加工。1.问题分析
安排原油采购、加工的目标是利润最大,题目中给出的是两种汽油的售价和原油 A的采购价,利润为销售汽油的收入与购买原油 A 的支出之差。这里的难点在于原油 A 的采购价与购买量的关系比较复杂,是分段函数关系,能否及如何用线性规划、整数规划模型加以处理是关键所在。
2.模型建立
设原油
max=4.8*(y(1)+y(2))+5.6*(y(3)+y(4))-@sum(var2:c*x); y(1)+y(3)<@sum(var2:x)+500; y(2)+y(4)<1000; 0.5*(y(1)-y(2))>0; 0.4*y(3)-0.6*y(4)>0; (x(1)-500)*x(2)=0; (x(2)-500)*x(3)=0; @for(var2:@bnd(0,x,500)); data: c=10 8 6; enddata的购买量为
(单位:吨)。根据题目所给数据,采购的支出
可表示为如下的分段线性函数(以下价格以千元/吨为单位)
设原油用于生产甲,乙两种汽油的数量分别为
和
,原油
用来生产两种汽油的数量分别是
和
,则总的输入为
(千元)。于是本例的目标函数(利润)为:
(此处代表一个非线性分段函数)
约束条件包括两种汽油用的原油,
的库存限制,原油
购买量的限制,原油
的比例限制。
运行得到全局最优解:购买1000吨原油
,与库存的500吨原油A与1000吨原油B一起,共产生2500吨汽油乙,利润为5000(千元)。
(2)解法二
max=4.8*(y(1)+y(2))+5.6*(y(3)+y(4))-@sum(var2:c*x); y(1)+y(3)<@sum(var2:x)+500; y(2)+y(4)<1000; 0.5*(y(1)-y(2))>0; 0.4*y(3)-0.6*y(4)>0; @for(var1(i)|i #lt# 3:500*z(i+1)<x(i);x(i)<500*z(i)); x(3)<500*z(3); @for(var2:@bin(z)); @for(var2:@bnd(0,x,500)); data: c=10 8 6; enddata
引入0-1变量![]()
(3)解法三
直接处理分段线性函数。
当处于第一个小区间
,记
,
因为
在
上是线性的。
max=4.8*(y(1)+y(2))+5.6*(y(3)+y(4))-@sum(var:c*w); y(1)+y(3)<@sum(var:b*w)+500; y(2)+y(4)<1000; 0.5*(y(1)-y(2))>0; 0.4*y(3)-0.6*y(4)>0; w(1)<z(1); @for(var(i)|i #ne# 1:w(i)<z(i-1)+z(i)); @sum(var:z)=1; @sum(var:w)=1; @for(var:@bin(z));