【问题标题】:Stacking rectangles to take as little space as possible堆叠矩形以尽可能少地占用空间
【发布时间】:2008-10-30 19:43:46
【问题描述】:

我有一个程序可以计算将矩形拼接在一起所占用的最小面积。

输入:不同高度和宽度的矩形。
输出:一个包含所有这些矩形的矩形。
规则:不能转动或滚动矩形,它们不能重叠。

我了解这是相关的或可能被定义为装箱问题(NP-hard)。然而,我为那些找到的算法通常会限制例如宽度。我没有这样的限制,唯一的目标是使生成的区域尽可能小。

关于什么算法适合得到一个体面的解决方案的任何指针?

【问题讨论】:

  • 还有其他人发现作业有问题吗?
  • 不,这在游戏中很常见,它被称为纹理打包。
  • 实际上我正在自动将图标和图像转换为 css sprite,我希望结果尽可能好。

标签: algorithm math


【解决方案1】:

http://www-rcf.usc.edu/~skoenig/icaps/icaps04/icapspapers/ICAPS04KorfR.pdf

显然这个问题比最初看起来更难。这是一个有趣的算法,因为它首先猜测一个解决方案,然后对其进行改进,所以如果您不想等待最佳解决方案,您可以运行它进行一定次数的迭代以获得近似解决方案(越长你运行它,近似值越好)。

【讨论】:

【解决方案2】:

我建议从一个简单的贪婪方法开始,看看这是否足以满足您的需求。如果您的输入表现良好或很小,这可能就是您所需要的——当您尝试做更复杂的事情时,复杂性会迅速上升。

例如:按大小对矩形进行排序,最大的在前。一次添加一个矩形,尝试新矩形的每个可能位置。选择导致最小边界框的位置。

另一种贪婪的方法是选择一个起始矩形,然后重复添加导致排列最密集的矩形(其中密度定义为边界框被填充区域的百分比)。

【讨论】:

  • 我也打算建议这两个,但是在处理不同的 NP 问题时,最初假设是“好”启发式,这让我尝试了我认为“坏”的启发式。结果令人惊讶。出现局部最小值和最大值情况。但我喜欢你的建议。
【解决方案3】:

我会先浏览一下http://mathworld.wolfram.com - 它们非常适合这样的东西。

其次,我可以设想一种愚蠢的算法,它将最长(在 X 维度中)的框放在底部,然后将最高的(在 Y 维度中)放在它的一侧或另一侧的顶部。然后继续以这种“阶梯式”的方式将它们向右和向上堆叠(例如向右直到不能,然后向上等等)。

这可能并不理想,而且很可能会给你带来不好的结果,但这是首先想到的。

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 2010-09-12
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多