目录
遗传算法求解3D打印中零件二维排布问题(MATLAB实现)
增材制造是一种高效的并行制造方法,如何在有限的工作台面排布尽可能多的零件,是一个典型的N-P难题。遗传算法是一种全局最优化的数值优化方法,由于搜索过程不依赖梯度信息,不易陷入局部最优解,它适合解决各类优化问题,尤其是复杂的非线性问题。本文讨论了在二维状态下矩形件的排样问题,并将最低水平线法与遗传算法相结合对排样进行了优化,并给出了计算实例。一、遗传算法简介
遗传算法是一种借鉴生物界自然选择思想和自然遗传机制的全局随机搜索算法。它把问题的可行解构成种群把每一个可能的解看作种群的个体运行时算法在整个解空间内随机搜索按一定的评估策略(或适应度函数)对每一个体作出评价不断地使用选择、交叉、变异这三种遗传算子使问题的解不断进化直至产生最优解。因为遗传算法在解决大空间、非线性全局寻优等复杂问题时具有传统方法所不具备的独特优越性所以它自1975年由美国学者J.H.Holland提出以来已经得到了广泛的研究和应用1。
与传统优化方法相比,遗传算法的优越性主要体现在如下方面:遗传算法仅仅利用个体的适应度进行群体的进化,不需要优化模型中目标函数和约束函数的导数信息,因而具有极强的鲁棒性,适合解决各种优化问题。遗传算法利用设计变量编码在设计变量空间进行多点搜索,突变算子能避免交叉繁殖收敛于局部优良个体,并保持群体搜索的多样性,这些确保了遗传算法具有更强的全局寻优能力。此外由于遗传算法搜索过程中保持群体规模不变,因而具有潜在的并行性,所以它适合解决复杂的、大型的优化问题。本文尝试用遗传算法来解决这一典型的组合优化问题,首先给出排样优化的数学模型然后用遗传算法求解该模型寻找最优排样方案。
二、排样方法
1.二维不规则排样
二维排样就是在给定的平面区域内找出被排零件的最优布局,使得材料消耗最少,并且零件不能互相重叠,如图1所示。二维排样问题在工业生产中广泛存在:造船业中钣金件的裁切,服装制鞋行业中各种布料、皮革的裁剪;木材制品加工中加工各种家具时木材的裁切以及印刷业中各种书刊的排版均属于排样问题。由于材料费用在产品成本中占很大比重,提高材料利用率就意味着降低成本、提高效益,因而开展排样研究,寻求有效的排样方法具有很深远的理论意义和现实意义2,3。对于大批次的3D打印件来说,一般在打印前应该会依据打印件的高度进行分组,这样,同一批次的3D打印件应为高度相近的件,故三维问题即可简化成二维排样问题。
二维排样问题主要包括矩形排样、规则形状排样(如圆形、正多边形等特殊形状)以及不规则形状排样。在生产实践中,其排样优化目标函数一般为 或者 。前者表示材料利用率,即零件面积总和除排样后零件占用面积总和最大;后者表示零件排样后占用总高度或总长度最小。
不规则形状排样问题是平面排样中最复杂的问题,由于解空间太大,采用确定性算法己无法求解中等规模的排样问题,因此许多研究人员通过分阶段简化排样过程来最终求解该问题,最典型的一种简化方式是将不规则形状排样问题转化为较为简单的规则形状排样问题。其中应用最多的是最小包络矩形法,即将需要3D打印的零件投影在二维平面上,求出一个可以将其轮廓最小包络的矩形。并且对一些形状互补的零件通过平移、旋转等方法进行简单组合,对组合后的图形再求解最小包络矩形。这样二维平面零件排样问题就转化为矩形件的正交排样问题。本文将二维不规则件简化成最小包络矩形进行了下文所述排样优化。
2.编码及解码方式
用遗传算法求解问题,必然先要进行编码。不同的编码方法,遗传算子实现的方式也不同。可以十进制码方式,将每一矩形进行编号 i= 1,2,3…,n 零件编号构成一个整数串
P= {P1, P2, …,Pn } (pi≤n )表示了一种排样图(一个解) 。其中,每一位整数代表一个矩形,并且每一位整数可以有正负之分,正号表示零件不发生旋转,负号表示将零件旋转90度。这样一个整数串就是一个个体,每一个体对应一种排样图,m 个个体构成一个群体。
采用这种编码方法,每一矩形有横放、竖放两种方式。n个矩形的排列为n!,因此解空间的大小为 。虽然有些零件的包络矩形可能长、宽相等,其旋转、不旋转相同,但解空间仍很巨大,采用穷举法是很难求解的。
由遗传算法产生一个个体的编码后,整个算法的核心就是能否快速地求出其对应的排样图,得到所需板材的尺寸(长度、宽度、占用面积等) 是一个关键。同时,只有求得该个体对应的排样图后,才能计算适应度值,并对该个体进行评价、选择。综合查阅的文献资料,主要有以下几种解码方法:
-
BL算法
Step1. 将P1放在板材的左下角,若Pi为负值,则将其旋转90度后再排放,求出排放后所占板材的最大高度。
Step2. 将Pi ( i= 2,3,…, n) 置于板材右边最大高度处交替向下向左移动Pi。首先尽可能地向下移动,然后再尽可能地向左移动直至Pi无法再向下向左移动为止(即接触到其它零件或板材边界)并求出此时的最大高度;重复上述过程直至所有零件排放完毕最后所得的最大高度即为所需板材的高度。
排布图如图所示:
-
“下台阶”算法
Step1.将p1 零件排放在板材的左下角, 若p1 为负值则将其旋转90 度后再排放, 求出排放后所占板材的最大高度。
Step2.将pi ( i= 2, 3, ⋯, n) 置于右边最大高度处, 向下向左移动pi , 且向下移动优先, 直至pi无法向下向左移动为止( 即接触到其他零件或板材边界) , 并求出此时的最大高度。重复上述过程, 直至所有零件排放完毕, 最后所得最大高度即为所需板材长度。其排样过程如图3所示, 就好像下台阶一样, 形象地称之为下台阶算法4。
-
最低水平线法
Step1. 设置初始最高轮廓线为板材的最下面的边.
Step2. 每当要排入一个零件Pi时,就在最高轮廓线集中选取最低的一段水平线,如有数段,则选取最左边的一段,测试该段线的宽度是否大于或等于要排入零件的宽度:
a. 如果该段线的宽度大于要排入零件的宽度,则将该零件在此位置排放,更新零件最高轮廓线;
b. 否则,查询与最低水平线段相邻的左、右两段水平线,将最低水平线提升至与高度较低的一段平齐,更新零件最高轮廓线.
重复Step2 直至能排入该零件.
重复上述过程,直至所有零件排放完毕.
对于编码{ 1 -2 3 -4} 采用该方法的排样过程如图所示. 在排放1,2 矩形后,最低水平线在最右端,要排矩形3时,此时最低水平线的宽度小于矩形件3的宽度,则提升该段与相邻的左段水平线平齐,这时最低水平线变成了靠左边的一段,将3排放,照此方法放入矩形45.
由于该方法在排入零件时总是先查询排样图的高度轮廓线的最低水平线,故称之为 最低水平线法。显然,最低水平线法同样满足BL条件。 -
改进的最低水平线法
Step1. 设置初始最高轮廓线为板材的最下面的边.
Step2. 每当要排入一个零件Pi时,就在最高轮廓线集中选取最低的一段水平线,如有数段,则选取最左边的一段,测试该段线的宽度是否大于或等于要排入零件的宽度:
a. 如果该段线的宽度大于要排入零件的宽度,则将该零件在此位置排放,更新零件最高轮廓线;
b. 否则,从零件所在的位置起向后搜索一个可以放下的零件,同时交换这两个零件的位置。如果没有则将最低水平线提升至与高度较低的一段平齐,更新零件最高轮廓线。即:对于P={P1,P2,…Pi,…Pj,…, Pn},1<Pi<Pj<Pn,如果Pi的宽度大于最低水平线的宽度,则在{Pi+1,…,Pj…Pn}中搜索,如果Pj的宽度小于最低水平线的宽度,则将Pj排入。同时,P={P1,P2,…Pi,…Pj,…, Pn}更新为P={P1,P2,…Pj,…Pi,…, Pn}.
重复Step2 直至能排入该零件.
重复上述过程 直至所有零件排放完毕。
本文基于最低水平线法进行解码。
三、遗传算法求解
1.算法建模
因为遗传算法具有极强的全局寻优能力, 本文选用它来求解排样优化模型。按照达尔文的生物进化论,生物的进化是由上代生物群体繁殖产生下代生物群体!因此"对生物进化过程进行模拟的遗传算法的主要内容就是模拟生物群体的进化过程,其过程如图所示:利用遗传算法求解上述优化模型,包括如下几个步骤:
- 编码及初始化种群
根据矩形件优化排样问题的特点,本文采用整数顺序编码方式:先将要排放的每一个生成的最小包络矩形件都统一进行编号,若不考虑矩形的旋转,则编号均为正,一个矩形零件的编号对应一个基因的编码。假设要排放的矩形零件总数为n,n个矩形零件的编号构成一个染色体。种群中每个染色体的长度与待排矩形零件总数相同,染色体中每个基因的编码对应相应矩形零件的编号,所有基因编码的一个排列顺序构成了一个染色体。
初始种群的好坏对遗传算法的收敛速度和求解质量有很大的影响。常见的产生初始种群的方法是随机生成初始种群,这种方法简单,容易实现,但初始种群的优良程度得不到保证。由于忽略了板材数据和零件数据的具体特点,采用随机的方法产生初始群体很难获得较好的初始群体,即使经过较长时间的进化,也不容易得到令人满意的求解结果,最好采用启发式规则来产生初始种群。种群规模的大小对遗传算法的性能有一定影响。种群规模越大,群体中个体的多样性就越高,算法陷入局部解的危险性就越小,但种群的规模太大会使算法的计算量增加,从而影响算法的性能。种群的规模太小,会使遗传算法的搜索空间中分布范围有限,因而搜索可能停止在未成熟阶段。因此,为了避免早熟现象,必须保持群体的多样性,群体的规模不能太小。群体的规模一般在30~200之间,过大或过小均影响遗传算法的综合性能。
本文通过产生1-10随机的整数排列来模拟10个基因,组成一个染色体,即一个个体。然后利用MATLAB生成100个这样的排列来模拟一个有100个个体的种群(每一行即为一个个体)。从而完成对种群的初始化。如图所示。
- 构造适应度函数
适应度函数定义的好坏对问题的求解效果有很大影响。常见的定义适应度函数的方法有两种:一种方法主要是从排样图的最大高度方面考虑,要求尽量使排样图的最大高度值小,一般用最大高度值的倒数来表示。另一种方法主要是考虑废料再利用,要求尽可能的提高可再利用废料的利用率(可再利用废料是指处于排样图最高轮廓线和排样图最大高度水平线之间的部分)。本文考虑第一种方法构造适应度函数:
其中area 是排入矩形件的总面积,area1是排样图高度轮廓线以下的板材面积。这样,适应度值最高为1。即代表最密布排列。
2.遗传算子
选择算子
在生物的遗传和自然进化过程中,对生存环境适应程度较高的物种将有更多的机会遗传到下一代;而对生存环境适应程度较低的生物遗传到下一代的机会就相对较小。模仿这个过程,遗传算法使用选择算子(或称复制算子,Reproduction Operator)来对群体中的个体进行优胜劣汰操作:适应度较高的个体被遗传到下一代群体的概率较大;适应度较低的个体被遗传到下一代群体的概率较小。遗传算法中的选择操作就是用来确定如何从父代群体中按某种方法选取哪些个体遗传到下一代群体中的一种遗传运算。选择算子采用最优保存策略6。即当前群体中适应度最高的个体不参与交叉运算和变异运算,而是用它替换掉本代群体中经过交叉、变异等遗传操作后所产生的适应度最低的个体。具体操作过程是:
(1)找出当前群体中适应度最高的个体和适应度最低的个体。
(2)若当前群体中最佳个体的适应度比总的迄今为止的最好个体的适应度还要高,则以当前群体中的最佳个体作为新的迄今为止的最好个体。
(3)用迄今为止的最好个体替换掉当前群体中的最差个体。
本文选用的选择算子是在初始种群即父带群体经过交叉变异后形成的子代群体与原来的父带群体组成一个新的群体,求每个个体的适应度进行降序排序,保留适应度最高的一半个体作为新的父带群体进行交叉变异,循环迭代,层层选优。
交叉算子
遗传算法中起核心作用的是遗传操作的交叉算子。交叉是指把两个父代个体的部分结构加以替换重组而生成新的个体。交叉是产生新个体的主要方法,它决定了遗传算法的全局搜索能力。交叉概率一般取为0.4~0.99。
采用整数顺序编码的染色体中,染色体交叉的难点在于将两个染色体的部分基因片断互换后,会形成非法基因,即在染色体中会有重复的基因。在染色体交叉的实现过程中,既要使染色体发生交叉,又要保证交叉后的染色体不会出现重复的基因。
染色体交叉方法有如下两种:先通过产生随机数产生一个随机的交叉位置,在该点以前的基因不变,在该点以后的基因部分进行交叉。由于交叉后要保证一个染色体不能有相同的基因,故需要将两条染色体的不交叉的基因部分进行比较,在去掉两个基因片断中相同的基因后,将染色体不交叉部分剩下的基因按原来的顺序分别放入两个数组p[ ]和q[ ]中。在对染色体交叉部分的基因片断进行操作时,数组p[ ]或q[ ]中的基因所在列不进行交换。
例如,要进行交叉的两个染色体分别为A={1,2,3,4,5,6,7,8,9,10