MATLAB程序——钢管下料问题(优化问题)

某钢管零售商从钢管厂进货,将钢管按照顾客的要求切割后售出,从钢管厂进货时得到的原料钢管都是19m。
(1)现在一客户需要50根4m,20根6m,15根8m的钢管。应如何下料最省?
【MATLAB程序——钢管下料问题(优化问题)】(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 endA = zeros(3,i-1); for ii = 1:7 for jj = 1:3 A(jj,ii) = -G(ii,jj); end endb = [-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 endA = zeros(4,i-1); for ii = 1:i-1 for jj = 1:4 A(jj,ii) = -G(ii,jj); end endb = [-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%原料钢管数 x1for 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.

    推荐阅读