某钢管零售商从钢管厂进货,将钢管按照顾客的要求切割后售出,从钢管厂进货时得到的原料钢管都是19m。
- 现有一客户需要50根4m,20根6m,15根8m的钢管,应该如何切割配料最省?
- 零售商如果采用的不同的切割模式太多,将会导致生产过程的复杂化,从而增加生产和管理成本,所以零售商规定采用的不同的切割模式不能超过3种。此外,该客户除了需要(1)中的三种钢管外,还需要10根5m的钢管,应该如何切割配料最省?
问题求解:
- 首先明确优化模型中的决策变量和目标函数。一根钢管有多种切割方案,直接从长度有困难,但可以由长度的约束条件规划出有限种可行的切割方式,再以切割方式的种类数量作为决策变量。然后其决策有两大目标函数,第一优化目标为原料钢管最省目标,第二优化目标为余料最省目标,即①切割的原料钢管数最少;②余料最少。之后可建立模型,求解。先优先考虑原料钢管数最少,再以最少的原料钢管数作为约束条件,求解余料最少的方案。
- 在增加切割子对象的基础上还需要对进行决策优化的参与每一种总方案的切割方式的种类及数量进行限制。在MATLAB中进行限制就是限制决策变量的上限ub。
- MATLAB中变量说明以及数学模型中变量说明
- pipe_4(i),pipe_6(i),pipe_8(i),pipe_5:分别表示第i种可行的切割方式中在一根源钢管上切割成4m,6m,8m,5m的钢管的根数。在数学模型中用r(i),s(i),t(i),u(i)表示。
- K:表示所有的切割方式的总数。
- Cutways(j):表示第j种切割方式所切割的原钢管的根数。在数学模型中用x(i)表示。
- Totalpipenumber:表示切割的总的原钢管的总根数,是本题的第一优化目标。在数学模型中用T表示。
- Excess(i):第i种切割方式所剩余的余料。在数学模型中用e(i)表示。
- Totalexcess:总的余料长度,为本题的第二优化目标。在数学模型中用TE表示。
- 建立模型
- 对于第一问建立数学多目标线性规划模型如下:
第二问的数学模型如下:
- 模型求解
- MATLAB代码如下:
clc;%清空命令行
clear;%清除工作空间内容
G = zeros(1,4);%创建1*4的矩阵存储各种切割方式的三种钢管的根数以及余料量
pipe_4=0;pipe_6=0;pipe__8=0;%为三种钢管根数初始设置一个初始值。
i = 1;
%进行各个符合条件的切割方式进行遍历搜素并列举出来
for pip_4 = 0:1:4
for pipe_6 = 0:1:3
for pipe__8 = 0:1:2
if (19-(4*pip_4+6*pipe_6+8*pipe__8)>=0) && (19-(4*pip_4+6*pipe_6+8*pipe__8)<=3)
G(i,1) = pip_4;G(i,2)=pipe_6;G(i,3)=pipe__8;
G(i,4) = 19-pip_4*4-pipe_6*6-pipe__8*8;
i=i+1;
end
end
end
end
%将钢管切割方式存储变量G存储方式进行变形使得符合MATLAB整数规划函数要求的求解最小值的形式
A = zeros(3,i-1);
for ii = 1:7
for jj = 1:3
A(jj,ii) = -G(ii,jj);
end
End
%进行MATLAB运用intlinprog函数求解本问题最优解。
b = [-50;-20;-15];
C = ones(1,7);
intcon = ones(1,7);
lb = zeros(1,7);
ub = [inf,inf,inf,inf,inf,inf,inf];
[cutways,fval] = intlinprog(C,intcon,A,b,[],[],lb,ub)%cutways表示各种切割方式所切割的原钢管的根数,fval表示总原钢管根数
%在前面已经求得最少原钢管根数的前提条件下进行余料最少的目标线性优化
for i=1:7
C(i) = G(i,4); %C(i)为第i钟分配方式的余料量
end
Aeq = ones(1,7);
beq = 25;
[finalcutways,fval1] = intlinprog(C,intcon,A,b,Aeq,beq,lb,ub)%finalcutways表示各种切割方式所切割的原钢管的根数,fval表示总原钢管根数
(2)
clc;%清空命令行
clear;%清除工作空间内容
G = zeros(1,5);%创建1*5的矩阵存储各种切割方式的四种钢管的根数以及余料量
pipe_4=0;pipe_6=0;pipe__8=0;pipe_5=0;
i = 1;
%进行各个符合条件的切割方式进行遍历搜素并列举出来
for pipe_4= 0:1:4
for pipe_6 = 0:1:3
for pipe_8 = 0:1:2
for ppe_5 = 0:1:3
if (19-(4*pipe_4+6*pipe_6+8*pipe_8+5*ppe_5)>=0) && (19-(4*pipe_4+6*pipe_6+8*pipe_8+5*ppe_5)<=3)
G(i,1) = pipe_4;G(i,2)=pipe_6;G(i,3)=pipe_8;G(i,4)=ppe_5;
G(i,5) = 19-pipe_4*4-pipe_6*6-pipe_8*8-ppe_5*5;
i=i+1;
end
end
end
end
end
%将钢管切割方式存储变量G存储方式进行变形使得符合MATLAB整数规划函数要求的求解最小值的形式
A = zeros(4,i-1);
for ii = 1:i-1
for jj = 1:4
A(jj,ii) = -G(ii,jj);
end
end
%进行MATLAB运用intlinprog函数求解本问题最优解。
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;%只有三种切割方式数量不为零,其余都为0
[x,fval] = intlinprog(C,intcon,A,b,[],[],lb,ub);%求解当任意三种切割方式组合时候最优目标解
if minf > fval%保存最小目标解在minf变量中。
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%余料
- 结果
- 解得是用钢管25根,余料35m.
可行的切割方式 | 4m | 6m | 8m | 余料 | 最终最优解 |
1 | 0 | 0 | 2 | 3 | 0 |
2 | 0 | 3 | 0 | 1 | 0 |
3 | 1 | 1 | 1 | 1 | 10 |
4 | 1 | 2 | 0 | 3 | 0 |
5 | 2 | 0 | 1 | 3 | 5 |
6 | 3 | 1 | 0 | 1 | 10 |
7 | 4 | 0 | 0 | 3 | 0 |
- 输出结果原料钢管数为28根,余料34m.
可行的切割方式 | 4m | 6m | 8m | 5m | 余料 | 最终最优解 |
1 | 0 | 0 | 1 | 2 | 1 | 0 |
2 | 0 | 0 | 2 | 0 | 3 | 8 |
3 | 0 | 1 | 0 | 2 | 3 | 0 |
4 | 0 | 1 | 1 | 1 | 0 | 0 |
5 | 0 | 2 | 0 | 1 | 2 | 0 |
6 | 0 | 3 | 0 | 0 | 1 | 0 |
7 | 1 | 0 | 0 | 3 | 0 | 0 |
8 | 1 | 0 | 1 | 1 | 2 | 0 |
9 | 1 | 1 | 1 | 0 | 1 | 0 |
10 | 1 | 2 | 0 | 0 | 3 | 0 |
11 | 2 | 0 | 0 | 2 | 1 | 0 |
12 | 2 | 0 | 1 | 0 | 3 | 0 |
13 | 2 | 1 | 0 | 1 | 0 | 10 |
14 | 3 | 0 | 0 | 1 | 2 | 0 |
15 | 3 | 1 | 0 | 0 | 1 | 10 |
16 | 4 | 0 | 0 | 0 | 3 | 0 |