有没有人知道任何3D Bin Packing算法?我知道LAFF(大面积适合第一);但是,我需要一个约束条件,即托盘具有固定的宽度和长度(高度是无限的)。在LAFF实现中,它搜索框并找到最大的长度和高度值,然后将其作为固定托盘。
答案 0 :(得分:2)
断头台切割启发式(参见例如this paper)不精确但速度很快 - 当您向容器添加一个盒子时,容器会分成三个不相交的子容器,例如,如果您有一个12x12x12容器并添加了一个8x8x8的盒子,然后你将留下一个12x12x4容器,一个12x8x4容器和一个8x8x4容器。不精确是因为有一些合法的(根据物理定律)这种空间分区不允许的填料(例如,如果你有一个12x12x12的容器和四个12x8x4的盒子,那么断头台将切割容器所以你只能放入12x8x4盒子中的三个。)
当我实现这个时,我使用了一个随机化的最佳拟合递减算法 - 盒子首先按体积按递减顺序排序,然后按周长按递增顺序排序(因此更多类似立方体的盒子先排序,例如8x8x8盒子将在4x8x16框之前)。然后我通过为每个等于Random.nextFloat(1.0 /(itemIndex + 1))的盒子分配一个排序键来随机化这个盒子队列,例如,第一个框将有一个介于0和1.0之间的排序键,第二个框将有一个介于0和0.5之间的排序键等。同样,在插入一个盒子之后对容器进行分区时,我倾向于将容器分区为大致相同或多或少的大小子容器(即具有最小周长的分区)但包括随机元素,因此分区器偶尔会生成一个大的子容器和两个较小的子容器。
然后我并行运行了十几次并选择了最佳结果。但请注意,我的任务只是想出一个估算器 - 对于算法而言,更加重要的是保持一致和快速,而不是准确。
我考虑的更复杂但更精确的算法是extreme points algorithm。我采用了断头台切割算法,因为它更快更容易实现/维护。
答案 1 :(得分:0)
没有什么可以阻止你使用具有无限z维度的固定xy维度的LAFF。 LAFF逐级处理二维盒子以成为3D。
我创建了一个你应该能够修改的LAFF open source project - 或者使用当前代码运行,只需将容器高度设置为Integer.MAX_VALUE即可。计算机中的无限真的不是无限的;)