Überblick
kxi
Um zu beweisen, dass das Problem der numerischen Dreizackabdeckung NP-schwer ist, führen wir das folgende Zwischenproblem ein, das wir als Problem der Gitterdreieckabdeckung bezeichnen werden:
S⊂Z+×Z+k
T⊂Z×Z|T|≤kS⊆⋃(x,y)∈T{(x,y),(x,y+1),(x+1,y)}
k(1,1,2–√)(x,y)(x,y+1)(x+1,y)
Um zu zeigen, dass die numerische Dreizackabdeckung NP-hart ist, bieten wir zwei Reduzierungen an: eine Reduzierung von Planar 3SAT auf die Gitterdreieckabdeckung und eine Reduzierung von der Gitterdreieckabdeckung auf die numerische Dreizackabdeckung. Zusammen ergeben diese eine Reduktion vom NP-harten Problem Planar 3SAT zum Problem der numerischen Dreizackabdeckung, was impliziert, dass die numerische Dreizackabdeckung NP-hart ist.
p+q2–√p+q2–√(p,q)
Reduktion 1: Von der Gitterdreieckabdeckung zur numerischen Dreizackabdeckung.
S⊆Z+×Z+k
x1,...,xNa,bk′
Ss1=(p1,q1),s2=(p2,q2),...,s|S|=(p|S|,q|S|)i1N=|S|xi=−pi+qi2–√a=1b=2–√k′=k
Diese Reduktion ist eindeutig eine Polynomzeitoperation, so dass nur noch zu zeigen ist, dass die Reduktion die Antwort bewahrt.
xixixi+axi−bxi−va+vb2–√vavb−va+vb2–√fp+q2–√f(−va+vb2–√)=(va,vb)fxisi
−p+q2–√−(p+1)+q2–√−p+q2–√−p+(q+1)2–√f(p,q)(p+1,q)(p,q+1)fSf−1f
f{x1,...,x|S|}fS={s1,...,s|S|}={f(x1),...,f(x|S|)}f(1,12–√)xikSk(1,12–√)
Reduktion 2: Vom planaren 3SAT zur Gitterdreieckabdeckung.
Für diese Reduktion erhalten wir eine 3SAT-Instanz in Form eines planaren zweigliedrigen Graphen. Die Eckpunkte in einem Teil entsprechen Variablen, und die Eckpunkte des anderen Teils, jeweils vom Grad 3, entsprechen Klauseln. Jede Kante ist als positiv oder negativ gekennzeichnet und gibt an, auf welche Weise die Variable in die Klausel aufgenommen wird (positiv oder negativ).
(S,k)Sk
Zuerst beschreiben wir einen Draht. Ein Draht besteht aus einer Folge einer ungeraden Anzahl von Punkten (im ganzzahligen Gitter), an denen der erste und der letzte als Anschlüsse bezeichnet werden, sodass jedes aufeinanderfolgende Paar von einem Dreieck abgedeckt werden kann, ohne dass das Dreieck einen anderen Punkt im Draht trifft. Betrachten Sie als Beispiel den folgenden Draht:
xoo x
o o
o ooo o
o o oooo
oo
pp+12
Hier zeigen wir die zwei Möglichkeiten, um das Beispiel von oben abzudecken (wobei zwei Punkte mit derselben Nummer gekennzeichnet sind, wenn sie mit demselben Dreieck abgedeckt sind):
x11 9
2 9
2 556 8
3 4 6778
34
oder
112 x
2 9
3 566 9
3 5 7788
44
Eine Sorge ist, dass wir möglicherweise zwei Klemmen mit einem Draht verbinden möchten, dies jedoch nicht können, da jeder "Draht" zwischen diesen beiden Klemmen eine gerade Länge haben würde. Dies ist jedoch nicht der Fall: Wir können immer eine Route für einen Draht wählen, damit dieser Draht eine ungerade Länge hat (und daher ein gültiger Draht ist). Durch Ersetzen eines horizontalen Drahtsegments der Länge 6 durch das folgende Drahtsegment der Länge 7 kann die Parität der Drahtlänge festgelegt werden:
oo oo
ooo
Als nächstes führen wir ein Klausel-Gadget ein. Eine Klausel verbindet einfach einen der Anschlüsse von drei Drähten so, dass, wenn einer der Drähte erfüllt ist, so dass der gemeinsam genutzte Anschluss abgedeckt ist, das Dreieck, das diesen gemeinsam genutzten Anschluss abdeckt, keine Punkte von den anderen Drähten abdeckt:
o
o
o
ooox
ooo
Damit der gemeinsam genutzte Anschluss abgedeckt werden kann, muss mindestens einer der drei Drähte so erfüllt sein, dass die Dreiecke, die den Draht erfüllen, den nicht gemeinsam genutzten Anschluss der Drähte nicht abdecken.
Schließlich stellen wir das variable Gadget vor. Das variable Gadget ist eine große drahtähnliche Schleife (von gerader Länge) mit Klemmen, die optional alle drei Zeilen wie folgt seitlich auftreten:
oo
o o
o ox
o o
o o
o ox
o o
o o
o ox
o o
o o
o ox
o o
oo
Die Variable kann vertikal wachsen, um die erforderliche Anzahl von Terminals aufzunehmen. Die Terminals in Reihen mit gerader Parität entsprechen positiven Vorkommen der Variablen und diejenigen in Reihen mit ungerader Parität entsprechen negativen Vorkommen. Wie bei Wire können die nicht terminalen Punkte des variablen Gadgets mit der minimalen Anzahl von Dreiecken (die Hälfte der Anzahl von Punkten in der Schleife) auf genau zwei Arten erfüllt werden. Diese beiden Einstellungen decken entweder alle Terminals für positives Auftreten oder alle Terminals für negatives Auftreten des variablen Gadgets ab.
Alles zusammen zu setzen ist ziemlich offensichtlich: Wir erstellen das zweiteilige Diagramm mit variablen Gadgets, Klausel-Gadgets (gemeinsam genutzte Terminals) und Drähten, die die Terminals verbinden. Die Gesamtzahl der Dreiecke, die erforderlich sind, um die nicht terminalen Punkte der Drähte und Variablen abzudecken, ist dann die Zielanzahl der Dreiecke.
Natürlich können wir nicht das gesamte Gitter mit weniger als diesen Dreiecken abdecken. Darüber hinaus können wir sicher sein, dass die nicht terminalen Punkte jeweils abgedeckt sind, da die Variablen und Drähte jeweils auf eine der beiden beschriebenen Arten erfüllt werden. Die einzige Aufgabe besteht also darin, die Terminals zu befriedigen.
Bei jeder Variablen werden entweder alle positiven oder alle negativen Vorkommensterminals vom Variablen-Gadget erfüllt. Die anderen Anschlüsse am Gadget müssen durch die angeschlossenen Kabel zufrieden sein. Dann können die Klauselklemmen genau dann erfüllt werden, wenn jede Klausel an mindestens eine Leitung angeschlossen ist, deren andere Klemme die Leitung noch nicht verbraucht hat (eine Leitung, deren andere Klemme durch das angeschlossene variable Gadget erfüllt wurde). Mit anderen Worten, die Terminals sind alle genau dann erfüllt, wenn die Zuweisung von Variablen gemäß den Einstellungen der Variablen-Gadgets jede Klausel erfüllt.
Wie Sie sehen können, ist die erzeugte Grid Triangle Cover-Instanz genau dann eine Ja-Instanz, wenn die eingegebene Planar 3SAT-Instanz eine Ja-Instanz ist. Da diese Reduktion auch eine Polynomzeit ist (alle Gadgets benötigen ein Raumpolynom in der Größe der Eingabeinstanz), schließen wir, dass wir eine gültige Reduktion haben.