方形件排样优化与订单组批问题是计算复杂度很高的组合优化问题,在工业工程中有很广泛的应用背景。为实现个性化定制生产模式,企业会选择订单组批的方式,继而通过排样优化实现批量切割,加工完成后再按照不同客户需求进行分拣,从而提高原材料的利用率,进而降低生产成本,提高企业竞争力。
本文以二维方形件的排样优化及订单组批为对象,充分考虑各种约束条件,对两个问题分别建立混合整数规划模型,合理规划方形件在板材原片上的布局,整体协调订单分配与批量计划的集成优化,最终取得全局近似最优解。
针对问题一:优化目标是基于三阶段齐头切精确排样方式,在各产品项数量均不超过其需求量的约束下实现使用的板材原片数量最少。我们转“割”为“拼”,采用“均匀栈的生成→条带生成→原片条带放置”的步骤,设计了均匀三阶段排样方式的生成算法(TUSP 法)得到满足条件的排样图。之后采用顺序价值修正启发式算法(SVC 法),逐个将满足条件的排样图加入到整个数据的排样方案中进行优化,最终得到基于整个数据的最优排样方案,得到A1~A4数据集的板材利用率依次为96.02%、94.08%、95.15%和94.08%。根据获得的各产品项的x、y方向坐标及度量,绘制各原片的排样方案效果图。
针对问题二:优化目标是通过订单组批的形式将订单聚类,并按照材质选择相应的排样方式,进而实现使用的板材原片数量最少。本问题的关键在于订单组批,后续排样过程可参考问题一。首先使用杰拉德距离定义了订单之间材质的相似性,以此作为层次聚类的依据,从而划分项目的组批。其次,对同一批次中的不同材质,依次对产品项使用均匀三阶段排样方式的生成算法(TUSP法) 和顺序价值修正启发式算法(SVC法) 获得最终的排样方案,得到B1~B5数据集的板材利用率依次为84.42%、82.84%、82.11%、83.44%和83.51%,并根据排样方案中产品项的坐标等信息绘制各原片的排样方案效果图。
最后,本文对所用算法的复杂度进行了评估,同时对模型的优缺点进行了分析。
关键词:混合整数规划模型; 均匀三阶段排样方式的生成算法; 顺序价值修正启发式算法:订单组批:层次聚类
一、 问题重述
1.1问题背景
新时期我国经济发展面临的重大课题,即是实现由制造大国向制造强国的转变,其中智能制造又是“中国制造 2025”的主攻方向。企业若想在智能制造转型中获取竞争优势,则需要在个性化定制方面提高竞争力。面对层出不穷的客户需求,如何在把控产品质量的同时预测订单规模,以便可以及时做出响应,就成为企业需要思考的问题。
方形件产品(或称板式类产品) 即为依赖于个性化定制生产模式的一类产品,它以板材为主要原片,经过平面加工后,由几种板式配件装配而成。为了实现“多品种小批量”的个性化定制生产,面对数量庞大的订单,企业通常会通过订单组批的方式来实现批量切割,加工完成后再按照不同客户需求进行分拣,从而提高原料的利用率[11-[3]。
在上述“订单组批+批量生产+订单分拣”模式中,订单组批与排样优化为两个重要环节。订单组批就是将相同材质、相近交货期、相似工艺的订单安排在同一个生产批次,通过订单组批优化兼顾个性化需求与生产高效性(如组批批次太小,会造成材料利用率低与生产效率低:如组批批次太大,会影响生产效率从而影响订单交付);排样优化本质为一个面向客户订单的材料切割问题,需要合理规划方形件在板材上的布局,以达到降低板材浪费、简化切割过程的目的。
对于排样优化问题,根据切割工艺方式的不同可分为齐头切与非齐头切(齐头切即直线切割且切割方向垂直于一边,并保证每次切割都可将原片分为两块),齐头切又可分为精确方式与非精确方式(区别在于是否可切割出准确尺寸的方形件) 。三阶段齐头切主要有三种类型:三阶段非精确排样方式、三阶段匀质排样方式以及三阶段同质排样方式,后两种均为精确排样方式。基本经过三到四个阶段的切割即可满足客户需求。
1.2 问题提出
基于对订单组批与排样优化的理解,题目提出以下2个子问题,其中第2个子问题的约束都基于第1个子问题并增加了单个批次生产原片数和面积的限制:
问题一:排样优化问题。只考虑齐头切的切割方式且切割阶段数不超过3的精确排样,建立混合整数规划模型[4],在满足订单需求及相关约束条件下,达到原片的最大化利用。
需要考虑的约束条件如下:
1) 在相同栈( stack) 里的产品项( item) 的宽度(或长度) 应该相同;
2) 最终切割生成的产品项是完整的,非拼接而成。
问题二:订单组批问题。要求建立混合整数规划模型,对数据集B中全部的订单进行组批,然后对每个批次进行独立排样,在满足订单需求和相关约束条件下,使得板材原片的用量尽可能少。在满足子问题1约束的基础上进一步要求:
1) 每份订单当且仅当出现在一个批次中;
2) 每个批次中的相同材质的产品项( item) 才能使用同一块板材原片进行排样;
3) 为保证加工环节快速流转,每个批次产品项( item) 总数不能超过限定值:
4) 因工厂产能限制,每个批次产品项( item) 的面积总和不能超过限定值。
二、 问题分析
2.1问题一分析
问题一需要建立混合整数规划模型得出三阶段齐头切精确排样方案,该方案由排样方式组成,排样方式为该排样优化问题的解。对于三阶段切割方式,要求同一阶段切割方向相同,相邻阶段切割方向互相垂直,我们并不限制第一阶段的切割方向,横向或纵向皆可,并称第一阶段切割生成的模块为 stripe(条带),第二阶段切割生成的模块成为 stack(栈),第三阶段切割生成的模块为 item(产品项)。实际应用中,产品项方向可以是固定的,也可以是旋转的,为了更贴近实际情况,我们考虑产品项方向可旋转。产品项的价值一般为其面积,且会赋予面积大的产品项一个较大的权重,以便优先考虑其放置。
排样方式必须满足:(1) 产品项的个数不超过需求量; (2) 排入的产品项之间互不重叠且不超过原片边界:(3) 满足题目要求的三阶段齐头切精确排样方式。
本问题建立在三阶段匀质排样的基础上,即认为每个栈都由一组宽度相同的产品项组成,对比于三阶段同质排样,匀质排样的材料利用率可能会更高,但切割复杂度也会随之增加。
根据待切割的产品项的种类和数量,确定产品项在原片上的排列组合方式,在满足产品项数量与工艺约束的条件下,减少原材料的损耗。此排样优化问题可描述为:在尺寸为L×W的原片上寻找最佳排样方案,排入 n种产品项,其中第 i 项产品项的长、宽及需求量为 l×wi×di,∑'j=1αν=1,∇i=1,⋯,2ni∈I=1⋯n, 需要使消耗的原片成本最低,且排样方式需符合切割工艺要求。
本问题的优化目标是在各产品项数量均不超过其需求量的约束下实现原片中包含的产品项总价值最大,可以将目标设定成以板材用量最少,另一种角度是使残料最少。尽管追求板材用量最少与追求残料最少的实现方式是一致的,但后者方法的灵敏度较差,最终可能会导致无解:且对于残料,如果其尺寸足够大,就可以成为余料二次利用,所以实际问题中考虑残料最少并不合理。
2.2问题二分析
问题二需要建立混合整数规划模型,对数据集B1~B5中全部的订单进行组批,并对每个批次进行独立排样,在满足订单需求和相关约束条件下,使得板材原片的用量尽可能少。该方案由组批方式组成,组批方式为该子问题的解。
组批方式必须满足:(1) 每份订单当且仅当出现在一个批次中; (2) 每个批次可生产的产品项总数不超过上限; (3) 每个批次可生产的产品项面积总和不超过上限。
订单组批问题是一个NP完全问题,求其精确解是比较困难的。模型的优化目标是最小化板材原片使用数量,可以考虑在组批过程中尽量将使用同种材质的订单放在同一批次,这样同一批次中相同材料的产品项种类和数量也越多,在之后的排样过程中,也更容易得
到更高的板材使用率,从而达到目标。所以该子问题的关键就转为寻求一个合适的差异度函数来度量订单间的相似程度,在此基础上对订单进行聚类,最终生成分批后的订单。后续排样过程与第一问类似,可按照第一问的思路进行排样优化。
三、模型假设
假设1:本题假定排样优化方式为三阶段齐头切匀质排样,且产品项作为切割的最小单位需保持完整;
假设2:本题假定第一阶段切割方向为横向的排样方式为X向排样,第一阶段切割方式为纵向的排样方式为Y 向排样:
假设3:本题假定板材原片仅有一种规格,即原片长度为2440( mm),原片宽度为1220( mm), 且原片数量充足;
假设4:本题假定排样方案不受锯缝宽度影响:
假设5:本题假定在切割过程中不存在设备故障、生产事故:
假设6:本题假定所有订单的交货期均相同,即订单组批问题不考虑交货期因素:
假设7:订单包含的产品项的种类和数量满足某种随机分布:
假设8:一个订单仅可组批一次,且不能跨批次组批;
假设9:批次与批次之间不会互相交叉混合。
四、符号说明
本文所用符号的说明如下表所示。
指标:
符号 说明
i 产品项编号的指标,对n个产品项按宽度进行排序 w1≥w2≥≥wn,
即产品项1,产品项2,……,产品项n将宽度不增,其中 i∈I=1⋯n
j 栈编号的指标,将栈中所含产品项中宽度最大的产品项编号作为栈的编
号,其中 j∈J=1⋯n
k 条带编号的指标,将条带中所含栈的最宽栈的编号作为条带编号,其中
k∈K
l 原片编号的指标,将原片中所含条带的最小索引作为原片编号,其中
l∈L
输入参数: | |
符号 | 说明 |
L | 原片长度(单位: mm) |
w | 原片宽度(单位: mm) |
五、问题一:模型建立与求解
5.1整数规划模型建立
根据题目要求建立整数规划模型[8]-[10]如下:
对于问题一,可以理解成有约束条件的三阶段二维装箱问题。装箱问题就是我们有 n 个小矩形,以及无限个大矩形箱子,目标是将全部小矩形无重叠的放入箱子中,小矩形放入箱子的方向可以旋转,水平垂直均可。三阶段切割可以理解:1、沿第一个方向齐头切割后,将矩形切割成几个条带,2、沿第二个方向齐头切割后,将条带切割成几个栈,3、沿第三个方向齐头切割后,将栈切割为产品项。显然,由同一个栈切割得到的几个产品项具有相同的宽度。为统一规则,便于切割,我们将矩形尽量放置于大矩形箱子的左下位置,使得如果必须存在剩余空间的话,剩余空间位于右上位置。由于几个产品项组成一个栈后被放置于大矩形箱子内,故产品项排列的前后顺序对栈在大矩形箱子内的摆放位置并无影响,我们可以将同一个栈内的几个产品项按照产品项的索引从小到大排列,便于后续处理。产品项组成栈后,我们可以获得一定数量的栈,栈组成条带与产品项组成栈类似,同一条带内栈的排序也可以前后调整。对栈进行编号索引,类似的,我们也可以在条带内将不同的栈按照索引顺序从小到大排列。这种排序方法有利于后续我们得到每个产品项在大矩形箱子的位置。最后再将条带放置于大矩形箱子内,找到最好的放置方式使得只需要尽可能少的箱子数即可放置下全部条带。
针对产品项可旋转,我们考虑将n个产品项复制一份,并将其长宽互调,得到了2n个产品项,并进一步按照产品项的宽度进行排序,这时使用两个映射f和g,f表示目前排序下产品项对应为复制前的该产品项索引编号,g表示产品项和其复制品的索引编号差。
其中l₀和w₀表示产品项k的长度和宽度,lmin(i)和 wmin(i)表示产品项i到m的产品项长度最小值和宽度最小值。这时在判断能否继续向栈排入产品项时,仅需将 lmin(i)和 wmin(i)分别与剩余长度和剩余宽度比较即可, 这大大减少了算法了计算复杂度。
产品项已经耗尽:
注:对于此终止条件,我们仍考虑建立一个一维数组 demand 对每个产品项的剩余量进行记录,这是再判断某产品项是否有剩余可排入栈时,仅需与 demand(i)进行对比即可。
初始化 demand数组:demand(i)表示产品项i在栈中排入的限制数量,令其初值等于产品项的初始需求,其赋值计算表达式如下:
demand(i)=d(i), i=1,…,m. (20)
其中d(i)表示产品项的初始需求。
Step2. 算法建立过程
在将产品项排入栈的过程中,需要对生成的栈的信息进行存储,我们考虑建立一个一维数组向量对栈j的信息存储,向量构建如下:
|
其中w表示此栈的放置方式,w='h'表示水平放置, w='v'表示竖直放置,二元数组(i,num,)中,i表示产品项的编号,numn表示此产品项在栈中排入的次数。
在得到栈的主要信息之后,我们需要进一步计算栈的价值。并且由于生成的是均匀栈,故此要求栈的所有出现的产品项的宽度或者长度均是相等的。下以水平均匀栈为例:设以产品项j作为主产品项的水平均匀栈j,其长度不大于L,且宽度等于w,,记此栈的价值为HV(j,L,w,,m,), 其求解的伪代码如下:
算法1:均匀栈生成算法
输入:栈价值V:条带剩余长度RL; 栈中包含产品项i的数量 num
输出: 栈价值HV(j,L,w,m,); 栈的数组信息m,
1 RL=L-l,;
2 for i=1 to 2m
3 if RL< lmin(i) or l₁≠ɪ;
4 HV(j,L, wj, mj)=V; break
5 else
6 if demand(i)=0 return
7 else
8 if RL<l₁ return
9 else
10 num= min( demand(i), [RL/l₁]); RL=L-num×l,
11 Add (i, num) to m,; P=14num×c₁
12 end
13 end
14 end
15 end
16 return HV(j,L,w,m,); m,
2.条带生成算法
我们类比上一节提出的产品项排成栈的算法,进一步将栈排条带中,从而可得到由栈生成条带的算法,由于和栈生成算法类似,下面仅简略展示条带生成算法的步骤,如下:
StepI. 算法初始化设置
确定栈的各类属性:首先通过使用栈生成算法生成了 n个栈,进而通过算法输出结果计算水平栈的长度和竖直栈的宽度,并将其储存。
确定栈的使用需求:在这部分我们认为算法生成的n个栈均是不同的,即当两个栈的长宽以及内部包含的产品项种类和数目均相同时,而这时栈内产品项的排列顺序也可以是不同的,故此我们认为生成的n个栈均是不同的。进而设置每个栈的需求量均为1。
Step2. 算法建立过程:
在这部分我们类比产品项生成栈的算法,进行算法设计,将n个栈放置进条带中,具体流程均与上节所述类似,在此不进行重复展示。
5.3.2求解过程
下面基于 TUSP 排样图生成算法和SVC 顺序价值修正启发式算法来求解在产品项可旋转的条件下的三阶段匀质齐头切情况下二维矩形排样问题,模型的求解流程如下:
TUSP和SVC求解3CS框图 | |||
输入: 初始化产品项单位价值,令ρ₁=l₁w₂, 输出: 最优的排样方案 | 其中ieI, 令( | Uni=+∞ | |
1 | For E=1 to Em. x | ||
2 | 初始化产品项可用量, 令 c₁=d₁, | 其中i∈I | |
3 | 令 U=0, J=0 | ||
4 | While ∑mac,>0 | ||
5 | 使用TUSP算法生成当前排样图 P | ||
6 | 确定P的使用次数, 计算表达式为f= min |c;/r;||r;∧i∈I | ||
7 | 将P加入当前排样方案 | ||
8 | 更新当前排样方案的排样方式数J: J=J+1 | ||
9 | 更新原片使用数量V: U=U+1 | ||
10 | 更新产品项可用量c₁: c₁=c₁=f×r₁ | ||
11 | 使用价值修正公式来修正产品项的价值 | ||
12 | end | ||
13 | If UKUap | ||
14 | 记当前排样方案为最优方案: | Uun=U, Jop=J | |
15 | end | ||
16 | If Unip=U and Jap>J | ||
17 | 记当前排样方案最优: Jap=J | ||
18 19 | end end |
5.4求解结果与分析
5.4.1对于数据集A1、A2、A3、A4的排样方案效果图
基于所建立的模型,使用 Python绘出排样方案效果图,部分结果如下(由于排样方案效果图数量较多,故仅展示部分效果图,全部效果图见附录9.1):
七、模型分析与评价
7.1算法复杂度分析
对于3阶段二维矩形排样问题的算法设计,我们是使用基于HUSP算法和价值修正的顺序启发式算法来寻找满足约束条件和优化目标的解,其中HUSP算法主要包括三个层级,对应着3阶段切样方式。第一个层级是产品项生成栈,需要遍历所有的个栈; 第二个层级是栈生成条带,需要遍历所有的条带,第三个层级是条带生成原片,需要遍历所有的原片,因此算法的复杂度为O(n³)
25
7.2模型优缺点分析
7.2.1模型优点分析
1、本文考虑的三阶段排样问题,考虑了较多约束条件,如齐头切和产品项可旋转等,这保证了本文所建立的模型和算法具有较高的灵活性,使用范围较广。
2、本文针对3阶段二维矩形排样问题建立了混合整数规划模型,并结合优化目标和约束条件,设计了基于HUSP算法,使用顺序价值修正的启发式算法,算法的求解得到的原片利用率是较好的。
7.2.2模型缺点分析
1、本文所涉及的算法为启发式算法,无法保证算法求解的最忧性。
2、对于问题二的处理,我们并没有对订单组批和排样问题进行协同优化,这导致了我们问题二求解的结果中原片利用率比问题一平均低了10%。
function stack= item to stack( item,L. W, rho)
%输入: item的所有信息: item,原片长度: L, 原片宽度: W.价值修正系数: rho;
%输出: 生成 stack的所有信息: stack--一个三维数组
%初始参数设置
item id= item(:,1);
item length= item(:,3);
item lighth= item(:,4);
item square= item(:,2).* item(:,3);
item value= rho.* item square;
demand= item(:,5);
m= length( item(:,1));% item总数
Imin=[];
wmin=[];
for i=1:m
lmin(i)= min( item length(i:m));
wmin(i)= min( item width(i:m));
end
%以 item i作为主 item的 stack, 预先设定2m个
a= zeros(2*m+2,2);
a(3:2*m+2,1)=[1:2*m]';
for i=1:2*m
stack(:,:,i)=a;
end
%通过循环进行 item的放置
RL=L;%剩余高度
RW=W;%剩余宽度
demand0= demand;
for i=1:2*m
if demand(i)==0
%对每个 stack进行 item的放置i
RL=L- item length(i);
RW=L- item width(i);
VL=0;%水平 stack价值
VW=0;%竖直 stack价值
ML= zeros(m,1);%存放每个 item在水平 stack放置的个数
MW= zeros(m,1);%存放每个 item在竖直 stack放置的个数
%水平放置 stack
demand1= demand;
for j=1:2*m
num j=0;
% stack均匀性要求
if item width(j)~= item width(i)
return
end
if demand1(j)==0| item length(j)>RL
return
end
if item length(j)>RL && RL< Imin(j)
break
end
if RL< Imin(j) && RL>= Imin(j)
return
end
%限制旋转前和旋转后的 item只能使用一次
if demand0-demand1(j)>=ML(j)
return
end
if RL> Imin(j) && item width(j)== item width(i)
if j<=m
num j= min(demand1(j), floor(RL/ item length(j)));
ML(j)=ML(j)+1;
RL=RL- num j* item length(j);
VL=VL+ num j* item value(j);
demand1(j)=demand1(j)-1;
else
num j= min(demand1(j-m), floor(RL/ item length(j-m)));
ML(j-m)=ML(j-m)+1;
RL=RL- num j* item length(j-m);
VL=VL+ num j* item value(j);
demand1(j-m)=demand1(j-m)-1;
end
end