0. 前言
该算法来源于欧洲运筹学杂志(European Journal of Operational Research),发表于2011年,论文标题为A skyline heuristic for the 2D rectangular packing and strip packing problems。
提出了一种使用天际线表示填料的二维矩形堆积问题(2DRP)的贪心算法;在简单的禁忌搜索方法中使用这种启发式方法。将这种 2DRP 方法用作对堆积高度进行“迭代倍增”二分搜索的子程序,以解决 2D 矩形条带堆积问题 (2DSP)。
1.问题描述
解决两类问题:
2.名词解释——天际线、浪费空间
2.1 名词解释
上原文:
解释:
天际线(skyline):水平直线段(S1,S2,…,Sk)组成的一个集合。满足以下两个条件:
1):相邻天际线不等高;
2):左天际线的右端点与右天际线的左端点x坐标相等。
以上为天际线完整的数学描述,看起来很简单,但是作为数学模型这样的描述非常有必要。第一个规则说明了等高且相邻的一定是一条天际线,不能被分作两条;第二个规则表明了天际线中间无空隙。
浪费空间(wasted space):本文定义了一个概念叫做浪费空间,如图中阴影部分所示,浪费空间不能排布任何物体。关于浪费空间如何判定,下文中会提到。
2.2 天际线的更新规则
每个天际线线段Sj最多提供两个候选放置---S的左端点和右端点,但只有当端点为‘凹’时才是候选放置点,例如上图的(a),s2的左端点为候选放置点,右端点不是。当新放置物体b时,天际线需要更新,根据 b的宽度是否大于 s 分两种情况—(a)(b)和(c)(d)两种。第一种情况不会产生浪费空间,但是第二种会产生如图的浪费空间。
天际线的更新分为两步,第一步如上述,接下来描述第二步。检查局部最低线段(locally lowest segment),如果后续所有物体的宽度大于局部最低线段的宽度,则如图所示使用浪费空间标记该区域,使局部最低线段消失,整个过程如下图所示。至此,添加b后,天际线得到完整的更新。
3.布局规则——2DRP_Heuristic (Seq, H, max_spread)
1)Seq:初始编码,代表物体排布顺序,可以使用Seq=[5,1,3,2,4]表示,代表先拿出5号物体排布,再取出1号以此类推;
2)H:最外面框的高;
3)max_spread:最大落差值,属于参数,可以自己设定,后文中有该参数的设定方法。用来检查排布某个物体后,目前布局中最高天际线与最低天际线的差值是否超过一定的值,如果差值太大表示该物体不能在此候选点摆放。
依次从Seq中取出物体,,顺序从前往后执行5步,为每个物体在排布时遇到的所有候选点排出优先度,最终选出优先度最高的位置放置该物体。下面介绍这五步:
1 spread of a skyline:设定一个参数 max_spread,放置矩形后,如果最高天际线与最低天际线之间的差值大于max_spread,则认为该矩形不能被放置在此位置。这一条的主要目的为了防止出现上图中Tall tower的情况。
2 only fit:如果b是唯一适合p点的矩形,则(p,b)具有最高优先级
3 minimum local waste:图中都是可能出现的浪费空间,需要为b选择一个浪费空间最小的放置点。
4 maximum fitness number:每个物体都有一个适应度,适应度的范围是0,1,2,3,4,如上图,适应度取决于放置物体的四周,有无刚刚好贴合其他物体,或者有无贴合边界,如果贴合适应度就加1。
5 earliest in sequence:若到了第四步还是不能确定放置,使用“先来先得”的原则确定。
对于一个Seq,当所有物体都依次执行上述过程后,得到一个完整的布局方案,该方案可能出界,我们认定为非法解,证明该Seq和max_spread的组合排出的结果会大于H,可以首先尝试改变max_spread重新布局。直到没有出界情况,得到一个合法布局。
4.整体算法及伪代码
4.1 2DRP的禁忌搜索
4.1.1初始化
初始Seq的数量为6,生成方法如下:
1.按区域降序排序;
2.按宽度降序排序;
3.按高度降序排序;
4.按周长降序排序;
5.按最大宽度和高度降序排序;
6.按对角线长度 + 宽度 + 高度(即三角形一半的周长)降序排序。
max_spread的数量为4,值分别如下(mh为最高矩形的高度):
1.mh
2.mh+(H-mh)*1/3
2.mh+(H-mh)*2/3
4.H
4.1.2算法伪代码
算法框架:禁忌搜索
初始编码:见4.1.1
邻域搜索:两点交叉
解码方法:见第3章
下面给出上述算法的超级简略版描述,因为太简略了,可能不严谨的地方,如果看不懂上面伪代码可以用AI去辅助阅读。
第一步:初始化(见4.1.1)
1)生成物体初始序列Seq,共六种;
2)生成max_spread,共四种;
第二步:执行算法1
1 按顺序取出一种序列seq
2 按顺序取出一种max_spread
3 如果 seq 按照排布规则排布,为可行解 则 算法结束结束.
4 否则 逐步寻找邻域seqx,并融入禁忌搜索,继续通过规则排布并检测直到找到可行解,若到iter代都无可行解,重新执行第一行或第三行,直到六种初始序列耗尽。
4.2 2DSP的二分搜索
4.2.1初始化——生成LB与UB
第一步:预测H的下限,使用三种方法预测H的下限,预测值分别为 LB1, LB2, LB3。
1)LB1:所有矩形的面积和/W;
2)LB2:所有宽超过W/2的矩形的高之和
3)LB3:所有宽等于W/2的矩形的高之和/2
第二步:选择合适的初始LB
如果是位姿可变问题,LB=LB1
如果是固定位姿问题,LB=max{LB 1,LB2 + ⌈LB3⌉}
第三步:初始UB=LB*1.1
4.2.2 二分搜索2DSP
“先松后紧”的二分搜索策略:
每次二分搜索尝试后,我们将 2DRPSolver 子例程允许的禁忌搜索迭代次数加倍。由于我们的下限可能远离最佳值,因此我们的二分搜索必须检查 H 的几个值,其中一些值可能是不可行的。给定 H 的不可行值,我们无法快速确定它是可行还是不可行。这种迭代加倍方法背后的基本原理是基于这样的观察:我们的启发式方法永远无法找到针对不可行实例的可行解决方案,因此我们希望尽量减少在 H 的不可行值上花费的精力。在流程的早期,我们对二分搜索中的每个 H 值花费少量计算工作,通过快速求解“简单”的 2DRP 实例来确定良好的上限。在这个过程的后期,当需要更多的计算工作量来找到更好的可行解决方案时,我们会在每次迭代后将其加倍来增加工作量。这种迭代倍增技术使我们能够将更多的计算时间分配给过程的后半部分,以增加找到良好可行解决方案的概率。
5.总结
在我看来,论文中有部分细节没有交代清楚,例如算法1的第8行和第9行,生成的十个邻域用途,以及与下面的seqx的关系是什么并没有表达的特别清晰。导致但看这篇论文及伪代码可能无法100%复现出原代码。总体来说整篇sci文章简单易懂,有空的读者可以看原文。