网格算法拼图

Cor*_*Xii 8 algorithm geometry

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

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

您可以选择任意数量的绿色单元格(下图中标记为蓝色),其中覆盖所选单元格周围预定方形半径(此处为2)的所有红色单元格(标记为黄色):

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

目标是:

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

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

我正在研究很多理论,但我最感兴趣的是近似快速而非准确地做到这一点.快速,合理的结果比整天计算最佳结果更可取.

(上面的插图可能会显示这些单元格的最正态分布,但不应假设它们类似于所有可能的分布.)

Gar*_*ees 10

这个问题是重要的NP-hard set cover问题的一个特例.(宇宙由红色单元组成,每个集合由一个绿色单元的半径内的红色单元组成.)贪婪算法在最佳结果的log n因子内.


templatetypedef是正确的指出,这个问题是NP难问题的一个特例,并不能证明它实际上也是NP难的.这就是为什么我在上面的措词中小心谨慎而不是暗示后者.但作为一个NP难问题的一个特例是一个不容忽视的信号:许多特殊情况转向进一步调查,本身就是NP难的.

因此,这是一个粗略的草图,这个问题实际上是NP难的,通过减少VERTEX封面,最多可以获得四分之一的平面图.

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

四个顶点连接abcda和ad

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

根据覆盖问题表示原始图

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

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

最小封面,选择八个绿色方块,蓝色

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

最小顶点覆盖

  • 事实上,这是集合覆盖的特殊情况并不意味着它在计算上难以解决.例如,2SAT是SAT的特例,但具有线性时间解决方案. (2认同)