网格算法拼图

时间:2012-03-20 23:06:52

标签: algorithm geometry

我有一些宽度和高度的网格,其中每个单元格可以有三个可能的值(在此图中显示为白色,绿色和红色):

illustration http://corexii.com/grid-algorithm-problem-2.png

您可以选择任意数量的绿色单元格(下图中标记为蓝色),其中包含预定方形半径内的所有红色单元格(标记为黄色)(此处 2 < / strong>)围绕选定的单元格:

illustration http://corexii.com/grid-algorithm-problem-3.png

目标是:

  • 尽可能多地覆盖红细胞
  • 使用尽可能少的蓝色细胞
  • 尽可能快地完成

任何人对算法都有任何想法吗?

我正在研究很多理论,但我最感兴趣的是近似快速 而不是准确。一个快速,合理的结果比整天计算最佳结果更可取。

(上面的插图可能会显示这些细胞的最正常分布,但不应假设它们与所有可能的分布类似。)

1 个答案:

答案 0 :(得分:10)

这个问题是重要的NP-hard set cover problem的一个特例。 (宇宙由红色单元组成,每个集合由一个绿色单元的半径内的红色单元组成。)greedy algorithm位于最佳 n 因子内结果


templatetypedef is right to point out这个问题是NP难问题的一个特例并不能证明它实际上也是NP难的。这就是为什么我在上面的措词中小心谨慎而不是暗示后者。但作为一个NP难问题的一个特例是一个不容忽视的信号:许多特殊情况在进一步调查中变得非常难以实现。

因此,这是一个粗略的草图,这个问题实际上是NP难的,通过减少最多四度的平面图的VERTEX封面。

假设我们有一个最多四度的平面图,例如:

Four vertices connected a-b-c-d-a and a-d

用绿色正方形表示每个顶点,每个边缘用红色和绿色正方形的交替链,这样就有偶数个绿色正方形,奇数个红色正方形,每个绿色正方形只覆盖两个如果选择的话,两边都是红色方块。半径为2时,这是图表的一种可能表示:

representation of original graph in terms of the covering problem

为了覆盖所有红色方块,我们需要在每条链上选择至少一半绿色方块,对应于原始图形的边缘。如果我们在每条链上选择正好一半的绿色方块,那么在每条边的一端留下一个未被覆盖的红色方块(我们可以选择哪一端)。因此,如果我们能够找到最小的顶点集,使得每个边都入​​射到该集合中的顶点,我们就得到最小的绿色方块集。

在示例中,如果我们选择顶点 a d ,我们可以使用八个绿色方块覆盖红色方块:

minimum cover with eight green squares selected and coloured blue

这对应于原始图中的最小顶点覆盖:

minimum vertex cover