Algorithmen und Komplexität Thema: NP-vollständige Probleme Erbschaftsproblem (Partition) von Jörg Winkler 17. Juli 2003 Inhaltsverzeichnis 1 GRUNDLEGENDES ZUM ERBSCHAFTSPROBLEM ..............3 1.1 1.2 1.2.1 1.2.2 1.2.3 PROBLEMVORSTELLUNG ............................................................................. 3 DEFINITIONEN ........................................................................................... 4 Die Klasse P ...................................................................................................................... 4 Die Klasse NP.................................................................................................................... 4 Die NP-Vollständigkeit...................................................................................................... 4 2 NP-VOLLSTÄNDIGKEIT WICHTIGER PROBLEME...............5 2.1 3SAT-PROBLEM ........................................................................................ 6 2.1.1 2.1.2 Allgemein ........................................................................................................................... 6 Beweis der NP-Vollständigkeit .......................................................................................... 6 2.2 RUCKSACK-PROBLEM (KP)........................................................................ 7 2.2.1 Allgemein ........................................................................................................................... 7 2.2.2 Beweis der NP-Vollständigkeit .......................................................................................... 7 2.3 ERBSCHAFTSPROBLEM (PARTITION)............................................................ 9 2.3.1 Allgemein ........................................................................................................................... 9 2.3.2 Beweis der NP-Vollständigkeit .......................................................................................... 9 2.4 BIN PACKING PROBLEM (BPP) ................................................................ 10 2.4.1 Allgemeines...................................................................................................................... 10 2.4.2 Beweis der NP-Vollständigkeit ........................................................................................ 10 2.5 ZUSAMMENHANG ..................................................................................... 10 3 LÖSUNG / STRATEGIEN ..........................................................11 3.1 ALLGEMEIN ............................................................................................. 11 3.1.1 3.1.2 3.1.3 zum Zahlenbeispiel (1.1.)................................................................................................. 11 Zusammenfassung............................................................................................................ 12 besseres Beispiel.............................................................................................................. 12 3.2 LÖSUNG MIT HILFE DES BPP ................................................................... 13 3.3 STRATEGIE DER RÜCKVERFOLGUNG ......................................................... 13 3.3.1 Voraussetzung.................................................................................................................. 13 3.3.2 Vorgehensweise ............................................................................................................... 13 3.3.3 Eigenschaften................................................................................................................... 13 3.3.4 Anschauungsbeispiel ....................................................................................................... 14 4 ZUSAMMENFASSUNG .............................................................16 2 1 Grundlegendes zum Erbschaftsproblem 1.1 Problemvorstellung Das Erbschaftsproblem ist auch unter dem englischen Begriff Partition verbreitet. Es stellt einen Spezialfall des Bin Packing Problem (BPP) dar, wobei Bin Kiste, Eimer oder Behälter und Packing packen oder verpacken bedeuten kann. Wie wir hier erkennen können, geht es darum ob Objekte in Behälter zu packen. Der Hauptunterschied beider Probleme besteht darin, dass beim Erbschaftsproblem nur zwei Behälter zu Verfügung stehen. Wie auch das BPP, ist das Erbschaftsproblem nicht nur ein theoretisches Problem, sondern hat durchaus auch praktische Relevanz. • Zum Beispiel: Jemand hinterlässt seinen zwei Erben n Gegenstände. Die Erbstücke sind jedoch unterschiedlich viel Wert. Gibt es eine Aufteilung, so dass beide Erben den gleichen Wert erhalten? Dieses Erbschaftsproblem sieht harmlos aus, jedoch sind bis heute keine Algorithmen bekannt, die im allgemeinen Fall eine Lösung, sofern sie existiert, in weniger als exponentiell vielen Schritten liefert. • Hier ein Zahlenbeispiel: Für das Erbschaftsproblem betrachte man folgende 20 natürlichen Zahlen: 32, 35, 40, 41, 44, 46, 51, 59, 60, 64 72, 75, 76, 78, 80, 85, 86, 89, 92, 95 Die Summe ist 1300. Man stelle also fest, ob es eine Teilfolge dieser Zahlen gibt, deren Summe 650 ist. Bei diesem Beispiel ist es nicht schwer, mit Probieren nach einigen Minuten eine Lösung zu finden: T1 = {32, 40, 41, 59, 60, 64, 80, 85, 92, 95} T2 = {35, 44, 46, 51, 72, 75, 76, 78, 86, 89} Im späteren Verlauf werden wir noch einmal auf dieses Beispiel zurückkommen. 3 1.2 Definitionen 1.2.1 Die Klasse P M sei eine deterministische Turingmaschine auf dem Eingabealphabet ∑. Die worst case Rechenzeit tM(n) ist die maximale Anzahl von Rechenschritten, die M auf Eingaben der Länge n aus ∑M macht. P ist die Klasse der Probleme, für die es eine deterministische Turingmaschine M gibt, deren worst case Rechenzeit polynomiell beschränkt ist. 1.2.2 Die Klasse NP M sei eine nichtdeterministische Turingmaschine, die die Sprache L akzeptiert. Die Rechenzeit für eine Eingabe ω ist, falls ω ∈ L, gleich der Anzahl der Rechenschritte auf einem kürzesten akzeptierenden Rechenweg, und 0, falls ω ∉ L. Die worst case Rechenzeit tM(n) ist das Maximum der Rechenzeiten für alle Eingaben ω der Länge n. NP (nichtdeterministisch polynomiell) ist die Klasse der Entscheidungsprobleme, für die es eine nichtdeterministische Turingmaschine M gibt, deren worst case Rechenzeit polynomiell beschränkt ist. 1.2.3 Die NP-Vollständigkeit Es seien L1 und L2 Sprachen über ∑1 und ∑2. Dann heißt L1 polynomiell auf L2 reduzierbar, Notation L1 ≤p L2, wenn es eine polynomielle Transformation von L1 nach L2 gibt. D.h. wenn es eine von einer nichtdeterministischen Turingmaschine in polynomieller Zeit berechenbare Funktion f: ∑1* → ∑2* gibt, so dass für alle ω∈ ∑1* gilt: ω ∈ L1 f(ω) ∈ L2 . 4 2 NP-Vollständigkeit wichtiger Probleme Die wichtigsten Probleme sind folgende: SAT 3SAT Cliquen KP gerichteter Hamilton Kreis Partition ungerichteter Hamilton Kreis BPP TSP Für jedes der dargestellten Probleme kann man zeigen, dass es NP-vollständig ist. Im Anschluss wird jedoch nur der Beweisweg von SAT zu BPP gegangen, da das Erbschaftsproblem ein Spezialfall des Bin Packing Problems (BPP) ist. Die Grundlage für diese Beweise bildet der Satz von Cook, der besagt: „SAT ist NPvollständig“ .Auf dessen Beweis, wird jedoch aus Platzgründen verzichtet, da er in zahlreicher Fachliteratur nachzuschlagen ist. Warum werde ich diese Beweise anführen? Ziel dieser Beweise ist es, eine Abschätzung der Schwierigkeit des Erbschaftsproblems zu erkennen und es in eine Klasse von Problemen einordnen zu können. 5 2.1 3SAT-Problem 2.1.1 Allgemein Beim SAT-Problem (statisfiability problem) besteht die Aufgabe darin zu entscheiden,, ob für die aussagenlogische Formel f(ν1, ν2, …, νn) = ,i.j Lij, Lij ∈ {ν1, ν2, …, νn, ¬ν1, ¬ν2, …, ¬νn} Eine Belegung der Variablen ν1, ν2, …, νn existiert, so dass f(ν1, ν2, …, νn) den booleschen Wert „wahr“ ergibt. Ferner kommt für das 3SAT-Problem die Bedingung hinzu, dass f nur höchstens drei Variablen (n = 3)enthalten darf. 2.1.2 Beweis der NP-Vollständigkeit „Da SAT ∈ NP, ist auch 3SAT ∈ NP“ SAT ≤p 3SAT Sei nun C = (c1, …, cn) eine Eingabe für SAT, also ci eine Klausel über x1, ¬x1, …, xn, ¬xn. Für die polynomielle Transformation behandeln wir die Klauseln einzeln. Hat eine Klausel nur ein Literal z, ersetzen wir die Klausel durch z Form z z’, ersetzen wir sie durch z z z. Hat eine Klausel die z v z’. Klauseln mit drei Literalen übernehmen wir unverändert. Sei nun eine Klausel ci = z1 … zk mit k ≥ 4 und zi ∈{x1, ¬x1, …, xn, ¬xn}gegeben. Wir ersetzen ci durch k-2 Klauseln und benutzen k-3 neue Variablen yc,1, … yc,k-3, die nur in diesen Klauseln vorkommen. Die neuen Klauseln haben folgendes Aussehen: z1 z2 yc,1 ¬yc,1 zl+2 yc,l+1 ¬yc,k-3 zk-1 zk (für 1 ≤ l ≤ k-4) Diese Klauseln lassen sich offensichtlich in polynomieller Zeit konstruieren. 6 2.2 Rucksack-Problem (KP) 2.2.1 Allgemein Gegeben seien n Objekte 1, …, n. Objekt i habe den Wert wi ∈ N0 und das Gewicht gi ∈ N0. Diese Objekte wollen wir in einen Rucksack packen, der allerdings nur ein begrenztes Gewicht G aushält; dabei wollen wir den im Rucksack befindlichen Wert maximieren. Gesucht ist also S ⊆ {1, …, n}, so dass: ∑i∈S gi ≤ G, ∑i∈S wi = maxS⊆{1, …, n} ∑i∈S wi. 2.2.2 Beweis der NP-Vollständigkeit „KP ist NP-vollständig“ Sei C = (c1, …, cm) mit ci = zi1 zi2 3SAT ≤p KP zi3 und zij ∈ {x1, ¬x1, …, xn ¬xn} eine Eingabe für 3SAT. Die Eingabe f(C) für das Rucksackproblem wird einige spezielle Eigenschaften haben. Es wird ai = gi für alle i und A = G sein. Es stellt sich dann noch die Frage, ob es eine Auswahl der Objekte gibt, deren Gesamtnutzen genau A ist. Wir vergeben nun die Zahlen in Dezimaldarstellung an. Es sei A die Zahl, die aus m Vieren, gefolgt von n Einsen, besteht. Wir können die Zahl A in polynomieller Zeit hinschreiben. Die Zahl A ist jedoch astronomisch groß. Das Rucksack-Problem besteht aus 2n + 2m Objekten, deren Nutzwerte wir mit ai, bi, cj, dj, 1 ≤ i ≤ n, 1 ≤ j ≤ m bezeichnen. Die Zahlen haben jeweils n+m Dezimalstellen. Die Zahl ai bezieht sich auf das Literal xi. Im vorderen Block der Länge m gibt sie an Position j an, wie oft xi in der j-ten Klausel vorkommt. Im hinteren Block der Länge n steht an Position i eine Eins, der restlichen Positionen enthalten Nullen. Die Zahl bi ist wie die Zahl ai aufgebaut, nur bezieht sie sich auf ¬xi. Die Zahl cj gilt der möglichen Ergänzung. Sie enthält im vorderen Block an der Position j eine Ein und sonst Nullen. Die Zahl dj dient ebenfalls der möglichen Ergänzung. Es ist dj = 2cj. Die Zahlen können in polynomieller Zeit berechnet werden. Wenn wir die Summe A aus den gegebenen Zahlen bilden können, erhalten wir dann, wie oben beschrieben, eine kanonische Belegung der Variablen. Damit sich an den vorderen Positionen die Summe 4 ergibt, muss in jeder Klausel mindestens ein Literal erfüllt sein. 7 8 2.3 Erbschaftsproblem (Partition) 2.3.1 Allgemein Für eine Menge natürlicher Zahlen a1, a2, …, an ∈ N, ist nun eine Teilmenge I ⊆ {1, 2, .., n} gesucht, so dass die Summe von allen ai der Teilmenge I gleich der Summe aller ai, die nicht Element der Teilmenge i sind: ∑i ∈ I ai = ∑i ∉ I ai (Falls die Summe der ai nicht geradzahlig ist, so runde man nach unten oder verbiete solche Elemente, da bereits in geradzahligen Summen die volle Schwierigkeit des Problems steckt) 2.3.2 Beweis der NP-Vollständigkeit „Partition ist NP-vollständig“ KP* ≤p Partition Im Beweis von 2.2.2. haben wir sogar gezeigt, dass ein sehr spezielles Rucksackproblem KP* NP-vollständig ist. Für alle a1, …, an soll entschieden werden, ob sie wie oben gezeigt zerlegt werden können. Es sei (a1, …, an, A) eine Eingabe für KP*. Daraus konstruieren wir in polynomieller Zeit die Eingabe (a1, …, an, S-A+1, A+1) für Partition, wobei S die Summe aller ai ist. Falls I eine Lösung für das KP* ist, erhalten wir mit I {n+1} eine Lösung für Partition, da: ∑i∈I ai + S – A + 1 = S+1 = ∑1≤i≤n ai + 1 = ∑i∉I ai + A + 1 . Die Summe aller Zahlen in der Eingabe für Partition beträgt 2S+2. Eine Lösung für Partition muss also so aussehen, dass jeder Teil sich zu S+1 aufsummiert. Damit müssen die Zahlen S–A+1 und A+1 in verschiedenen Teilen sein. Die Zahlen, die S– A+1 zu S+1 ergänzen, haben die Summe A und bilden eine Lösung für das KP*. 9 2.4 Bin Packing Problem (BPP) 2.4.1 Allgemeines Gegeben seien eine Menge von Objekten a1, …, an, sowie k Behälter mit einer konstanten Größe b. Gesucht ist die Anordnung der n Elemente über alle Behälter, wobei für jeden Behälter j, mit 1≤j≤k, gelten muss: f:{a1, …, an} {1, …, k} und ∑f(ai) = j ai ≤ b mit 1 ≤ i ≤ n . 2.4.2 Beweis der NP-Vollständigkeit „BPP ist NP-vollständig“ Partition ≤p BPP Es sei (a1, …, an) eine Eingabe für Partition. In polynomieller Zeit berechnen wir folgende Eingabe für das BPP. Sie enthält n Objekte mit den Größen a1, …, an. Die Behältergröße ist b ≤ (a1 + … + an)/2 mit b ∈ N und die Zahl der Behälter ist k = 2. Ist a1 + … + an ungerade, hat Partition keine Lösung, und die Objekte passen sicher nicht in 2 Behälter der Größe b < (a1 + … + an)/2. Ist a1 + … + an gerade, passen die Objekte genau dann in zwei Behälter der Größe b = (a1 + … + an)/2, wenn sie sich in zwei gleich große Teilmengen aufteilen lassen, g.h. wenn Partition eine Lösung hat. 2.5 Zusammenhang 10 3 Lösung / Strategien 3.1 Allgemein 3.1.1 zum Zahlenbeispiel (1.1.) 32, 35, 40, 41, 44, 46, 51, 59, 60, 64 72, 75, 76, 78, 80, 85, 86, 89, 92, 95 Wer solche Zahlen einige Male untersucht hat, wird spontan behaupten, dass es zu diesem speziellen Beispiel eine Lösung geben wird. Warum? ⇒ Folgende Überlegung besagt, dass es für dieses Beispiel mit recht hoher Wahrscheinlichkeit eine solche Teilfolge gibt: Es existieren insgesamt 220, also rund eine Million Teilfolgen, deren Summen zwischen 0 und 1300 liegen müssen. Es ist sehr unwahrscheinlich, dass die Zahl 650 nicht unter diesen 220 Zahlen sein sollte. Wenn man bei einer so hohen Wahrscheinlichkeit, einfach einige Zahlen vorgeben würde (z.B. 40+60+80+85+95 = 360) und darauf hofft die Ergänzung (290) zu finden, würde man durch einfaches Probieren leicht den Rest der Teilfolge finden. Angenommen wir würden jetzt 20 Zahlen nehmen die oberhalb von 230 liegen, dann wäre die Chance, dass sich die Erbschaft in genau zwei Teile teilen lässt, im Allgemeinen sehr gering. Denn es liegen 220 Summen der Teilfolgen oberhalb von 230 und dann wäre es sehr unwahrscheinlich, dass sich eine vorgegebene Zahl unter diesen befindet. Würde man aber 20 Zahlen so wählen, dass ihre Summe ungefähr 220 beträgt, dann besteht immer noch eine hohe Chance, eine vorgegebene Zahl als Teilsumme darstellen zu können. Also sinkt die Wahrscheinlichkeit um so mehr sich die Gesamtsumme aller 20 Zahlen von 220 nach oben bewegt. Bei z.B. 221 läge die Wahrscheinlichkeit bereits in der Größenordnung von 0,5. 11 3.1.2 Zusammenfassung Zu n Zahlen, deren Summe 2·G ist, gibt es 2n Teilfolgen, deren Summen zwischen 0 und 2·G liegen. • Je tiefer G unterhalb von 2n liegt, um so eher kann man damit rechnen, eine zufällig gewählte Teilfolge, deren Summe <G sei, durch ausprobieren zu einer Lösung ausbauen zu können. • Je stärker G oberhalb von 2n liegt, umso geringer wird die Wahrscheinlichkeit, dass sich die Folge in zwei gleiche Teilfolgen aufspalten lässt. In diesem Fall muss man meist alle Möglichkeiten durchprobieren, vor allem, wenn keine Lösung des Erbschaftsproblems existiert. ⇒ Das Erbschaftsproblem ist also voraussichtlich dann nur mit dem größtmöglichen Aufwand zu lösen, wenn alle n Zahlen größer als 2n+1 / n sind, da in diesem Fall sicher 2·G > 2n+1, also G > 2n gilt! 3.1.3 besseres Beispiel Gegeben sind folgende 20 Zahlen, deren Summe 33.480.070 ist, d.h. G = 16.740.035. 1.976.834, 1.864.558, 1.755.621, 1.575.931, 2.169.504, 1.567.429, 2.001.571, 1.682.544, 1.289.337, 1.223.752, 1.884.283, 1.671.449, 1.400.530, 1.547.733, 1.338.626, 1.438.792, 2.010.563, 1.422.589, 1.863.866, 1.794.558 Ich habe nicht nach der Existenz einer Lösung gesucht, da dieses Beispiel nur die Schwierigkeit des Problems verdeutlichen soll. 12 3.2 Lösung mit Hilfe des BPP Wie bereits erwähnt, ist das Erbschaftsproblem ein Spezialfall des BPP und zwar ein BPP mit 2 Behältern und einer Behältergröße von G. ⇒ so hat das Erbschaftsproblem genau dann eine Lösung, wenn das Bin Packing Problem für diesen Spezialfall eine Lösung hat. 3.3 Strategie der Rückverfolgung Die Strategie der Rückverfolgung (engl. Backtracking) ist eine der allgemeinsten Techniken und reicht bis in das Jahr 1960 zurück. 3.3.1 Voraussetzung Die Lösung eines Problems kann als Tupel x1, …, xn von Elementen von Mengen Si dargestellt werden. 3.3.2 Vorgehensweise 1. Baue einen Entscheidungsbaum auf, der alle möglichen Lösungen enthält 2. Wähle deinen Lösungsweg und probiere ihn schrittweise aus 3. Falls es nach Teilschritt i keinen Weg mehr zum Erfolg geben kann: • breche den Durchlauf ab, • markiere den Weg als „nicht gangbar“ • gehe einen Schritt zurück, d.h. mache Teilschritt i rückgängig • probiere die nächste Alternative 3.3.3 Eigenschaften • auf viele praktische Beispiele anwendbar • in der Regel (deutlich) besser als vollständige Aufzählung • oft leicht durch Rekursion implementierbar • durch das Streichen können oft ganze Teilzweige entfallen • benötigt dadurch in der Regel wesentlich weniger Tests 13 3.3.4 Anschauungsbeispiel Füge a1 zu T1 hinzu Füge a2 zu T1 hinzu Füge a1 zu T2 hinzu Füge a2 zu T2 hinzu Füge a2 zu T1 hinzu Füge an zu T1 hinzu Füge a2 zu T2 hinzu Füge an zu T2 hinzu Nach dem wir den Entscheidungsbaum aufgestellt haben, wählen wir einen Lösungsweg. Begonnen wird an der Wurzel und wir folgen dem Pfad des von uns gewählten Lösungswegs Füge a1 zu T1 hinzu Füge a2 zu T1 hinzu Füge a1 zu T2 hinzu Füge a2 zu T2 hinzu Füge an zu T1 hinzu Füge a2 zu T1 hinzu Füge a2 zu T2 hinzu Füge an zu T2 hinzu Kommen wir an unseren ersten Knoten überprüfen wir, ob a1 zur Teilfolge T1 hinzugefügt werden kann. Wir nehmen an dies ist der Fall und folgen dem gewählten Lösungsweg. 14 Füge a1 zu T1 hinzu Füge a2 zu T1 hinzu Füge a1 zu T2 hinzu Füge a2 zu T2 hinzu Füge a2 zu T1 hinzu Füge an zu T1 hinzu Füge a2 zu T2 hinzu Füge an zu T2 hinzu Angekommen am nächsten Knoten wird nun geprüft, ob a2 zu T2 hinzugefügt werden kann. Nun könnte z.B. der Fall auftreten, dass diese Operation nicht ausgeführt werden kann. Wir markieren nun den Abzweig zu diesem Knoten als „nicht gangbar“ und müssen nun solange unseren Pfad zurück „gehen“, bis wir an einen Knoten gelangen von dem wir in einen anderen Abzweig gehen können. Füge a1 zu T1 hinzu Füge a2 zu T1 hinzu Füge a1 zu T2 hinzu nicht gangbar Füge a2 zu T2 hinzu Füge an zu T1 hinzu Füge a2 zu T1 hinzu Füge a2 zu T2 hinzu Füge an zu T2 hinzu u.s.w. 15 4 Zusammenfassung Das Erbschaftsproblem ist nur eines von vielen NP-vollständigen Problemen. Diese Projektarbeit sollte einen kleinen Einblick in Menge der NP-vollständigen Probleme schaffen. Es war nicht beabsichtigt eine Lösung für das Erbschaftsproblem zu finden. 16