【问题标题】:box stacking in graph theory图论中的盒子堆叠
【发布时间】:2011-05-30 21:59:10
【问题描述】:

请帮我找到解决这个问题的好办法。

我们有 n 个 3 维的盒子。我们可以定位它们,并且我们希望将它们放在另一个之上以获得最大高度。如果 2 个维度(宽度和长度)小于下面盒子的尺寸,我们可以将一个盒子放在另一个盒子的顶部。

例如,我们有 3 个维度 w*D*h,我们可以将其显示为 (h*d,d*h​​,w*d,d*W,h*w,w*h) 请帮我用图论解决它。 在这个问题中,我们不能将(2*3)放在(2*4)之上,因为它具有相同的宽度。所以二维应该小于盒子

【问题讨论】:

标签: algorithm graph graph-algorithm


【解决方案1】:

编辑:仅当框不能围绕所有轴旋转时才有效。

如果我正确理解了这个问题,它可以通过动态规划来解决。查找最大堆栈高度的简单算法是:

首先旋转所有框,使得对于框 B_i,w_i

现在根据底部区域 w_i * d_i 对框进行排序,并让索引显示这一点。这需要时间 O(n log n)。

现在 B_i 只有在 i

顶部有 B_j 的最大堆栈是

  • B_j 在地上
  • 由前 j-1 个盒子组成的堆栈,顶部是 B_j。

现在我们可以创建一个递归公式来计算最大堆栈的高度

H(j) = max (h_j, max (H(i)|i

通过计算 max (H(j),i

如果我们想要实际的堆栈,我们可以将一些信息附加到 H 函数并记住索引。

【讨论】:

  • 我认为你错过了一个重要的事实,即盒子可以任意旋转,这样宽度就可以变成高度,反之亦然。
  • @utdiscant 对你的公式进行小修正 H(j) = max (h_j, max (H(i)|i
【解决方案2】:

已更新(正确?但可能不是最有效的):

每个盒子变成3个顶点(称这些顶点相关)。获取加权 DAG。修改here描述的算法 拓扑排序(忽略某些顶点相关的事实),遵循算法,但不是整数数组,而是保留通向每个顶点的路径列表。然后,当为新顶点添加路径时(wiki alg 中的“w”),通过删除包含与 w 相关的顶点的 v 的路径来制作通往那里的路径列表。 与原始算法不同,这个算法是指数的。

原始错误答案(见 cmets):

每个盒子的 3 个表面尺寸都变成 3 个节点。然后创建一个有向图,将每个表面连接到所有较小尺寸的表面。将价格分配给每条边,使其等于边所通向的节点的第三维(即高度)。现在这是寻找longest path problem in a DAG的问题。

【讨论】:

  • 不完全是,因为如果您使用一个节点,则会排除另外两个节点。
  • @Keith Randall 好点!所以不要将盒子分成3个节点。由于我们将权重分配给边,而不是节点,边权重只是从源节点到目标节点可达到的最大高度。因此,如果 A 大于 B,则从节点 A 和 B 到节点 X 可能对 A 具有更高的权重。所以它仍然是 DAG 中可在多项式时间内求解的最长路径。
  • @Keith Randall 不,没关系,这也不起作用,因为权重取决于我们如何到达节点 A 和 B。该死,如此接近!
  • 我认为这也行不通。所以每个节点都是一个盒子,可以在 3 个方向中的任何一个。没有限制使用入站边缘的框的方向与使用出站边缘的框的方向相同。你的边缘可以假设盒子又高又薄,你的边缘可以假设盒子又宽又短。
  • @Keith Randall 嘿,这个怎么样。回到分裂成 3 个顶点(称它们为“相关”)。拓扑排序(忽略某些节点相关的事实),并运行动态编程算法(如en.wikipedia.org/wiki/… 所述),但不是整数数组,而是保留通向每个顶点的路径列表。然后,当为一个新顶点添加生成路径时(wiki alg 中的“w”),通过删除包含与 w 相关的顶点的 v 的路径来创建一个路径列表。这将不再是多项式时间..
猜你喜欢
  • 2013-11-29
  • 2013-02-24
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2023-03-13
相关资源
最近更新 更多