四角形で覆うグリッド


15

我々は持っているN1×N2のグリッドを。このグリッドには四角形のコレクションがあり、各四角形はN1N2バイナリ行列として表すことができますR。これらの長方形でグリッドをカバーしたいです。

このセットの決定版はNP完全問題をカバーしていますか?

  • 入力:コレクションC={R1,R2,,RL}長方形のグリッド上に(入力サイズ:N1N2L)、及びKN+
  • 出力:サブセットSC|S|K及びSそれをカバーする各セルの少なくとも一つの矩形の含有します。

問題の視覚的な例

1Dの場合(N2=1)は、動的計画法によって多項式時間で解くことができることがわかりました。最適なカバーは、

  • 最初のN1n1セルをカバーするいくつかのサブ問題の最適なカバー。
  • 残りのn1個のセルをカバーする1D長方形、つまり間隔。

しかし、DPが2Dの問題に対して機能することはないと思います。1Dの問題については、部分問題を解決する必要がありますが、2Dについては N 1 + N 2N1副問題(グリッド上の北東ラティスパスの数)。(N1+N2N2)

問題はNPかもしれないと思いますが、(Pより難しいように見えますが)確信がなく、NP完全問題(3-SAT、頂点カバー、...)から多項式縮約を見つけることに成功していません

ヘルプまたはヒントを歓迎します。


3
ヒント:Vertex Coverからの削減を探しますによって| V | ブロックのグリッド。各ブロックは、マトリックス要素の3 x 3ブロックです。ブロックの各行はエッジに対応し、エンドポイントの頂点に対応する2つの特別に設計されたブロックを含みます。各頂点には、高さ3がありますE | 、その頂点に対応する3行3列のブロックの列の中央の列を通過する幅1の長方形。どのように有効な任意の総強制することができますk個の厳密にコストに-vertexカバーを| E | | V | + 3 |E||V|3|E|k?(他の四角形が必要になります。)|E|(|V|+3)+k
j_random_hacker

これはおそらく宿題の練習だと思うので、今のところそれ以上のことを言うのは少し気が進まない。私が与えたコスト式には、いくつかの手がかりがあります。いくつかの長方形を、マトリックス要素をカバーする唯一の長方形にすることで、少なくとも1つの長方形を強制できることに注意してください(1つの長方形の特殊なケースも役立ちます)。FWIW、私も使用してみました-by- | V | グリッド最初、ここで頂点を選択する行を「アウト交差」と列に対応するに対応するであろうが、強制する方法を見つけ出すことができなかった時に選択される列目のI番目の行が選択され、またはその逆れます。|V||V|ii
j_random_hacker

と同じ問題がありました-by- | V | グリッド。私はあなたがどんな種類の解決策を考えているのかを見ていると思います(ただし、まったく同じコスト式はありません)、私の編集を参照してください。ちなみに、それは宿題の練習ではありません。これは、実際のエンジニアリングの問題に現れた組み合わせの問題です。MIPで解決しますが、問題がNPであること(および多項式解がないこと)を確認したかったです。いずれにせよ、解決策が有効であることを確認したら、ヒントを回答として入力して検証します(解決策が見つかったため)。|V||V|
ヤン

1
はい、それはまさに私が念頭に置いていた削減です!:)私はあなたの「タイプ4」の長方形を一端でわずかに長くしました:あなたのブロックが2つのセルを占め、私のすべてを3占有します。エンドブロックの特別な「タイプ3」の長方形の代わりに「タイプ2」長方形のように。最後に、各左エンドブロック内の中央左と左下のセルを占める長方形があります(右エンドブロックごとに水平に反転)。そのため、or パターンを使用して、エンドブロックを含むすべてのブロックの下2行をカバーできます。a<j<b|==|
-j_random_hacker

1
私はあなたが好きです-by- 3 | V | 削減のアイデア。これにより、3とは異なりますE | -by- 3 | V | 削減、頂点カバーに対応しない最小コストのソリューションが存在する可能性がありますが、そのようなソリューションはすべて、最後の箇条書きと同じ引数を使用して同等の(最小)コストのソリューションに変換できるため、これはそうではありません削減の問題:)|E|3|V|3|E|3|V|
j_random_hacker

回答:


4

j_random_hackerのヒントのおかげで、Vertex Coverをグリッドの問題に減らす解決策を見つけました。

私たちはを作ります E | -by- | V | 3行3列のブロック、つまり3 | E | -by- 3 | V | { v 1v N 1 }として頂点を並べ、行{ e 1e N 2 }として辺を並べたグリッド。このグリッド上に四角形を作成します(下の図は、使用されているさまざまな四角形を理解するのに役立ちます)|E||V|3|E|3|V|{v1,,vN1}{e1,,eN2}

enter image description here

|V|

(ei,vj)ei=(va,vb)

  • j<ab<j
  • もし(RESP。J = B)、これは左の被覆3行1矩形(それぞれ右)ブロックのカラムです。j=aj=b
  • 場合< J < B、これはブロックの先頭行をカバーする1×3の長方形です。a<j<b

我々は持っているのでタイプ2の長方形は、それらが入っているブロックの左上(または右上)の唯一のカバーになるため、選択する必要があります。|E||V|

前述のように、各エッジは行に対応し、頂点およびe iv bの端点に対応する2つのブロック(それらをエンドブロックと呼びます)で、タイプの長方形があります3:(ei,va)(ei,vb)

  • エンドブロック(それぞれe iv b)の場合、エンドブロックの右上(または左上)の隅を覆う1行2列の長方形があります。(ei,va)(ei,vb)

2|E|

次に、各エッジについて、エンドブロック間にタイプ4の長方形を作成し、2番目の行に2つの長方形を作成します。

  • 最初のブロックの中央の正方形から2番目のブロックの中央の左の正方形に移動します。
  • 最初のブロックの中央の正方形から2番目のブロックの中央の正方形に移動します。
  • 3行目の同じ2つの長方形。

4|E|

それで、グリッドをカバーするために:

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

特定のエッジについて、まだカバーされていないエッジエンドブロックの間の部分(ブロックの行の2行目と3行目)をカバーするには、次のいずれかを使用できます。

  • タイプ4の4つの長方形。
  • タイプ1の1つの長方形とタイプ4の2つの長方形。

いずれにしても、タイプ4の長方形が少なくとも2つ必要であることに注意してください。

したがって、コスト関数は次のようになります。 |E||V|+4+k

  • それらがk未満の頂点を持つ有効な頂点カバーである場合: |E||V|+2必須の長方形、オプションの長方形には、頂点カバーに対応するタイプ1の長方形を使用できます。すべての行には、タイプ4の長方形が2つだけ必要です(タイプ1の長方形が既にあります)。したがって、グラフに有効な頂点カバーがある場合、グリッドには有効なカバーセットがあります。

  • グリッドに有効なカバーセットがある場合(より少ない |E||V|+4+k)長方形、次に各エッジについて、タイプ1の長方形(エッジは「覆われている」)またはタイプ4の4つの長方形があります。その場合、それらの2つをタイプ1の1つの長方形に置き換えることができます。まだ有効なカバーがあります |E||V|+4+k rectangles. By iterating this process, we reach a valid solution with no row using four rectangle of type 4, from which we can obtain a valid vertex cover.

So the vertex cover can be reduced to the grid cover. And the grid problem instance can be encoded by |E|(|V|+6)+|V| covers on a grid with 9|V||E| elements, so the reduction is polynomial and the grid problem is NPC.

PS : I noticed after writing this answer that a lot of rectangles are actually useless and much simpler reduction can be made using a |E|-by-3|V| grid with |V|+4|E| covers, using cost function 3|E|+k

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.