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

某钢管零售商从钢管厂进货,将钢管按照顾客的要求切割后售出,从钢管厂进货时得到的原料钢管都是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.

你可能感兴趣的:(matlab学习笔记)