某钢管零售商从钢管厂进货,将钢管按照顾客的要求切割后售出,从钢管厂进货时得到的原料钢管都是19m。
(1)现在一客户需要50根4m,20根6m,15根8m的钢管。应如何下料最省?
(2)零售商如果采用的不同切割模式太多,将会导致生产过程的复杂化,从而增加生产和管理成本,所以零售商规定采取的不同切割模式不能超过3种。此外,该客户除需要(1)中的三种钢管外,还需要10根5m的钢管。应如何下料最节省?
问题求解:
(1)建立模型之前,需要先考虑决策变量和目标函数。一根钢管有多种切割方式,难以直接从长度入手,但可以由长度的约束条件可以得到7种切割方式,并以切割方式的种类数量作为决策变量。至于目标函数,有两个,即①切割的原料钢管数最少;②余料最少。之后可建立模型,求解。
先优先考虑原料钢管数最少,再以最少的原料钢管数作为约束条件,求解余料最少的方案。
MATLAB代码:
clc
clear
G = zeros(1,4);
k1=0;k2=0;k3=0;
i = 1;
for k1 = 0:1:4
for k2 = 0:1:3
for k3 = 0:1:2
if (19-(4*k1+6*k2+8*k3)>=0) && (19-(4*k1+6*k2+8*k3)<=3)
G(i,1) = k1;G(i,2)=k2;G(i,3)=k3;
G(i,4) = 19-k1*4-k2*6-k3*8;
i=i+1;
end
end
end
end
A = zeros(3,i-1);
for ii = 1:7
for jj = 1:3
A(jj,ii) = -G(ii,jj);
end
end
b = [-50;-20;-15];
C = ones(1,7);
intcon = ones(1,7);
lb = zeros(1,7);
ub = [inf,inf,inf,inf,inf,inf,inf];
[x,fval] = intlinprog(C,intcon,A,b,[],[],lb,ub)
for i=1:7
C(i) = G(i,4);
end
Aeq = ones(1,7);
beq = 25;
[x1,fval1] = intlinprog(C,intcon,A,b,Aeq,beq,lb,ub)
解得是用钢管25根,余料35m.
(2)对切割模式进行限制,我选择在ub上对x进行限制。(用Lingo会简单一点)
clc
clear
G = zeros(1,4);
k1=0;k2=0;k3=0,k4=0;
i = 1;
for k1 = 0:1:4
for k2 = 0:1:3
for k3 = 0:1:2
for k4 = 0:1:3
if (19-(4*k1+6*k2+8*k3+5*k4)>=0) && (19-(4*k1+6*k2+8*k3+5*k4)<=3)
G(i,1) = k1;G(i,2)=k2;G(i,3)=k3;G(i,4)=k4;
G(i,5) = 19-k1*4-k2*6-k3*8-k4*5;
i=i+1;
end
end
end
end
end
A = zeros(4,i-1);
for ii = 1:i-1
for jj = 1:4
A(jj,ii) = -G(ii,jj);
end
end
b = [-50;-20;-15;-10];
C = ones(1,i-1);
intcon = 1:i-1
lb = zeros(1,i-1);
ub = zeros(1,i-1);
minf = 1000;
x1 = zeros(i-1);
for X = 1:i-1-2
for Y = X+1:i-1-1
for Z = Y+1:i-1
ub(X)=inf;ub(Y)=inf;ub(Z)=inf;
[x,fval] = intlinprog(C,intcon,A,b,[],[],lb,ub);
if minf > fval
minf = fval;
x1 = x;
end
ub(X)=0;ub(Y)=0;ub(Z)=0;
end
end
end
minf%原料钢管数
x1
for j=1:i-1
C(j) = G(j,5);
end
Aeq = ones(1,i-1);
beq = minf;
minf2 = 1000;
x2 = zeros(i-1);
for X = 1:i-1-2
for Y = X+1:i-1-1
for Z = Y+1:i-1
ub(X)=inf;ub(Y)=inf;ub(Z)=inf;
[x,fval2] = intlinprog(C,intcon,A,b,Aeq,beq,lb,ub);
if minf2 > fval2
minf2 = fval2;
x2 = x;
end
ub(X)=0;ub(Y)=0;ub(Z)=0;
end
end
end
minf2%余料
x2
输出结果原料钢管数为28根,余料34m.