二维矩形件排样算法之最低水平线算法实现

最低水平线算法的简单实现(Python)
二维矩形排样算法众多,最早的有BL算法、下台阶算法、最低水平线算法等,其中最低水平线算法及其优化算法应用较多,是与智能优化算法(遗传算法、模拟退火算法等)结合的较多的算法,本文利用python对最低水平线算法做了实现 🍎

问题描述
矩形件优化排样问题就是在给定的矩形板材上排放一系列矩形零件,且矩形板材的宽度为一定值,高度方向无限延伸,所有零件采用正交排放的方式,被排放的零件之间不能有重叠,且零件必须全部排放在板材内部,要求找到一个最优排样方案使得板材的利用率最高。
为了方便对问题进行描述,不妨设矩形板材的宽度W WW为一定值,高度H HH不限,待排零件总数为n nn,矩形件集为( R 1 , R 2 , . . . , R n ) (R_1,R_2,...,R_n)(R 
1

 ,R 
2

 ,...,R 
n

 ),第i ii个矩形件R i R_iR 
i

 的长为l i l_il 
i

 ,宽为 w i w_iw 
i

 。以板材的左下角为原点,宽度方向为x轴,高度方向为y轴建立直角坐标系。每一个被排入的零件在板材中的具体位置用其在坐标系中最左、最上、最右、最下四个坐标值表示,即R e c t ( l e f t , t o p , r i g h t , b o t t o m ) Rect(left,top,right,bottom)Rect(left,top,right,bottom)。如下图所示,矩形件R RR的长为l ll,宽为w ww,左下角坐标值为( a , b ) (a,b)(a,b),则可以用R ( a , b + w , a + l , b ) R(a,b+w,a+l,b)R(a,b+w,a+l,b)来表示矩形件R RR在板材中的位置。


将指定规格和数量的矩形零件排入矩形板材内,排完后板材在高度方向上使用的越少其利用率越高,问题的目标函数如式1。

其中H m a x H_{max}H 
max

 为排样完成后所用板材的最大高度,目标函数f ( x ) f(x)f(x)实际为板材的利用率。

最低水平线法
近年来贾志欣等人提出的最低水平线法受到了理论界的广泛关注,众多学者对其加以改进应用,都取得了较好的排样效果。最低水平线法是一种不断更新水平线集的排样算法,其基本思想就是在水平线集中选择高度最低的那条,将要排放的零件排放在最低水平线上并更新水平线集,如果最低水平线宽度不够,排放不下当前要排的零件,则搜索与最低水平线左右两边相邻的水平线,选择高度低的一条,将最低水平线提升至该高度,判断更新后的最低水平线能否排入该零件,若依然排不下则继续执行提升水平线的操作,直至该零件能排入为止。其具体步骤如下:

(1)初始化水平线集,初始状态下水平线集中只有一条水平线,为坐标系中板材最底部的边;
(2)选择要排入的零件;
(3)从水平线集中的选取最低的那条水平线,如果最低水平线不止一条则选取最靠左边的那条。如果被选中的水平线的宽度大于要排入的矩形零件的长度,执行步骤(4),否则执行步骤(5);
(4)将该零件排放在最低水平线的最左端,更新水平线集,转步骤(6);
(5)选择与最低水平线相邻且高度较低的一段水平线,将最低水平线提升与该水平线平齐,更新水平线集,转向执行步骤(3);
(6)判断所有零件是否排样完毕,若排放完毕则排样结束,否则转向执行步骤(2)。

本文令水平线集为 L i n e L i s t LineListLineList,每一条水平线由其在坐标系中的起始点和终点横坐标及它们共同的纵坐标三个变量表示,即 L i n e ( o r i g i n , e n d , h e i g h t ) Line(origin,end,height)Line(origin,end,height),图2 所示为一个最低水平线法的排样过程,初始时刻水平线集中只有一条水平线 L i n e L i s t { ( 0 , W , 0 ) } LineList\{(0,W,0)\}LineList{(0,W,0)},将零件1排放在该水平线上,并相应的更新水平线集,此时零件1的位置为R 1 ( 0 , w 1 , l 1 , 0 ) R_1(0,w_1,l_1,0)R 
1

 (0,w 
1

 ,l 
1

 ,0),水平线集为L i n e L i s t { ( 0 , l 1 , w 1 ) , ( l 1 , W , 0 ) ) } LineList\{(0,l_1,w_1),(l_1,W,0))\}LineList{(0,l 
1

 ,w 
1

 ),(l 
1

 ,W,0))},从水平线集中选取高度最低的一段,比较其与零件2的宽度,如图(b)所示,最低水平线宽度大于零件2的宽度,于是将零件2排放在最低水平线上,零件2的位置为R 2 ( l 1 , w

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值