用最小数量的框填充空格的任何算法

时间:2018-03-11 08:07:51

标签: algorithm math optimization grid space

让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时尽可能少的项目!

有这样的算法吗?我敢肯定有一些领域,这种算法会有用,我需要它用于视频游戏。谢谢!!

2 个答案:

答案 0 :(得分:2)

也许可以使用更简单的算法,但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解决,其中整数程序的这些列是动态生成的。

答案 1 :(得分:2)

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

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

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

两个x代表连接的凹顶点。这里最大的独立边集仅包含一条边,将多边形分成两部分。

这是另一个只有一个轴平行边连接两个凹顶点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个矩形作为解决方案。

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

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