Gitterabdeckung durch Rechtecke


15

Wir haben ein N1×N2 -Gitter. Wir haben eine Sammlung von Rechtecken auf diesem Gitter, jedes Rechteck kann als eine N1 mal- -binäre N2Matrix . Wir wollen das Gitter mit diesen Rechtecken abdecken.R

Deckt die Entscheidungsversion dieses Sets das Problem NP-complete ab?

  • Eingabe: Sammlung von Rechtecken im Raster (Eingabegröße: ) undC={R1,R2,,RL}N1N2LKN+
  • Ausgabe: wobei und für jede Zelle mindestens ein Rechteck enthalten, das sie abdeckt.SC|S|KS

Visuelles Beispiel für das Problem

Ich fand heraus, dass der 1D-Fall ( ) durch dynamische Programmierung in Polynomzeit gelöst werden kann: Jede optimale Abdeckung wird die Vereinigung von seinN2=1

  • eine optimale Abdeckung für einige Unterprobleme der Abdeckung der ersten N1n1 -Zellen.
  • ein 1D-Rechteck, dh ein Intervall, das die verbleibenden n1 Zellen abdeckt .

Ich glaube jedoch nicht, dass DP für das 2D-Problem funktionieren kann: Für das 1D-Problem müssen Sie N1 Unterprobleme lösen, aber für 2D haben Sie(N1+N2N2) -Unterprobleme (Anzahl der Nordost-Probleme) Gitterpfade auf dem Gitter).

Ich denke, das Problem könnte NP sein, aber ich bin nicht sicher (obwohl es schwieriger zu sein scheint als P), und es ist mir nicht gelungen, eine Polynomreduktion von einem NP-vollständigen Problem (3-SAT, Vertex Cover, ...) zu finden.

Jede Hilfe oder jeder Hinweis ist willkommen.


3
Hinweis: Suchen Sie nach einer Verkleinerung aus Vertex Cover, in der wir ein erstellen E | von | V | Gitter von Blöcken, von denen jeder ein 3 × 3-Block von Matrixelementen ist. Jede Blockreihe entspricht einer Kante und enthält zwei speziell entworfene Blöcke, die den Endpunktscheitelpunkten entsprechen. Für jeden Scheitelpunkt gibt es eine Höhe von 3 | E | Breite-1-Rechteck, das durch die mittlere Spalte der Spalte mit 3 mal 3 Blöcken verläuft, die diesem Scheitelpunkt entsprechen. Wie können Sie die Summe aller gültigen k- vertex-Deckungen genau berechnen lassen ? E | ( | V | + 3 +|E||V|3|E|k ? (Sie benötigen andere Rechtecke.)|E|(|V|+3)+k
j_random_hacker

Ich denke, dass dies wahrscheinlich eine Hausaufgabe ist, daher bin ich ein bisschen zurückhaltend, vorerst viel mehr zu sagen. Die von mir angegebene Kostenformel enthält einige Hinweise. Beachten Sie, dass Sie mindestens eines von mehreren Rechtecken erzwingen können, indem Sie diese zu den einzigen Rechtecken machen, die ein Matrixelement abdecken (der Sonderfall von einem Rechteck ist ebenfalls nützlich). FWIW habe ich auch versucht mit einem -by- | V | Gitter zuerst, wobei das Auswählen eines Scheitelpunkts dem "Durchstreichen" einer Zeile und der entsprechenden Spalte entsprechen würde, aber nicht herausfinden konnte, wie die Auswahl der i- ten Spalte erzwungen werden kann, wenn die i- te Zeile ausgewählt wird, oder umgekehrt. |V||V|ii
j_random_hacker

Ich hatte das gleiche Problem mit -by- | V | Gitter. Ich denke, ich sehe, welche Art von Lösung Sie im Sinn haben (ich habe jedoch nicht genau die gleiche Kostenformel), siehe meine Bearbeitung. Übrigens ist es keine Hausaufgabe. Es ist ein kombinatorisches Problem, das in einem realen technischen Problem auftrat. Wir lösen es mit MIP, aber ich wollte sichergehen, dass das Problem NP war (und keine polynomielle Lösung hatte). In jedem Fall können Sie, wenn Sie die Gültigkeit der Lösung bestätigen, Ihren Hinweis als Antwort eingeben, und ich werde ihn validieren (da ich die Lösung mit Ihrer Hilfe gefunden habe). |V||V|
Yann

1
Ja, das ist fast genau die Reduktion, die ich mir vorgestellt hatte! :) Ich habe deine "Typ 4" -Rechtecke an einem Ende etwas länger gemacht: Wo deine 2 Zellen innerhalb eines Blocks belegen, belegen meine alle 3. Anstelle spezieller "Typ 3" -Rechtecke für die Endblöcke verwende ich einfach die gesamte obere Reihe wie "Typ 2" Rechtecke für . Schließlich habe ich ein Rechteck, das die Zellen links Mitte und links unten in jedem linken Endblock belegt (horizontal gespiegelt für jeden rechten Endblock). So können Sie die unteren 2 Reihen aller Blöcke einschließlich und zwischen Endblöcken mit einem oder Muster abdecken . a<j<b|==|
j_random_hacker

1
Ich mag Ihre -by- 3 | V | Reduzierungsidee. Anders als bei der 3 | E | -by- 3 | V | Reduktion, es kann kostenminimale Lösungen geben, die nicht Vertex-Covers entsprechen - aber all diese Lösungen können mit dem gleichen Argument wie in Ihrem letzten Aufzählungspunkt in kostenminimale Lösungen umgewandelt werden ein problem für die reduktion :)|E|3|V|3|E|3|V|
j_random_hacker

Antworten:


4

Dank des Hinweises von j_random_hacker habe ich eine Lösung gefunden, um Vertex Cover auf das Gitterproblem zu reduzieren:

Wir machen ein -by- | V | Gitter von 3 mal 3 Blöcken, dh ein 3 | E | -by- 3 | V | Gitter mit Ecken, die als Spalten geordnet sind { v 1 , , v N 1 } und Kanten, die als Zeilen geordnet sind { e 1 , , e N 2 } . Wir werden Rechtecke auf diesem Gitter konstruieren (die Zeichnung unten hilft dabei, die verschiedenen verwendeten Rechtecke besser zu verstehen).|E||V|3|E|3|V|{v1,,vN1}{e1,,eN2}

Bildbeschreibung hier eingeben

|V|Rechtecke vom Typ 1.

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

  • j<ab<j , ist dies ein 3-mal-3-Rechteck, das den gesamten Block abdeckt.
  • j=aj=b
  • Wenn , ist dies ein 1 × 3-Rechteck, das die obere Reihe des Blocks abdeckt.a<j<b

Also haben wir |E||V|Rechtecke vom Typ 2, diese Rechtecke müssen ausgewählt werden, da sie jeweils die einzige Abdeckung für die obere linke (oder obere rechte) Ecke des Blocks darstellen, in dem sie sich befinden.

Wie wir gesagt haben, entspricht jede Kante einer Zeile, wobei zwei Blöcke (nennen wir sie Endblöcke) den Endpunkten der Eckpunkte und ( e i , v b ) entsprechen . Jetzt haben wir Rechtecke vom Typ 3:(ei,va)(ei,vb)

  • (ei,va)(ei,vb)

2|E|Rechtecke vom Typ 3 sind ebenfalls obligatorisch, da sie jeweils die einzige Abdeckung für die obere rechte Ecke (wenn es sich um den ersten Endblock handelt) oder die obere linke Ecke (wenn es sich um den zweiten Endblock handelt) darstellen.

Nun konstruieren wir für jede Kante Rechtecke vom Typ 4, zwischen den Endblöcken haben wir zwei Rechtecke für die zweite Reihe:

  • Einer geht vom zentralen Platz des ersten Blocks zum zentralen linken Platz des zweiten Blocks.
  • Einer geht vom zentralen rechten Platz des ersten Blocks zum zentralen Platz des zweiten Blocks.
  • Und die gleichen zwei Rechtecke für die dritte Reihe.

4|E|

Um das Raster abzudecken:

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

Um für eine gegebene Kante den Teil zwischen den noch nicht abgedeckten Kantenendblöcken (zweite und dritte Reihe der Blockreihe) abzudecken, können wir entweder verwenden:

  • das vier Rechteck vom Typ 4.
  • ein Rechteck vom Typ 1 und zwei Rechtecke vom Typ 4.

Beachten Sie, dass wir in jedem Fall mindestens zwei Rechtecke vom Typ 4 benötigen.

|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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.