带约束的矩形包装

时间:2013-06-21 14:55:37

标签: algorithm optimization mathematical-optimization packing

我想打包一组矩形(示例):

enter image description here

所以总高度尽可能低,但是矩形必须在它们开始的同一列中结束。允许矩形相互“移动”到达最终状态,只要它们最后不相交。

我们当前的算法是处理从最大高度到最小高度的矩形,并将它们放在可用的最低y位置。有更优化的算法吗?

编辑:我不一定需要最优解决方案,任何产生比当前解决方案更好的解决方案的算法都很有趣。此外,矩形的数量约为50。

3 个答案:

答案 0 :(得分:6)

假设您有N个矩形。对于每个矩形i,让[a_i, b_i]为水平范围,让h_i为高度。

您的解决方案空间看起来像y_i, i = 1, ..., N,其中矩形i的垂直范围为[y_i, y_i + h_i]

不失一般性,我们可以约束y_i >= 0。然后,我们希望最小化目标函数max{y_i + h_i | i}

您对非重叠矩形的约束是:

y_i + h_i <= y_j
   OR
y_j + h_j <= y_i

for all i != j such that `[a_i, b_i]` and `[a_j, b_j]` intersect

确定哪个[a_i, b_i]相互交叉很容易,因此找出形成这些约束的矩形对应该是直截了当的。

为了摆脱约束中的OR,我们可以为每个约束z_k和一个足够大的“Big M”k创建二进制虚拟变量M并重写:

y_i + h_i <= y_j + (z_k)M
y_j + h_j <= y_i + (1-z_k)M

for all i != j such that `[a_i, b_i]` and `[a_j, b_j]` intersect

我们可以引入虚拟变量H并添加约束y_i + h_i <= H,以便我们可以将目标函数重写为最小化H

由此产生的优化问题是:

minimize H
with respect to: y_i, z_k, H
subject to:

 (1) y_i + h_i <= y_j + (z_k)M    for all i != j such that [a_i, b_i]
     y_j + h_j <= y_i + (1-z_k)M  and [a_j, b_j] intersect

 (2) y_i + h_i <= H               for all i

 (3) y_i >= 0                     for all i

 (4) z_k in {0, 1}                for all constraints of type (1) k

这是mixed-integer linear optimization problem。您可以直接应用此类问题的常规解算器。

通常情况下,他们会执行一些技巧,例如将z_k上的二进制约束放宽到算法期间z_k [0,1]所在的约束,这会将其转换为linear programming problem ,可以有效地解决非常

我会建议尝试重新发明这些求解器。

答案 1 :(得分:2)

鉴于矩形只能垂直移动,似乎只有两种解决方案:尽可能向上移动所有矩形直到发生碰撞,或者将它们全部向下移动直到发生碰撞。我怀疑这些解决方案是否相同*。当你被限制在一个维度时,我无法想象有更复杂的包装概念。也许我错过了什么?

*如果我已正确理解您的约束,则最小高度将始终是具有最大填充单元格数的列中的填充单元格数。无论翻译是向上还是向下,这都不会有所不同。

答案 2 :(得分:2)

在我看来,第一步是为每列计算最低要求的高度。以图片为例,第一列至少需要10的高度,由红色,绿色和小蓝色矩形贡献。这可以通过迭代每个给定的矩形并将它们相应的高度添加到它占据的列来轻松完成。通过这样做,所有&#34;列高度的最大数量&#34;被发现,我称之为&#34;支柱&#34;。在你的照片中,&#34;支柱&#34;在第8:10列,高度为14,由矩形1,2,4,6(从下到上编号)贡献。这意味着包装的最小高度至少是&#34;柱的高度。自从&#34;支柱&#34;柱是固体填充的,不能进一步减少。并且堆叠这四个矩形形成这样的图片:(非柱状矩形未示出)
Fig.1 The pillar and the involved rectangles

然后柱子将图片分成两部分,一部分是柱子左边的区域,另一边是另一边的区域。而且,&#34;非支柱&#34;矩形(R3,5,7,8)也分别定位在两个区域。 LHS上的R3,R7和RHS上的R5,R8。

现在首先考虑左侧部分。我重新排列了柱状矩形,如图所示(图3):
Fig.2 Rearranged pillar with best space consistency on LHS

通过重新排列的柱子矩形堆叠顺序,虽然我没有严格的证据,但很有可能无论形状和柱子的LHS上的矩形数量是多少,所有给定的矩形可以放在LHS的空白区域(这里的约束是这些矩形不能给出更高的固体支柱,否则步骤1已经检测到并将其用作实际支柱)。这种安排使LHS的空白空间具有最佳的空间一致性。这意味着每个柱子矩形创建的空白空间从下向上按升序排列。这种&#34;一致性&#34;让每个柱子矩形创建的空白空间一起工作&#34;然后包含高于单柱矩形创建的任何单个空白空间的重叠。例如,下一张图片中的绿色矩形适合使用由蓝色和紫色矩形一起创建的空白区域 Fig.3 The use of consistency

假设上面的陈述是真的,那么位于LHS上的矩形永远不会比柱子产生更高的堆叠。然而,如果这些重叠需要空空间之间的任何配合以适合LHS,那么它们实际上限制了柱状矩形的交换可能性。以图3为例,绿色矩形需要紫色和蓝色相邻才能适应,然而,为了在RHS上获得最佳的空间一致性,洋红色必须介于紫色和蓝色之间。这意味着LHS上的绿色使得无法获得RHS的最佳一致性,因此可以使RHS上的矩形无法适应空的空间并导致堆叠有孔并超过由柱。对不起,我不能在这里设计这样的案例,但它确实有所作为。

总结:
步骤1是找到支柱,如果每个给定的矩形都参与支柱,可以在这里找到一个简单的答案 - 支柱的高度是最小的包装高度。

第2步是检查支柱的两侧 情况a:如果一侧没有放置自由矩形,那么另一侧可以很容易地填充&#34;最佳一致性&#34;方法和最终的最小包装高度也是支柱高度。

案例b:如果一方不需要自由空间一致性,则可以填写该方,另一方仍然可以使用“最佳一致性”#34;例如:(您的原始图片)
Fig.4 Fitting without consistency requirements.
在这种情况下,装配在R3中的空白空间仅由R6创建,而R7和R2则相同。因此,如果R3,R7跟随交换,则将R6和R2的堆叠顺序与其他柱矩形交换不会使R3,R7不适合。这可以导致最佳的一致性&#34; RHS的案例:
Fig.5 Best consistency on RHS with LHS fit in

然后RHS可以填充RHS定位矩形而不超过柱高 这种不一致性要求可以通过比较适合的自由矩形的高度和柱形矩形的高度来识别,以便为它创建自由空间。如果自由矩形的高度不大于其他矩形,则它不需要第二个柱状矩形参与,这意味着它不需要自由空间一致性。

案例c:双方都需要自由空间的一致性。这就是麻烦的地方。再次以图3为例。图3中的绿色为紫色和蓝色组合。这意味着将绿色,紫色和蓝色视为一个整体,将堆叠顺序与其他柱状矩形交换,以使LHS的自由矩形最佳。在这整体中,蓝色和紫色也可以交换 如果RHS不能进行配合,导致填料高度大于支柱高度,则需要重复第二步,但首先安装RHS并在此之后尝试安装LHS。然后将比较的较低填料高度结果作为最终结果。这种情况的逻辑不清楚,很可能有更好的替代。

我知道这不应该被称为一个正确的解决方案,而是随意和松散的想法,但它显然不符合评论。请原谅我笨拙的解释和糟糕的图片处理。希望这会有所帮助。