在中国制造 2025 目标背景之下,发展环境保护型、资源节约型的智能制造业已成为制造行业的当务之急。为了应对客户提出的各式各样的产品需求、订单组批难且产品质量
要求高的问题,使用数学模型辅助企业对定制化产品进行组批优化具有重要意义。本文通
过构建整数线性规划规划模型来对方形件组批问题进行优化,使其不仅实现了较好的板材
原片利用率,同时还对订单组批问题实现了优化。具体做法如下:
针对子问题 1:建立了板材原片的切割方式、产品项(item)、栈(stack)、条带(stripe)、产品位置、生产订单需求等众多因素的一个全局 0-1 线性规划模型,以板材原片使用数量最少作为目标函数。在建立模型的过程中,参考了文献【3】中的整数线性规划模型,但该模型存在着产品位置不可旋转的问题,板材利用率有待提高。为此,本文所建立的模型
中着重考虑了产品可以旋转的情况,极大的提高了板材原片的利用率。该模型变量复杂度较高,计算量大。在编写算法过程中,通过本文建立的模型对子问题1中的四个数据表格进行排样优化。在优化之前,本文通过matlab对dataA1~dataA4的数据进行预处理,计算出每个数据理论上最少的板材原片数量,分别是:84、83、84、82。通过本文建立的全局0-1 线性规划模型进行优化,得出优化后的板材原片使用数量分别是:89、88、88、87,dataA1~dataA4 的板材原片利用率分别是:94.382%、94.318%、95.455%、94.253%,其中四个数据表中单块板材原片利用率最高为99.213%、99.145%、99.228%、99.460%,最低为73.304%、72.618%、78.760%、74.682%。
针对子问题 2:本题是订单组批优化问题。首先建立了一个以订单分批效率最高为目标函数的整数线性规划模型,通过引入一个不同订单相同材质的相关系数,本文称之为组
批系数,该模型大大提高了订单组批的效率。在此模型的基础之上,又建立了一个以同批
次内板材利用率最高为目标函数的 0-1 线性规划模型。进一步实现组批内的板材原片利用率最高。此时,在满足子问题1中的所有目标和约束条件的前提下,要求相同的订单下的产品必须在同一批次中,同一批次中的相同材质的产品项可以排样在同一块板材原片上,
同时在生产过程中批次的生产的产品数量和产品项面积总和有上限要求。通过建立的模型算法对本题进行求解,计算出了 dataB1~dataB5 的每个数据中订单的组批次分别是:37、24、23、26、38。每个数据所使用板材原片数量分别是:3632、2292、2425、2538、3892。数据集B中dataB1~dataB5的板材原片的利用率分别为:82.217%、81.745%、80.028%、80.297%、84.421%。
最后,本文所建立的整数线性规划模型使用了7n2+n个决策变量,该模型的复杂度为O(n2)。
关键词:方形件组批优化,全局0-1线性规划模型,整数线性规划模型
一、问题重述
1.1 问题背景
在中国制造 2025 和碳中和、碳达峰的目标背景之下,发展环境保护型、资源节约型的智能制造业已成为制造行业的当务之急。目前企业在智能制造转型的竞争中主要围绕个性化产品定制、系统生命周期、互联互通的服务模式等方面。与此同时,制造业的劳动成本也在不断的升高,生产企业一方面需要降低生产成本,另一方面还要提高生产效率和精细化,在此过程中必然会依赖于机械设备来制造生产各式各样的需求。为了应对客户的个性化定制的拂去需求,企业需要具有高效快速的需求分析及产品设计能力、具有柔性且精益的生产流程、具有完整且精细的全流程生产管控能力。尤其在大批量生产中,即使是对原材料利用率有十分微小的差异,材料的总用量也会有明显的变化。因此想要有效的提高企业的经济效益,关键在于如何降低生产成本,由于原材料费用在生产成本中所占比重较大,因此如何优化下料,并最大限度的提高原材料的利用率是当前很多企业急需解决的重要问题。
根据板材切割工艺的方式可以分为齐头切和非齐头切,齐头切工艺可以细分为精确方式与非精确方式。由切割的阶段数可在三阶段排样方式中分为三种不同的类型:三阶段非精确(3NE)排样方式、三阶段匀质排样方式(3E)、三阶段同质排样方式(3H)。其中3E和3H排样方式可在三个阶段内切割出准确的方形件,因此属于精确排样方式,而3NE排样方式有时需要额外的第四阶段切割才能满足方形件的尺寸要求,因此属于非精准排样方式。
以三阶段切割方式为例,阶段数是指在切割过程中,将板材以垂直于长边或垂直于短边的方向切割生成条带(strip)称之为第一阶段,以垂直于第一阶段切割方向将各个条带切割出多个栈(stack)的方式称为第二阶段,同理以垂直于第二阶段切割方向将各个栈切割出多个产品(item)的方式称为第三阶段。三阶段排样方式示意图如图1所示。
图1 三阶段排样方式示意图
1.2 问题提出
根据附件提供的信息,包括产品的尺寸、编号、材质和订单号,以及目标要求和约束条件建立完整的数学模型,根据模型设计求解算法,解决以下两个问题:
子问题1:排样优化问题
根据题目要求建立混合整数规划模型,给不同的产品项进行排版布局,从而实现板材原片使用最少的目标,该问题约束条件为:
1.在相同栈里的产品项的宽度(或长度)应该相同;
2.最终切割生成的产品项是完整的,非拼接而成。
子问题2:订单组批问题
要求建立混合整数规划模型,通过建立相应的模型对数据集B中所有的订单进行组批,然后对每个批次进行单独排样,在满足子问题1的约束条件下,使得板材原片用量尽可能少。本问题在满足问题1约束的基础上进一步要求:
1.同一批次中每份订单有且只能出现一次;
2.同一批次中的相同材质的产品项才能使用同一块板材原片进行排样; 3.为保证加工环节快速流转,每个批次产品项总数不能超过1000; 4.因工厂产能限制,每个批次产品项的面积总和不能超过250m 2。
二、模型假设与符号说明
2.1 模型假设
假设1:所有订单的交货期相同
假设2:只考虑齐头切割方式;
假设3:订单任务全部完成且不含任何不完整订单任务;
假设4:板材的切割阶段数不超过3,处于同一阶段的切割方向一致;
假设5:排样方式为精确排样,即为均质排样方式(3E)和同质排样方式(3H); 假设6:板材原片仅有一种规格且数量充足;
假设7:排样方案不用考虑锯缝宽度影响。
2.2 符号说明
指标:
符号 | 含义 |
i j k l A B ia ib iA iB Q | 第i个产品项 第j个栈 第k个条带 第l个板块 板材原片的原始长度 板材原片的原始宽度 第i件产品项的原始长度 第i件产品项的原始宽度 第i件产品项进行旋转之后的长度 第i件产品项进行旋转之后的宽度 一个无穷大的数 |
三、子问题的1分析与求解
3.1 子问题1的分析
本题为排样优化问题,最终实现的目的是板材利用率达到最高,即所有排版的产品项的面积之和比上所使用板材原片面积的比值最大。进一步可以理解为所使用的板材数量尽快能的少。因此,本文针对子问题1建立以使用的板材数量最少为目标函数。
本题假定了一些限制条件,包括切割方式、切割阶段、排版样式等相关因素。首先,在本题中只需要考虑齐头切割方式,所谓齐头切割可以理解为是“一刀切”,即每次切割的线条都是直线并且切割的方向都是垂直于板材的一条边,最重要的是要保证每一次切割都需要将板材可以分开成两个部分。其次,板材的切割阶段数不能超过 3,并且处于同一阶段的切割方向必须相同。本题还要求排样的方式是精确排样,精确排样主要有两中类型:三阶段匀质排样方式(3E)和三阶段同质排样方式(3H)。其中匀质排样方式是指在一个相同的栈中存在着具有相同边的不同产品项;而同质排样方式是指在相同的栈中的所有产品都是相同尺寸的产品。本题中也不考虑锯缝宽度所带来的误差。
子问题1 中的附件数据集 A 中包括了4 个数据表格,分别是 dataA1~dataA4。对数据进行建模分析之前,首先需要将每一文件中的数值抓取出来。由于文件中给出的数据是统一格式,因而直接利用 Matlab 软件读取.csv 文件,对其进行处理,将其中的 item_length和item_width列进行预处理,对这两列进行取最小值(min)和最大值(max)的处理,分别作为 min 列和 max 列对原表进行整理,并将 max 列作为条件进行降序排序,排序的结果形式如表1所示:
表1 原始表格预处理
序号 | item_id | item_num | item_length | item_width | min | max |
1 | 235 | 1 | 2418 | 58 | 58 | 2418 |
2 | 356 | 1 | 2418 | 58 | 58 | 2418 |
3 | 542 | 1 | 2418 | 58 | 58 | 2418 |
4 | 723 | 1 | 2416 | 38 | 38 | 2416 |
5 | 765 | 1 | 2398 | 393 | 393 | 2398 |
6 | 113 | 1 | 2398 | 328 | 328 | 2398 |
7 | 25 | 1 | 2398 | 299 | 299 | 2398 |
8 | 170 | 1 | 2393 | 38 | 38 | 2393 |
9 | 115 | 1 | 2388 | 558 | 558 | 2388 |
10 | 73 | 1 | 2388 | 98 | 98 | 2388 |
11 | 304 | 1 | 2368 | 328 | 328 | 2368 |
12 | 61 | 1 | 2367 | 218 | 218 | 2367 |
13 | 212 | 1 | 2353 | 328 | 328 | 2353 |
14 | 588 | 1 | 2353 | 58 | 58 | 2353 |
15 | 48 | 1 | 2353 | 38 | 38 | 2353 |
16 | 8 | 1 | 2348 | 630 | 630 | 2348 |
17 | 9 | 1 | 2348 | 558 | 558 | 2348 |
18 | 479 | 1 | 2338 | 588 | 588 | 2338 |
19 | 758 | 1 | 2334.5 | 311 | 311 | 2334.5 |
… | … | … | … | … | … | … |
89 | 87 | 1 | 177 | 197.5 | 177 | 197.5 |
其次,本文先将表格中所有的产品的面积之和求出来,其中dataA1,dataA2,dataA3,dataA4 的所有产品的面积之和分别为:248685614.6、246700070.9、249244736.8、243659621.7;之后题目中确定了板材原片的长度2440mm和宽度1220mm,求出板材原片的面积为 2976800。通过所有产品的面积来确定每一文件所需要原片的极限数量,通过所
有产品面积除以板材原片的面积分别求出了每一文件的最节省的板材数量,所使用最省的板材原片的数量分别为84、83、84、82。通过数据的预处了可以求出理论上的极限最省板材原片的数量。所以在之后的建模求解过程中不断的进行优化,使得最终求解出的板材数量尽可能的接近理论值,如表2所示。
表2 理想情况下板材原片使用数量及利用率
数据表 | data A1 | data A2 | data A3 | data A4 |
所有产品项的总面积 | 248685614.6 | 246700070.9 | 249244736.8 | 243659621.7 |
板材原片的面积 | 250051200 | 247074400 | 250051200 | 244097600 |
理论最少板材原片所需数量 | 84 | 83 | 84 | 82 |
理论板材原片最大利用率 | 99.45% | 99.85% | 99.68% | 99.82% |
通过对附件中的数据进行分析发现,所有的产品项都属于个性定制的类型,每一个产品的数量均是1个。由此,首先考虑的是采用三阶段匀质排样方式(3E),分析题目可以得出,本题是下料优化问题,也称排样优化问题。根据同一生产批次内方形件的尺寸与数量,选择原片的规格和数量,进行下料排样优化,得到最大化板材原片利用率。
本文从每一个产品作为分析题目的出发点,首先由多个相同长度或者宽度的产品项(item)组合成一个栈(Stack),之后由多个宽度或长度相同的栈组成一个条带(Stripe)。最后通过拼接条带使其满足长度和宽度均不超过原片的长度和宽度。同时允许在拼接的过程中存在冗余,即可包含以下废料,通过这种思路找到板材面积利用率最大的切割方式,最终求出最优解,子问题1的思路框图如图2。
若干产品组合成 | 若干栈组成若干 | 寻找利用率最高 | 将利用率高的条 |
若干栈 | 条带 | 的条带 | 带组合成板材 | |
组合栈后的长度<= | 组合条带的宽度<= | |||
板材的原始宽度 | ||||
板材的原始长度 |
图2 子问题1寻找最优排样方式思路框图
3.2 全局0-1线性规划模型的建立
针对子问题建立的全局 0-1 线性规划模型的建立,本文参考了【文献 3】的带约束条件下的整数线性规划模型。【文献 3】中所建立的模型中并未考虑到产品件可以进行旋转排样,仅仅保持产品件按照固定长宽进行排样。本文重点考虑了产品件可以旋转的情况,在原模型的基础之上进行改进,原模型结果和改进结果如图3,4所示。
%% 测试
clear
clc
% H = [640 1800 500 700];
% W = [1220 520 700 1300];
B = [300 420 420 500 500 1180];
A = [2440 1740 700 800 400 500];
r = [1 1 1 1 1 1 1];
[~,Z] = aa(A,B);
[~,Z,r] = bb(A,B);
%% 绘图
nig = length(B);
IO1 = cell(nig,9);
Id_SIN = unique(Z(:,1));
for LON = Id_SIN(:)'
figure, patch([0 1220 1220 0 0],[0 0 2440 2440 0],'white')
hold on, axis('equal','off')
X0 = 0;
Y0 = 0;
Z_Sin = Z(Z(:,1) == LON,:);
id_tiao = unique(Z_Sin(:,2));
for k = id_tiao(:)'
a0 = 0;
Z_tiao = Z_Sin(Z_Sin(:,2) == k,:);
id_zhan = unique(Z_tiao(:,3));
for jaa = id_zhan(:)'
Z_zhan = Z_tiao(Z_tiao(:,3) == jaa,:);
Cc = rand(1,3);
for m = 1:size(Z_zhan,1)
id_chanpin = Z_zhan(m,4);
r_i = r(id_chanpin);
b_i = B(id_chanpin);
a_i = A(id_chanpin);
A_i = a_i*r_i+b_i*(1-r_i);
B_i = b_i*r_i+a_i*(1-r_i);
IO1{id_chanpin,2} = find(Id_SIN == LON);
IO1{id_chanpin,4} = X0;
IO1{id_chanpin,5} = Y0;
IO1{id_chanpin,6} = B_i;
IO1{id_chanpin,7} = A_i;
IO1{id_chanpin,8} = X0+B_i;
IO1{id_chanpin,9} = Y0+A_i;
X = [X0 X0+B_i X0+B_i X0 X0];
Y = [Y0 Y0 Y0+A_i Y0+A_i Y0];
patch(X,Y,Cc,'FaceAlpha',0.5)
Y0 = Y0+A_i;
end
X0 = max(cell2mat(IO1(Z_zhan(:,4),8)));
Y0 = min(cell2mat(IO1(Z_zhan(:,4),5)));
z0 = max(cell2mat(IO1(Z_zhan(:,4),9)));
a0 = max([z0 a0]);
end
X0 = 0;
Y0 = a0;
end
end
%%函数
function [num_tt,R,A,B] = aa(A,B)
%%
A = A(:)';
B = B(:)';
na = length(A);
Is = eye(na);
a_max = 2440;
b_max = 1220;
idx_1a = 0*na^2+1:1*na^2;
idx_2b = 1*na^2+1:2*na^2;
idx_3c = 2*na^2+1:3*na^2;
na_vars = 3*na^2;
%%
ff = zeros(1,na_vars);
for l1 = 1:na
ff_la = kron(Is(l1,:),Is(l1,:));
ff(idx_3c) = ff(idx_3c)+ff_la;
end
%%
Hs_naeq = cell(1,0); Hs_eq = cell(1,0);
Ws_nAeq = cell(1,0); Ws_eq = cell(1,0);
%%
Aa_eq = zeros(na,na_vars);
for ia1 = 1:na