【发布时间】:2013-07-23 17:37:18
【问题描述】:
根据我对垃圾箱包装的理解,您正在尝试将预先确定且通常不同尺寸的物体装入一个或多个容器或预先确定固定尺寸的“箱”中。我有一个问题,我有一个固定大小的容器和必须适合它的固定数量的元素。不同之处在于我的元素不是固定大小,但可以调整为特定大小的任意倍数数字。例如:
假设我有 3 个对象或元素,它们必须完全适合 280x420 的容器,并且对象的大小必须重新调整为 140 的倍数。
因此,它可以这样放置:(或垂直翻转)
+----------+----------+
| 140x140 | 140x140 |
| | |
| | |
+----------+----------+
| 280x280 |
| |
| |
| |
| |
+---------------------+
或:(或水平翻转)
+----------+----------+
| 140x210 | 140x420 |
| | |
| | |
| | |
+----------+ |
| 140x210 | |
| | |
| | |
| | |
+----------+----------+
最终,每个盒子的大小将根据统计数据动态确定。 (例如,如果一个项目有 90% 的统计数据,而另外两个有 2% 和 8% 的统计数据,那么显然 90% 会得到更大的盒子。)但是,我尽量不要过于复杂还没有,所以创建一个填充容器的算法是我现在的主要目标。
我一直在研究不同的算法,但还没有想出一个理想的方法来尝试这个。任何指针?例子?现有的数学或其他类似的算法?
一个更复杂的例子是:6 个项目,560x420 的容器。
元素 JSON:
{ "0": "432", "1": "389", "2": "403", "3": "190", "4": "215", "5": "832" }
一种可能的渲染:
+----------+----------+---------------------+
| 140x280 | 140x140 | 280x140 |
| (0,1, | (3 or 4) | (2) |
| or 2) | | |
| | | |
| +----------+---------------------+
| | 140x140 | 280x280 |
| | (3 or 4) | (5) |
| | | |
| | | |
+----------+----------+ |
| 280x210 | |
| (0,1, or 2) | |
| | |
| | |
+---------------------+---------------------+
【问题讨论】:
-
当您说“根据统计确定”时,您是指发生频率吗?只是好奇。
-
另外,由于 bin 打包通常是 NP 难的,您是在寻找精确的解决方案,还是近似值足够好?
-
通过“基于统计数据确定”,我的意思是我将从数据库中提取数字,数字较大的将获得较大的正方形。不确定您在第二个问题中到底要问什么。但基本上,如果您想象 Windows 8 Metro UI/开始屏幕是动态构建的,并且具有根据用户使用程序的频率(或其他一些可用的数字/统计数据)缩放的磁贴,我可以解释的最简单的方法)。每个图块都按一定倍数缩放以适应网格。 (唯一的区别是它没有宽度限制)
标签: javascript algorithm bin-packing