我如何在2d盒俄罗斯方块风格包装多个矩形

时间:2010-04-03 04:56:33

标签: algorithm geometry

我有许多不同宽度和高度的矩形。我有一个更大的矩形平台可以穿上它们。我想将它们打包在平台的一侧,使它们沿纵向(X)尺寸展开,但保持横向(Y)尺寸最小。那就是把它们放在一个俄罗斯方块游戏中。没有重叠,但可能存在差距。有没有算法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

听起来像Bin Packing的变体:

  

在计算复杂性理论中,   垃圾箱包装问题是一个   组合NP难问题。在里面,   不同卷的对象必须是   装入有限数量的箱子里   容量V以最小化的方式   使用的箱数。

     

这有很多变化   问题,如2D打包,线性   包装,重量包装,包装   成本,等等。他们有很多   填写等应用程序   集装箱,装载重量的卡车   容量,创建文件备份   可移动媒体和技术映射   在FPGA中实现自定义   硬件

关于可能解决方案的同一页面的引用:

  

由于它是NP-hard,因此最有效的已知算法使用   启发式来完成结果   虽然在大多数情况下非常好,   可能不是最佳解决方案。对于   例如,第一个拟合算法   提供快速但通常不是最优的   解决方案,涉及放置每个项目   进入第一个垃圾箱   适合。它需要Θ(n log n)时间,   其中n是元素的数量   包装好可以制作算法   首先排序更有效   元素列表逐渐减少   订单(有时称为   首次拟合递减算法),   虽然这不能保证   最佳解决方案,以及更长的列表   可能会增加运行时间   算法

我建议您关注该Wikipedia页面中的一些链接。此外,通过谷歌搜索“bin打包算法”,你可能会发现很多相关的信息。

答案 1 :(得分:2)

这被称为2D条带包装,并已由Martello工作。如果你在谷歌搜索他们的论文,他们的算法应该很容易实现。一种方法是使用分支和绑定来解决您的问题。首先计算一个贪婪的解决方案,以获得您的包装所需的最大高度。

然后,您的算法应首先找到一组有希望的x坐标,然后找到矩形的y坐标。换句话说,对于每个矩形,可以分配所有可能的x坐标。在任何时间点,您都可以保持占据任何特定x坐标的总高度之和(这称为累积约束),如果高度超过全局最大高度则修剪。对于已经分配了所有矩形的x坐标的每个完整的x坐标解,您现在可以尝试找到有效的y坐标。您可以通过对每个矩形进行分支,在不同的可能y坐标上进行修剪,并在知道两个矩形相互重叠时进行修剪。在树的底部,您将找到矩形的x和y坐标,此时您可以计算所需的高度,并更新最大上限。

如果您在更新上限时保存了当前解决方案,那么当您的算法终止时,您将获得最佳解决方案。