矩形覆盖的网格


15

我们有一个N1×N2网格。我们对此网格矩形的集合,每一个矩形可被表示为一个N1 -by- N2二进制矩阵R。我们想用这些矩形覆盖网格。

该集合覆盖问题的决策版本是否是NP-完整的?

  • 输入:收集C={R1,R2,,RL}在网格的矩形(输入尺寸:N1N2L),和KN+
  • 输出:子集SC|S|KS包含每个小区的至少一个矩形覆盖它。

直观的问题示例

我发现一维情况(N2=1)可以通过动态编程在多项式时间内求解:任何最优覆盖都将是

  • 覆盖前N1n1单元的某些子问题的最优覆盖。
  • 一个1D矩形,即一个间隔,覆盖剩余的n1元。

我认为DP不能解决2D问题:对于1D问题,您有个子问题要解决,但是对于2D问题,您有子问题(东北数网格上的晶格路径)。N1(N1+N2N2)

我认为问题可能是NP,但是我不确定(尽管看起来比P难),而且我还没有成功地从NP完全问题(3-SAT,顶点覆盖等)中找到多项式约简。

欢迎任何帮助或提示。


3
提示:在“顶点覆盖”中寻找一个减少量,在其中创建一个由块的网格,每个块都是3 x 3的矩阵元素块。每行块对应一个边,并且将包含2个专门设计的块,这些块对应于其端点顶点。每个顶点的高度为,宽度1的矩形,该矩形穿过与该顶点对应的3×3块的列的中心列。您如何才能强制任何有效的顶点覆盖的总和恰好是?(您将需要其他矩形。)| V | 3 | E | k | E | | V | + 3 + k|E||V|3|E|k|E|(|V|+3)+k
j_random_hacker

我认为这可能是一项家庭作业,因此我现在不愿多说。我给出的成本公式有一些线索。请记住,您可以通过使多个矩形成为覆盖某些矩阵元素的唯一矩形来强制使用其中的至少一个矩形(1个矩形的特殊情况也很有用)。FWIW,我也尝试使用-by-格第一,其中选择一个顶点将对应于“划掉”的行和对应的列,但无法弄清楚如何强制当被选择第柱被选择或副-th行也一样。| V | |V||V|ii
j_random_hacker

我对有同样的问题 -by-网格。我想我想出了您要考虑的解决方案(尽管我没有完全相同的成本公式),请参见我的编辑。顺便说一句,这不是一项家庭作业。这是一个组合问题,出现在现实生活中的工程问题中。我们用MIP解决了这个问题,但是我想确定问题是NP(并且没有多项式解)。无论如何,如果您确认解决方案有效,则可以将提示作为答案,然后我将对其进行验证(因为我在您的帮助下找到了解决方案)。| V ||V||V|
Yann

1
是的,这几乎就是我所想到的减少!:)我使您的“类型4”矩形的一端稍长一些:您的“类型4”矩形在一个块中占据了2个单元格,而我的矩形则占据了全部3个单元。如 “类型2”矩形。最后,我有一个矩形,在每个左端块中占据了左中和左下角的单元格(对于每个右端块都水平翻转了)。因此,您可以使用或模式覆盖所有块的底部2行,包括端块之间以及端块之间。a<j<b|==|
j_random_hacker

1
我喜欢你的-by-减少想法。这样,与-by-减少,可能存在与顶点覆盖不对应的最低成本解决方案-但是可以使用与上一个项目符号点相同的参数将所有此类解决方案转换为等价(最低成本)解决方案,因此这不是减少的问题:)3 | V | 3 | E | 3 | V ||E|3|V|3|E|3|V|
j_random_hacker

Answers:


4

感谢j_random_hacker的提示,我找到了一种解决方案,可以将“顶点覆盖”减少到网格问题:

我们-by-3 x 3块的网格,即-by-网格,其顶点按列排序,边按行{ e 1e N 2 }排序。我们将在此网格上构造矩形(下图将有助于您理解所使用的不同矩形)| V | 3 | E | 3 | V | { v 1v N 1 }|E||V|3|E|3|V|{v1,,vN1}{e1,,eN2}

在此处输入图片说明

对于每个顶点,我们创建一个类型为1的矩形,该矩形覆盖与该顶点对应的块的列的中心列,因此类型1的矩形|V|

每个块对应一个唯一的对,对于每个块e i = v av b,我们添加一个类型2的矩形:(ei,vj)ei=(va,vb)

  • 如果b < j,则这是一个3 x 3的矩形,覆盖整个块。j<ab<j
  • j=aj=b
  • a<j<b

|E||V|

(ei,va)(ei,vb)

  • (ei,va)(ei,vb)

2|E|

现在,对于每个边缘,我们在端块之间构造类型为4的矩形,第二行有两个矩形:

  • 从第一个块的中心正方形到第二个块的左中心正方形。
  • 从第一个块的右中角正方形到第二个块的中央正方形。
  • 和第三行相同的两个矩形。

4|E|

所以现在,覆盖网格:

  • |E|(|V|+2)|V|+4|E|

为了覆盖给定的边缘,尚未覆盖的边缘端块之间的部分(块行的第二行和第三行),我们可以使用:

  • 类型4的四个矩形。
  • 类型1的一个矩形和类型4的两个矩形

请注意,无论如何,我们至少需要两个4型矩形。

|E|(|V|+4)+k

  • |E|(|V|+2)

  • |E|(|V|+4)+k|E|(|V|+4)+k

|E|(|V|+6)+|V|9|V||E|

|E|3|V||V|+4|E|3|E|+k

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.