繁体   English   中英

3d 装箱算法

[英]3d Bin Packing Algorithms

有谁知道任何 3D Bin Packing 算法? 我知道 LAFF(大面积适合第一); 但是,我需要一个限制条件是托盘具有固定宽度和长度(高度是无限的)。 在 LAFF 实现中,它搜索框并找到长度和高度的最大值,然后将其设为固定托盘。

LAFF算法

断头台切割启发式(例如参见本文)不精确但速度很快 - 当您向容器中添加一个盒子时,容器会被分成三个不相交的子容器,例如,如果您有一个 12x12x12 的容器并添加了一个 8x8x8 的盒子,那么您将得到一个 12x12x4 容器、一个 12x8x4 容器和一个 8x8x4 容器。 不精确是因为有一些合法的(根据物理定律)包装不允许这种空间分区(例如,如果你有一个 12x12x12 的容器和四个 12x8x4 的盒子,那么断头台切割将分隔容器这样您只能放入三个 12x8x4 盒子中)。

当我实现这个时,我使用了一个随机的最佳拟合递减算法——盒子首先按体积降序排序,然后按周长升序排序(所以更多的立方体状盒子首先被排序,例如一个 8x8x8 的盒子将在一个 4x8x16 的盒子之前)盒子)。 然后我通过为每个盒子分配一个等于 Random.nextFloat(1.0 / (itemIndex + 1)) 的排序键来随机化这个盒子队列,所以例如第一个盒子将有一个介于 0 和 1.0 之间的排序键,第二个盒子将有一个排序键介于 0 和 0.5 之间,等等。同样,在插入一个盒子后对容器进行分区时,我倾向于将容器划分为大小相同的子容器(即具有最小周长的分区),但包含一个随机元素,以便有时,分区器会生成一个大的子容器和两个较小的子容器。

然后我并行运行了十几次并选择了最好的结果。 但是请注意,我的任务只是提出一个估计器 - 算法的一致性和快速性比准确更重要。

我考虑过的一种更复杂但更精确的算法是极值点算法 我采用了断头台切割算法,因为它更快、更容易实现/维护。

没有什么能阻止您使用具有无限 z 维度的固定 xy 维度的 LAFF。 LAFF 逐层拟合 2D 中的框以变为 3D。

我创建了一个LAFF 开源项目,您应该可以修改它——或者使用当前代码运行,只需将容器高度设置为 Integer.MAX_VALUE。 计算机中的无限真的不是无限的 ;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM