精彩文章免费看

【数学建模算法】(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.模型建立

设原油 A 的购买量为 x (单位:吨)。根据题目所给数据,采购的支出 c(x) 可表示为如下的分段线性函数(以下价格以千元/吨为单位)
设原油 A 用于生产甲,乙两种汽油的数量分别为 x_{1 1}x_{1 2} ,原油 B 用来生产两种汽油的数量分别是 x_{2 1}x_{2 2} ,则总的输入为 4.8\left(x_{11}+x_{21}\right)+5.6\left(x_{12}+x_{22}\right) (千元)。于是本例的目标函数(利润)为:
(此处 c(x) 代表一个非线性分段函数)
约束条件包括两种汽油用的原油 AB 的库存限制,原油 A 购买量的限制,原油 A 的比例限制。

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吨原油 A ,与库存的500吨原油A与1000吨原油B一起,共产生2500吨汽油乙,利润为5000(千元)。

(2)解法二
引入0-1变量 z_{1},z_{2},z_{3}

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

(3)解法三
直接处理分段线性函数 c(x)
x 处于第一个小区间 \left[b_{1}, b_{2}\right] ,记 x=w_{1} b_{1}+w_{2} b_{2}w_{1}+w_{2}=1, \quad w_{1}, w_{2} \geq 0 因为 c(x)\left[b_{1}, b_{2}\right] 上是线性的。
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));