我一直在尝试解决此问题的2D变体:Box stacking problem
捕获的是,与原始版本不同,不允许同一个框的多个实例。当然,您仍然可以旋转2D矩形。
还有一个高度限制,因此塔必须小于或等于此限制。
另一个方框下方的方框必须大于或等于(不是严格地说更大)。
我一直在尝试应用LIS算法,其他限制似乎已被处理,但我想不出如何解释无重复规则。
所以我的主要问题是,如果你试图最大化堆栈的高度并使其低于限制,你如何解释无重复规则? 感谢
修改
我意识到如果你像为3-D变体那样为每个项目创建两个可能的旋转,这个问题变得非常类似于0-1背包问题。由于必须使用此排序列表按顺序的子集构建最佳塔,因此我们必须选择要采用的塔。但是,我仍然不知道如何确保没有重复。有什么帮助解决这个问题? 感谢
编辑2:
我找到了这个链接:http://courses.csail.mit.edu/6.006/fall10/handouts/recitation11-19.pdf 第4页介绍了如何解决单实例3D最大高度版本,但我认为这不适用于高度限制版本,因为它返回每个调用的最大高度。也许这可以修改以适应高度限制?
答案 0 :(得分:0)
好的,所以我发现解决方案只是0-1样式,除了布尔表后才意识到顺序并不重要,因为任何一组2D矩形都可以分类成一个符合限制的塔。
答案 1 :(得分:0)
任何一组2D矩形都不一定能被分类成符合高度限制的塔。即使它可能仍然需要决定使用哪个方向用于特定的盒子(旋转它以使基座最大,如果它适合,将使更宽的矩形堆叠在顶部但不会那么高。)< / p>
允许多个矩形实例的非0/1版本通过动态编程解决,创建两个矩形,旋转方式不同,对矩形数组进行排序(强制执行部分顺序,如果是矩形i,则使用一个指定的旋转,可以适合在矩形j的顶部,具有指定的旋转,然后我必须小于j)然后计算i = 0 ... n塔可以达到的最大高度ith具有指定旋转的框。
需要部分订单。在0/1情况下,不允许多个矩形/框,似乎你必须生成所有矩形/框的所有可能旋转的集合,对每个矩形/框进行排序并计算其最大高度,这不会违反任何条件,例如通过动态编程,然后跟踪所有子集上可能的最高堆栈高度(请注意,有一些指数的可能子集,如在旅行商问题的动态编程解决方案中,远小于因子数可能的一组排序。)特别是,解决方案http://courses.csail.mit.edu/6.006/fall10/handouts/recitation11-19.pdf似乎不正确:如果我&lt; j但是方向x的方框i可以安装在方框y的方框j的顶部,那么方向x的方框i中结束的最高的方格可能包含方向y的方框j,当H(i,R)时不会考虑算了,与公式相矛盾。
请注意,在0/1情况下创建重复项的策略似乎也失败了,因为您是否可以在第i个框顶部放置第j个框不仅取决于i,还取决于是否存在第j个旋转版本我在堆栈中的盒子。因此,您似乎需要存储不包含任何可能的框子集的最高堆栈,在这种情况下,我们将重新计算每个框子集的最高堆栈。