【问题标题】:2D Box stacking no duplicates with height limit二维盒子堆叠没有高度限制的重复项
【发布时间】:2013-01-30 20:02:33
【问题描述】:

我一直在尝试解决这个问题的二维变体:Box stacking problem

要注意的是,与原来的不同,同一个框的多个实例是不允许的。当然,您仍然可以旋转 2D 矩形。

还有一个高度限制,所以塔必须小于或等于这个限制。

一个盒子在另一个盒子下方的底边必须大于或等于(严格来说不大于)它。

我一直在尝试应用 LIS 算法,其他限制似乎得到了处理,但我想不出如何解释无重复规则。

所以我的主要问题是,如果您试图最大化堆栈的高度并将其保持在限制以下,您如何解释无重复规则? 谢谢

编辑:

我意识到,如果您为每个项目创建两个可能的旋转,就像您为 3-D 变体所做的那样,这个问题变得非常类似于 0-1 背包问题。由于必须使用此排序列表的子集按顺序构建最佳塔,因此我们必须选择要使用的塔。但是,我仍然不知道如何确保没有重复。解决这个问题有什么帮助吗? 谢谢

编辑 2:

我找到了这个链接:http://courses.csail.mit.edu/6.006/fall10/handouts/recitation11-19.pdf 第 4 页描述了如何解决单实例 3D 最大高度版本,但是我认为这不适用于高度限制版本,因为它会返回每次调用的最大高度。也许这可以修改以适应高度限制?

【问题讨论】:

  • 不清楚目标是什么。单个堆栈中低于限制的最多盒子?正常问题表明目标是可能的最高堆栈,但由于我们在这里有一个“限制”,所以目标必须不同。
  • 是的,目标仍然是低于高度限制的最高堆栈。
  • @TylerDurden,是的。

标签: algorithm dynamic-programming


【解决方案1】:

任何一组 2D 矩形都不一定会被分类成遵守高度限制的塔。即使可以,您仍然需要决定对特定盒子使用哪个方向(旋转它以使底座最大,如果合适的话,可以使更宽的矩形堆叠在顶部,但不会那么高。)

允许多个矩形实例的非 0/1 版本通过动态编程解决,方法是创建两个矩形,以不同方式旋转,对矩形数组进行排序(强制偏序,因此如果矩形 i,与指定的旋转,可以适合矩形 j 的顶部,具有指定的旋转,然后 i 必须小于 j),然后计算 i=0...n 可以通过以具有指定旋转的第 i 个框。

需要部分顺序。在 0/1 情况下,不允许多个矩形/框,似乎您必须生成所有矩形/框的所有可能旋转的集合,对每个矩形/框进行排序并计算其最大高度,这不违反任何条件,例如通过动态规划,然后跟踪所有子集上可能的最高堆栈高度(请注意,可能的子集是指数级的,就像在旅行商问题的动态规划解决方案中一样,它远小于阶乘数集合的可能排序。)特别是,解决方案http://courses.csail.mit.edu/6.006/fall10/handouts/recitation11-19.pdf 似乎不正确:如果 i

请注意,在 0/1 情况下,创建重复项的策略似乎也失败了,因为您是否可以将第 j 个框放在第 i 个框的顶部,这不仅取决于 i,还取决于是否存在第 j 个的旋转版本堆栈中 i 下方的框。因此,您似乎需要存储不包含任何可能的盒子子集的最高堆栈,在这种情况下,我们将返回计算每个盒子子集的最高堆栈。

【讨论】:

    【解决方案2】:

    好的,所以我发现解决方案只是 0-1 样式,但在意识到顺序并不重要后使用布尔表,因为任何一组 2D 矩形都可以分类到遵守限制的塔中。

    【讨论】:

    • 你能详细解释一下吗
    猜你喜欢
    • 2013-02-24
    • 2016-07-26
    • 2016-02-04
    • 2018-05-01
    • 1970-01-01
    • 2017-05-07
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多