【问题标题】:Any algorithm to fill a space with smallest number of boxes用最少数量的框填充空间的任何算法
【发布时间】:2026-01-07 11:45:02
【问题描述】:

让 3D 网格,就像棋盘一样,具有额外的维度。现在假设我在该网格中有一定数量的立方体,每个立方体占据 1x1x1 单元格。假设这些立方体中的每一个都是一个项目。

我想做的是将这些立方体替换/组合成更大的盒子,在 X、Y 和 Z 轴上占据任意数量的单元格,以便在保持整体“外观”的同时尽可能少的盒子数量”。

可能不清楚,所以我将举一个 2D 示例。假设我有一个 2D 网格,其中包含几个占据 1x1 单元格的正方形。一个字母代表给定项目占用的单元格,每个项目都有一个与其他项目不同的字母。在第一个示例中,我们有 10 个不同的项目,每个项目占据 1x1x1 的单元格。

+---+---+---+---+---+---+
|   |   |   |   |   |   |
+---+---+---+---+---+---+
|   | A | B | C | D |   |
+---+---+---+---+---+---+
|   | E | F | G | H |   |
+---+---+---+---+---+---+
|   |   | K | L |   |   |
+---+---+---+---+---+---+
|   |   |   |   |   |   |
+---+---+---+---+---+---+

这是我的输入数据。我现在可以通过多种可能的方式对其进行优化,即减少项目的数量,同时仍然占据相同的单元格,其中一种可能是:

+---+---+---+---+---+---+
|   |   |   |   |   |   |
+---+---+---+---+---+---+
|   | A | B | B | C |   |
+---+---+---+---+---+---+
|   | A | B | B | C |   |
+---+---+---+---+---+---+
|   |   | B | B |   |   |
+---+---+---+---+---+---+
|   |   |   |   |   |   |
+---+---+---+---+---+---+

在这里,我只有 3 个(即 A、B 和 C),而不是 10 个项目。但是它可以进一步优化:

+---+---+---+---+---+---+
|   |   |   |   |   |   |
+---+---+---+---+---+---+
|   | A | A | A | A |   |
+---+---+---+---+---+---+
|   | A | A | A | A |   |
+---+---+---+---+---+---+
|   |   | B | B |   |   |
+---+---+---+---+---+---+
|   |   |   |   |   |   |
+---+---+---+---+---+---+

这里我只有两个项目,A 和 B。这是尽可能优化的。

我正在寻找的是一种能够找到最佳项目大小和排列的算法,或者至少是一个相当好的算法,以便我在占据相同单元格的同时拥有尽可能少的项目,并且是 3D 的!

有这样的算法吗?我确信在某些领域这种算法会很有用,我需要它来制作视频游戏。谢谢!!

【问题讨论】:

  • 你有二维案例的最佳解决方案吗?
  • 也许K-Map 可以给你一个开始的想法。但是,它是 2D 的,它并不适用每个盒子应该只属于一个集合的条件。

标签: algorithm math optimization grid space


【解决方案1】:

也许更简单的算法是可能的,但set partition 就足够了。

Min       x1 + x2 + x3 + ... //where x1 is 1 if the 1th partition is chosen, 0 otherwise
such that x1 +    + x3 = 1// if 1st and 3rd partition contain 1st item
               x2 + x3 = 1//if 2nd and 3rd partition contain 2nd item and so on.

          x1, x2, x3,... are binary

每个项目都有 1 个约束。每个约束都规定每个项目可以恰好是一个盒子的一部分。目标是最小化盒子的总数。

然而,这是一个 NP Hard 整数规划。

这个问题中的变量数量可能是指数级的。您需要有一种有效的方法来枚举它们——即确定何时可以找到一个能够包含其中所有点的连续框。在这里,您必须考虑诸如网格是 2d 还是 3d、如何定义连续“框”等信息。

此类问题通常由column-generation 解决,其中整数程序的这些列是动态生成的。

【讨论】:

    【解决方案2】:

    如果我理解 David Eppstein 的1 explanation (see section 3),那么可以在将一个凹顶点连接到另一个凹顶点的轴对齐对角线的二部相交图中的最大独立集合中找到解决方案。 (这将是 2d。我不确定 3d,尽管它可能涉及评估超平面而不是线?)

    在你的例子中,只有一个这样的对角线:

     ________
    |        |
    |_x....x_|
      |____|
    

    两个xs 代表连接的凹顶点。这里最大的独立边集只包含一条边,将多边形一分为二。

    这是另一个只有一条平行轴边连接两个凹顶点xx。不过,这个多边形也有两个凹顶点ab,它们没有相反的轴平行匹配。在这种情况下,在我看来,没有伙伴的每个凹顶点都会将它所在的多边形分成两部分(垂直或水平):

     ____________
    |            |
    |            |x
    |            . |
    |            . |a
    |___         .   |
       b|        .   |
        |        .___|
        |________|x
    

    生成 4 个矩形:

     ____________
    |            |
    |            |x
    |            . |
    |            ..|a
    |___..........   |
       b|        .   |
        |        .___|
        |________|x
    

    这里有两个相交的轴平行对角线,每个对角线连接两个凹顶点(x,x)(y,y)

     ____________
    |            |
    |            |x_
    |            .  |
    |            .  |
    |___ . . . .z. .|y
       y|        .    |
        |        .____|
        |________|x
    

    在这种情况下,据我了解,交集图再次只包含一个独立集:

    (y,z) (z,y) (x,z) (z,x)
    

    产生 4 个矩形作为解决方案。

    由于我不完全确定论文中的“交集图”是如何定义的,我欢迎任何澄清的 cmets。

    1。计算几何问题的图论解决方案,David Eppstein(2009 年 8 月 26 日提交)

    【讨论】:

    最近更新 更多