我正在开发一个空间优化软件。它应该能够以最优的方式在较大的空间中安排小体积。有一些限制,例如一个体积不能移动或者应该“躺在”另一个体的内侧面上,或者它不能被另一个体积等等......
每个体积都表示为一个3d轴对齐的边界框,或一组较小的3d AABB(它们组合成一个更复杂的体积)。
我一直在考虑使用回溯来解决这个问题(特别是分支定界技术)但是它在速度方面太过贪婪,就像在内存方面一样(即使是过于简单的使用)。
有没有人知道一种适合这个问题的替代技术?
我不在乎......但我确信这些软件存在,所以有一种方法(我不知道)。
感谢任何帮助,谢谢。
答案 0 :(得分:1)
是的,这个问题有“解决方案”,它们是大企业。很好地解决这个问题可以为你赚到很多钱,因为它是NP难的并且非常有用。 http://en.wikipedia.org/wiki/Bin_packing_problem
我的第一个想法是以离散的线性编程方式重新解决问题,这已经完成,如果您有权访问,请参阅下面的参考。
Mhand Hifi,Imed Kacem,Stephane Negre,Lei Wu(2010)“三维装箱问题的线性规划方法”离散数学电子笔记,36,993-1000
答案 1 :(得分:0)
如果你还没看过,我建议你看看动态编程方法。您的问题听起来类似于“Cutting Cloth”问题,这是典型的动态编程问题。这是切割布料的问题:
切布。给你一块长方形布 维度X Y,其中X和Y是正整数,以及列表 n可以用布料制作的产品。对于每种产品i 2 [1; n]你知道需要一个尺寸为ai bi的矩形布 并且产品的最终售价是ci。假设 ai,bi和ci都是正整数。你有一台机器可以 将任何矩形布块水平切成两块 或垂直的。设计一种确定最佳回报的算法 X Y的布料,也就是切割布料的策略 由最终产品制成的产品给出了最大的总和 售价。您可以自由制作给定的副本 产品如您所愿,或者如果需要也不需要。
以下是我将切割布问题划分为子问题的方法:
V( i,j) = max { V(i - ai, j- bi ) + ci,
V(i - bi, j - ai ) + ci
}