钢管下料问题
某钢管零售商从钢管厂进货,将钢管按照顾客的要求切割后售出,从钢管厂进货时得到的原料钢管都是19m。
(1)现在一客户需要50根4m、20根6m和15根8m的钢管。应如何下料最节省?
(2) 零售商如果采用的不同切割模式太多,将会导致生产过程的复杂化,从而增加生产和管理成本,所以该零售商规定采用的不同切割模式不能超过3种。此外,该客户除需要(1)中的三种钢管外,还需要10根5m的钢管。应如何下料最节省。
问题(1)分析与模型建立
首先分析1根19m的钢管切割为4m、6m、8m的钢管的模式,所有模式相当于求解不等式方程:
4k1?6k2?8k3?1 9的整数解。但要求剩余材料r?19?(4k1?6k2?8k3)?4。 容易得到所有模式见表1。
表1 钢管切割模式 模式 1 2 3 4 5 6 7 决策变量 用xi表示按照第i种模式(i=1,2,…,7)切割的原料钢管的根数。
以切割原料钢管的总根数最少为目标,则有
minz?x1?x2?x3?x4?x5?x6?x7 约束条件 为满足客户的需求,4米长的钢管至少50根,有
4m 4 3 2 0 0 1 1 6m 0 1 0 0 3 1 2 8m 0 0 1 2 0 1 0 余料(m) 3 1 3 3 1 1 3 4x1?3x2?2x3?x6?x7?5 0 6米长的钢管至少20根,有 x2?3x5?x6?2x7?20 8米长的钢管至少15根,有 x3?2x4?x6?15 因此模型为:
minz?x1?x2?x3?x4?x5?x6?x7
?4x1?3x2?2x3?x6?x7?50?x?3x?x?2x?20?2567s..t? ?x3?2x4?x6?15??xi取整,i?1,2,?,7解得:
x1?0,x2?12,x3?0,x4?0,x5?0,x6?15,x7?0
目标值z=27。
即12根钢管采用切割模式2:3根4m,1根6m,余料1m。
15根钢管采用切割模式6:1根4m,1根6m,1根8m,余料1m。 切割模式只采用了2种,余料为27m,使用钢管27根。
LINGO程序:
model: sets:
model/1..7/:x; endsets
min=x(1)+x(2)+x(3)+x(4)+x(5)+x(6)+x(7); 4*x(1)+3*x(2)+2*x(3)+x(6)+x(7)>=50; x(2)+3*x(5)+x(6)+2*x(7)>=20; x(3)+2*x(4)+x(6)>=15; @for(model(i):@gin(x(i))); end
问题(2)模型建立
首先分析1根19m的钢管切割为4m、6m、8m、5m的钢管的模式,所有模式相当
于求解不等式方程:
4k1?6k2?8k3?5k4?1 9的整数解。但要求剩余材料r?19?(4k1?6k2?8k3)?4。
利用Matlab程序求出所有模式见表2。
求出所有模式的Matlab程序: number=0; for k1=0:4 for k2=0:3 for k3=0:2 for k4=0:3
r=19-(4*k1+6*k2+8*k3+5*k4); if(r>=0)&(r<4)
number=number+1;
fprintf('- - - - - -\\n',number,k1,k2,k3,k4,r); end
end end end end
表2 钢管切割模式 模式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 决策变量 用xi表示按照第i种模式(i=1,2,…,16)切割的原料钢管的根数。
4m 0 0 0 0 0 0 1 1 1 1 2 2 2 3 3 4 6m 0 0 1 1 2 3 0 0 1 2 0 0 1 0 1 0 8m 1 2 0 1 0 0 0 1 1 0 0 1 0 0 0 0 5m 2 0 2 1 1 0 3 1 0 0 2 0 1 1 0 0 余料(m) 1 3 3 0 2 1 0 2 1 3 1 3 0 2 1 3 决策目标 以切割原料钢管的总根数最少为目标,则有 minz2??x
ii?116 设第i种切割模式下4米长的钢管ai根,6米长的钢管bi根,8米长的钢管ci根,5米长的钢管di根。则约束条件有:
为满足客户的需求,4米长的钢管至少50根,有
?axi?11616ii?50
6米长的钢管至少20根,有
?bxi?1ii?20
8米长的钢管至少15根,有
?cxi?11616ii?15
5米长的钢管至少10根,有
?dxi?1ii?10
为实现最多使用3种切割模式,增设0-1变量yi,i?1,2,?,16。
当yi?0时,xi?0,表示不使用第i种切割模式;当yi?1时,xi?1,表示使用第i种切割模式。因此有:
xi?yi,xi?M.yi,i?1,2,?,16 其中M足够大,如这里取100。
?yi?116i?3
因此模型为:
minz??xi
i?116?16??aixi?50?i?1?16??bixi?20?i?1?16??cixi?15?i?1?16??dixi?10s..t?i?1?xi?M.yi,i?1,2,?,16??xi?yi,i?1,2,?,16?16??yi?3?i?1?x取整,i?1,2,?,16?i?yi?0或1,i?1,2,?,16??M足大
解得:
当所用钢管z最少时,求得的解为:
x2?8,x13?10,x15?10,其余为0。
目标值z=28。
即8根钢管采用切割模式2:2根8m,余料3m。
10根钢管采用切割模式13:2根4m,1根6m,1根5m,余料为0。 10根钢管采用切割模式15:3根4m,1根6m,余料1m。 切割模式采用了3种,余料为34,使用钢管z=28根。
LINGO程序为: model:
sets:
model/1..16/:a,b,c,d,r,x,y; endsets data:
a=0,0,0,0,0,0,1,1,1,1,2,2,2,3,3,4; b=0,0,1,1,2,3,0,0,1,2,0,0,1,0,1,0; c=1,2,0,1,0,0,0,1,1,0,0,1,0,0,0,0; d=2,0,2,1,1,0,3,1,0,0,2,0,1,1,0,0; r=1,3,3,0,2,1,0,2,1,3,1,3,0,2,1,3; enddata min=z;
z1=@sum(model(i):r(i)*x(i));!余料;
z=@sum(model(i):x(i));!钢管总数;
@sum(model(i):a(i)*x(i))>=50;!4米长钢管约束; @sum(model(i):b(i)*x(i))>=20;!6米长钢管约束; @sum(model(i):c(i)*x(i))>=15;!8米长钢管约束; @sum(model(i):d(i)*x(i))>=10;!5米长钢管约束; @for(model(i):x(i)>=y(i)); @for(model(i):x(i)<=1000*y(i)); @sum(model(i):y(i))<=3; @for(model(i):@gin(x(i))); @for(model(i):@bin(y(i))); end