我有许多不同宽度和高度的矩形。我有一个更大的矩形平台可以穿上它们。我想将它们打包在平台的一侧,使它们沿纵向(X)尺寸展开,但保持横向(Y)尺寸最小。那就是把它们放在一个俄罗斯方块游戏中。没有重叠,但可能存在差距。有没有算法可以做到这一点?
答案 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坐标,此时您可以计算所需的高度,并更新最大上限。
如果您在更新上限时保存了当前解决方案,那么当您的算法终止时,您将获得最佳解决方案。