So, Thema heute, NP-Vollständigkeit. Das ist ziemlich anspruchsvoll
, das Thema. Mal gucken, ob wir das jetzt
in den nächsten anderthalb Stunden gut über die Runden kriegen.
Ich habe ja gestern schon angekündigt, eventuell muss ich ein bisschen überziehen heute.
Ich hoffe nicht, ich mache das am Anfang ein bisschen schneller.
Und dann haben wir nachher für die schwierigen Sachen bei der Reduktion und so Zeit.
Also was haben wir gestern gemacht? Wir sind angefangen bei
den entscheidbaren und unentscheidbaren Problemen und haben dann gesagt,
diese entscheidbaren Probleme, die möchten wir gerne noch unterteilen in Probleme,
die praktisch lösbar sind und Probleme, die praktisch nicht mehr lösbar sind.
Wobei dieses praktisch löst man praktisch nicht mehr lösbar quasi unterschieden
wird durch die Laufzeit, die der Algorithmus hat.
Oder auch durch den Speicherbedarf. Aber bei uns interessiert primär
die Laufzeit erstmal
Und gesagt haben wir dann, wenn ein Algorithmus eine polynomielle Laufzeit hat,
also irgendwie sowas wie Endquadrat, viele Schritte oder Endhoch,
drei, viele Schritte oder sowas, dann ist das okay.
Und eine Exponentialfunktion ist irgendwie doof. Also zwei Hochänder kann
man dann irgendwie mit Eingabengrößen für N gleich 10,
11, 12 kommt man da noch zurecht.
50, 60, 70 wird irgendwie blöd. Und eine Eingabegröße,
die irgendwie 50 oder 60 groß ist oder so,
das kommt schon relativ häufig vor.
Also 50 Zahlen zu sortieren, kann man schon mal machen.
Ja, fragen wir, ob es noch Dinge gibt,
die länger brauchen als eine konstante Hoch-N. Ja,
es gibt Sachen,
die brauchen zum Beispiel
zwei Hoch-N viel Platz
Und können dann dementsprechend sehr viel länger brauchen,
weil sie diese, alleine um sich die zwei hochendfiel Platz anzugucken,
brauche ich schon irgendwie zwei, auch in viele Schritte.
Und wenn ich da jetzt vielleicht noch ein bisschen
hin und her gehe und Dinge tue und so weiter,
dann brauche ich irgendwie noch viel mehr Zeit.
Oder ich brauche doppelt exponentiell viel Zeit, sowas wie zwei hoch, zwei hochend.
Oder ich bin ein N-Hoch-N oder irgendwie solche Geschichten, kann man alles machen.
Gibt es auch tatsächlich natürliche Probleme für. Also,
dass man für all diese Sachen irgendwie künstliche Probleme konstruieren kann,
wenn man da so ein bisschen in der Literatur guckt,
dann kommt man da so auf etliche Probleme.
Aber es gibt dann auch immer natürliche Probleme für sowas.
Also Dinge, die man tatsächlich irgendwie lösen möchte.
Gut, das waren die beiden prominenten Klassen,
die wir gestern eingeführt haben.
Einmal diese Klasse
Das sind die Klassen, die sich durch eine polinumiell zeitbeschränkte,
deterministische Touring-Maschine lösen lassen und die Klasse NP,
im Grunde genommen das Gleiche, nur empfinde nicht die terministische Touring-Maschine.
Und diese Zeitschranke hat immer bedeutet,
wenn ich da jetzt irgendwie die Zahl N einsetze,
also die Länge der Eingabe, dann kommt da irgendwie ein Wert
raus und die Touring-Maschine darf dann eben nur so viele Schritte machen,
wie dieser Wert einem da sagt.
Das heißt, wenn ich eine Endquadrat zeitbeschränkte Touring-Maschine habe,
dann sage ich, naja,
bei einer Eingabe der Länge 5 darf sie 25 Schritte brauchen
maximal bei einer Eingabe der Länge 10 maximal 100 und sowas
Genau, so und um die beiden soll es heute auch gehen,
weil man oft sagt, dass Probleme, die INP sind,
effizient lösbar sind, das ist irgendwie okay.
Und Probleme, die in NP sind, die sind im Allgemeinen
nicht mehr effizient lösbar. Da werden wir nachher auch noch sehen,
warum man das so sagt. Und dann werden wir versuchen,
eine Technik zu entwickeln, mit der man nachweisen kann,
dass ein Problem eben nicht in P ist,
sondern nur in NP, weil man dann eben sagen könnte,
okay, wenn das nicht in P ist,
dann gibt es da wohl keinen effizienten Algorithmus für.
Das wollen wir uns heute angucken. Da steht es nochmal,
für die wir keinen Algorithmus im P finden wollen,
wenn Technik entwickeln,
mit der wir
das sagen können
Also quasi eine untere Schranke für ein Problem angeben können.
Gegeben das Problem irgendwie Zahlen zu sortieren,
möchten wir sagen können, also da braucht man mindestens Entschritte für,
weil man sich vielleicht alle Zahlen mal angucken muss oder irgendwie sowas.
Solche sowas wollen wir machen können. Da werden wir sehen,
dass das gar nicht so einfach ist und dass es tatsächlich solche Techniken auch noch nicht gibt,
aber wir haben eine Technik, mit der wir sagen können,
dass es zumindest sehr unwahrscheinlich ist,
dass es einen effizienten Algorithmus für ein Problem gibt.
Und das ist dieses Thema MP-Vollständigkeit. Da gehen wir nachher
hin, vorher nochmal kurz was zu P und NP.
Die Fuli hatten wir gestern schon mal, das Wichtige,
dass da unten das hier steht,
akzeptieren und entscheiden
ist egal
Also so wie es hier eingeführt ist mit L.A. gleich L,
da würde es ja nur darum gehen,
dass eine Touring-Maschine A existiert, die die Sprache L akzeptiert.
Jetzt kann man sagen, irgendwie akzeptieren ist vielleicht ein bisschen doof,
weil dann hält sie ja nur nach Endquadrat vielen Schritten bei Eingaben,
die sie akzeptieren soll.
Was passiert denn dann bei Eingaben, die sie nicht akzeptieren soll?
Arbeitet sie da irgendwie länger oder sowas?
Das ist irgendwie blöd. Deswegen macht man hier eigentlich,
dass man sagt, eine P hier in zeitbeschränkte Touring-Maschine,
die die Sprache sogar entscheidet. Und das ist das Gleiche,
das sagt der folgende Satz gleich,
den haben wir gestern ja auch einmal gemacht,
bei dem die Idee im Grunde genommen einfach ist,
eine Touring-Maschine,
die die Sprache entscheidet,
die nimmt sich quasi die Touring-Maschine,
die die Sprache hier aktiviert
Akzeptiert als Subroutine, rechnet vorher aus, wie viele Schritte
die machen darf, lässt sie dann so viele Schritte machen.
Also simuliert sie so viele Schritte und dann hört sie halt auf.
Die braucht ein bisschen länger als die ursprüngliche Touring-Maschine,
weil sie eben noch das Polynom vorher berechnen muss,
ist aber immer noch polemiell zeitbeschränkt.
Da ist der Satz, P ist das Gleiche wie all die Sprachen,
die von einem Algorithmus im Problem im Jahrzeit entschieden werden.
Den hatten wir ja gestern auch schon von rechts nach links,
war klar, weil wenn ich eine Sprache im Polynialzeit entscheiden kann,
dann kann ich sie auch in Polynom ja als Zeit akzeptieren
Und wenn ich jetzt aber einen Algorithmus habe,
der L in dieser Zeit akzeptiert,
in O von NhochK, jetzt will ich einen basteln,
der L entscheidet, dann rechne ich zuerst das Polynomen.
Also irgendwie, ich weiß, es gibt so einen C,
sodass die Touring-Maschine A nach 10 mal in Hochkahrschritten fertig sein soll,
dann berechne ich mir eben,
wie viele Schritte ich bei einer Eingabe der Länge enden hier brauchen darf.
Also guck mir an, wie lang ist meine Eingabe X,
berechne das Polynom und dann simuliere ich A ist schrittelang.
Und entweder hat A schon akzeptiert,
dann akzeptiere ich auch oder wenn es das nicht hat,
dann akzeptiere ich eben nicht.
Und dann habe ich
die Sprache auch entschieden
Sprich, wenn gesagt wird, dieses Problem ist NP,
dann weiß ich, es gibt ein Polynom, N-Hochk,
sodass eine deterministische Touring-Maschine nach diesen N-O-K 4 Schritten anhält und entweder sagt sie,
ja oder nein.
Da ist so ein typisches Problem für etwas,
was NP liegt, kürzeste Pfade in ungerichteten Grafen bestimmen.
Es gibt noch ganz viele anderes, was im P liegt,
also Flussprobleme und all so, das liegt alles MPMP.
Und jetzt diese Unterscheidung zwischen P und NP,
die ist meistens nur sehr gering,
also bei ganz vielen Problemen muss man nur an einer Stelle
ein bisschen tweaken und kommt dann aus dieser Komplexitätsklasse P
in die Komplexitätsklasse NP
Das ist relativ spannend, weil man hier jetzt sagen würde,
ah schön, das lässt sich leicht berechnen,
man fängt irgendwie beim Startknoten an, guckt dann,
wo man so hingeht, merkt sich die,
das Gewicht des Pfades,
das man bisher gegangen ist und bestimmt dann eben weitere Wege,
die man gehen kann.
Das ist so grob der Exas Algorithmus.
Und wenn man jetzt aber dieses höchstens Karakanten zu brauchen,
also dann hat man minimalen Pfad bestimmt und dann guckt man,
ob die minimale Länge des Pfades klein ist als Ka,
falls ja, hat man das Problem da gelöst.
Und wenn man jetzt dieses höchstens hier,
also die Suche nach einem kürzesten Pfad,
ersetzt durch mindestens,
also diese Suche nach einem längsten Pfad,
dann ist das Problem plötzlich
nicht mehr einfach zu lösen
Also zumindest ist es noch niemandem maybe was eingefallen.
Es gibt noch keinen Algorithmus, der das Problem im Problem
in der Allzeit löst. Kann einen ja trotzdem interessieren,
dass man, also bei den Problemen an längsten Pfad zu bestimmen,
das interessiert dann jetzt vielleicht, was Routenplanung angeht oder so, nicht so.
Aber in anderen Settings interessiert einen das durchaus.
Und das erscheint halt irgendwie schwierig zu lösen,
wobei dieses erscheint schwierig zu lösen bedeuten soll,
jede Menge kluge Leute haben sich drüber Gedanken gemacht und keiner hat einen effizienten Algorithmus gefunden.
Und was man aber machen kann, ist,
wenn ich euch diese Problemstellung gebe,
also ich gebe euch irgendwie einen ungerichteten Grafen und den Staat
und den Zielknoten und frage,
gibt es da einen Vater mindestens aus zehn Kanten besteht
Und ich gebe euch dann zusätzlich dem Pfad,
von dem ich behaupte, dass der diese Eigenschaft hat,
dann könnt ihr relativ schnell überprüfen, ob das stimmt oder nicht.
Guckt euch den Pfad an, guckt,
ob der wirklich vom Staat zum Ziel führt,
zählt die Kanten und überprüft, ob das mehr als Karl Kanten sind.
Fertig. Ergo, was schnell geht bei dem Problem,
ist zu überprüfen, ob eine vorgelegte Lösung wirklich eine Lösung ist,
was scheinbar nicht schnell geht, ist die Lösung auch zu bestimmen.
Und diese Idee des Überprüfens oder Verifizierens einer vorgegebenen Lösung,
das führt zu einer alternativen Definition von NP,
also statt mit nicht deterministischen Touring-Maschinen zu arbeiten,
kann man jetzt mit dieser Überprüfungsidee arbeiten
Da führt man sich an sogenannten Verifikationsalgorithmus ein. Das hat
jetzt nichts mit Verifikationen im Sinne der Programmverifikation zu tun,
sondern nur in dem Sinne, dass man sagt,
ich möchte verifizieren, ob eine behauptete Lösung tatsächlich eine ist.
Das hat den Vorteil, dass man jetzt wieder mit deterministischen Algorithmen arbeiten kann.
Das sagt man Diofikationsalgorithmus, das ist ein deterministischer Algorithmus.
Dem gebe ich zwei Argumente. Nämlich einmal die Probleme in Stanz X,
also eben beispielsweise der Graf und ein sogenanntes Zertifikat Y.
Das ist ein Beispiel von eben dann eben der Pfad,
von dem ich behaupte, dass das der längste Pfad sein soll.
Und A verifiziert dieses X Wenn es eben ein Zertifikat Y gibt,
derart, dass er dann eben überprüfen kann,
dass XY tatsächlich eine positive, also das X tatsächlich eine positive Instanz ist.
Und die von A verifizierte Sprache, das sind dann eben all diese Xe,
also die vorherigen Probleminstanzen, für die es irgendwie ein Zertifikat Y gibt,
mit der Eigenschaft, dass A von XY gleich eins ist.
Also in dem Beispiel von eben, würde man sagen,
Verifikationsalgorithmus für dieses längste Pfadproblem,
der kriegt einen ungerichteten Graphen und diesen Staat und Zielknoten,
S&T und eben ein Pfad vorgelegt, von dem behauptet wird,
dass der länger ist als K. Und dann überprüft er,
ob der tatsächlich länger ist als K.
Dann hat man einen deterministischen Verifikationsalgorithmus für das Problem
Und jetzt sagt man, wenn der in Polynumialzeit abläuft,
also wenn ich in Polymialzeit überprüfen kann, gegeben ein Zertifikat,
ob das x eine Jahrenstanz ist oder nicht,
dann erwische ich damit auch die Klasse NP.
Das ist die Aussage hier. In NP sind jetzt genau die Sprachen,
die durch einen Algorithmus im Polynialer Zeit verifiziert werden können.
Und zusätzlich verlangt man noch, dass das Zertifikat Y,
dass das eben auch eine Länge polynumiell in der Eingabe X hat.
Mit der Begründung dann. Wenn er jetzt nämlich polynumiell in X
ist, dann ist er auch polynumiell in X und Y.
Genaue Definition
Problem, LSNNP, genau dann, wenn, ist so ein Verifikationsalgorithmus gibt,
der im Polymialzeit abläuft, mit eben dieser Eigenschaft.
Das ist im Grunde genommen das Gleiche wie eben,
nur dass hier jetzt zusätzlich verlangt wird,
dass A im Polymialzeit abläuft und dass das Zertifikat diese polymielle Länge hat.
Nein, jetzt kann man sich überlegen, warum ist das
das Gleiche wie das, was wir vorher als NP eingeführt haben?
Wenn man vorher einen NP-Algorithmus für irgendwas hatte,
dann hieß das, man hatte eine nicht-diterministische Touring-Maschine,
die bei Vorgabe einer bestimmten Eingabe, wenn sie die dann akzeptiert,
irgendwie eine Erfolgsrechnung hat für diese Eingabe.
Möglicherweise mehrere, aber sie hat
mindestens eine Erfolgsrechnung
Als Zertifikat könnte man also genau diese Erfolgsrechnung nehmen.
Könnte man genau sagen, naja,
in dem und dem Schritt musst du halt irgendwie deine erste mögliche,
deinen ersten möglichen Übergang nehmen, da deinen dritten,
deinen vierten, deinen fünften und so weiter.
Dann hat man Verifikationsalgorithmus, der das entscheidend,
der das berechnen kann, ob die NTM was akzeptiert oder nicht.
Und andersrum, wenn ich einen Verifikationsalgorithmus habe und ich frage mich,
ob es eine NTM gibt, die das Gleiche tut,
dann kann die NTM quasi das Zertifikat einfach raten.
Deswegen wird hier auch verlangt,
dass das Zertifikat nur polynumielle Länge in der Eingabe hat.
Die NTM würde nämlich
nur das X kriegen
Und jetzt rät sie das Y. Und da sie ja im Polymialzeit ablaufen soll,
kann das Zertifikat nur polymäre Länge in der Eingabegröße haben.
Sonst würde sie mehr Schritte machen. Und wenn das Zertifikat geraten hat,
dann macht sie einfach das Gleiche hier wie der Algorithmus A.
Der ist ja eh deterministisch, dann brechnet sie einfach A von XY.
Deswegen sind die beiden Definitionen äquivalent. Und mal ist die
eine Hut mal, ist die andere gut.
Diese Verifikationsalgorithmus-Sichtweise, die benutzt man ganz häufig in der Algorithmik.
Und die andere mit nichtdeterministischen Toolmaschinen eben eher so in
der Theorie, sind aber eben beide äquivalent.
Da steht es auch nochmal
Das ist Beispiel dieses Mengenpartitionsproblem, was wir gestern ja schon mal hatten,
gegebene Teilmenge der natürlichen Zahlen, eine endliche,
dann suche ich jetzt eine Menge A, sodass eben,
wenn ich all die Elemente DNA sind,
aufsummiere und all die Elemente DNS ohne A sind,
aufsummiere, dass da das Gleiche da rauskommt.
Sowas ist gesucht. Und jetzt kann man das entweder mit einem Verifikationsalgorithmus machen,
dem würde man dann einfach als Zertifikat beispielsweise die Menge A. vorlegen.
Der kriegt dann als Eingabe die Menge S und als Zertifikat
die Menge A. Und dann kann er einfach überprüfen,
ob die Elemente in A aufsummiert und die Länge im Kompliment von A. aufsummiert,
ob das das Gleiche ist.
Und nicht der terministische Algorithmus, der würde die Menge A. raten.
Der geht am Anfang einmal über die Menge erst rüber und redet bei jedem,
oder wählt bei jedem Element nicht terministisch,
ob das in der Menge A drin sein soll oder nicht.
Und beides geht schnell, ne
Bei nicht-diterministischen Algorithmus sieht man es halt gut. Dieses Raten,
da braucht er einmal so viele Schritte für,
wie die Menge A eben groß ist,
weil sich jedes Element einmal anguckt und eben redet,
sollte drin sein oder nicht.
Die Menge S, er guckt sich einmal die Menge S
an und redet für jedes Element,
ob es in der Menge A drin sein soll oder nicht.
Und dann berechnet er noch einmal kurz diese beiden Summen,
irgendwie, das ist in den Jahrzeiten möglich.
Das ist nochmal das, was ich eben versucht habe,
ein bisschen zu verbal zu erzählen,
dass die Definition eben Äquivalent sind
Fragen dazu mir. Wenn wir genauso bezahlen.
Hast du gesagt, in NP? Hast du gesagt,
in P oder in NP? In NP. Etwas ist
in, nee, nochmal.
Also in NP
Also im Grunde genommen gerade für den Stream,
es ist gerade die Frage nochmal nach dieser genauen Unterscheidung zwischen der Definition von NP
mittels einer nicht-deterministischen Toury-Maschine oder der Definition von NP mittels eines Verifikationsalgorithmus.
Die Idee ist, normalerweise führe ich die Klasse NP ein,
indem ich sage, da sind all die Sprachen drin,
die von der nicht-deterministischen Touring-Maschine im Polinialzeit akzeptiert werden können.
Was ich jetzt üblicherweise mache, wenn ich irgendwie ein Problem habe,
für das ich irgendwie was,
also wenn ich ein Problem habe,
das ich irgendwie entscheiden will in NP,
dann habe ich halt im Unterschied zu P noch die
Möglichkeit,
diesen Nicht-determinismus auszunutzen
Wenn ich jetzt also dieses längste Pfadproblem von vorhin testen möchte,
also gegeben, ein ungerichteter Grafenstatuen, Zielknoten,
gibt es einen Pfad der Länge mindestens K von da nach da.
So, das möchte ich jetzt ermitteln. Das geht in P nicht so einfach,
weil man irgendwie bei kürzesten Faden kann man immer ausnutzen,
dass man quasi so wellenartig weitergeht und immer weiß,
was gerade der kürzeste Weg von da zu allen Knoten ist.
Das kann man dann immer wieder aktualisieren. Beim längsten Fahrt
geht das irgendwie nicht so einfach. Das heißt,
wenn ich irgendwo anfange und jetzt sage, oh,
die Kante kostet mich 500 und die nur eins,
nehme ich mal die, dann kann es sein,
dass die Entscheidung sich nachher als falsch herausweist,
weil es hier jetzt teurer wird oder irgendwie sowas.
Das kriege ich irgendwie nicht so schnell raus.
Beim NP-Algorithmus kann ich mir aber quasi einfach
alle Fahrer gleichzeitig angucken
Indem ich in den ersten Schritten eine Knotenfolge rate und danach
nur noch verifiziere, ob mindestens eine dieser Knoten folgen.
Ein Pfad ist vom Staat zum Ziel, der die Länge mindestens kagelt.
Das ist dieses Raten. Und beim Verifikationsalgorithmus,
da wird gesagt, ein Problem ist dann ein NP,
wenn ich so einen deterministischen Verifikationsalgorithmus habe,
der kriegt einmal die Probleminstanz als Eingabe und ein Zertifikat,
mit dem ich quasi behaupte, guck dir das Zertifikat an,
dann weißt du, ob die Probleminstanzen ja oder eine 9-Instanz ist.
Und bei diesem Grafproblem wieder von eben,
da wäre ein gutes Zertifikat zum Beispiel die Folge der Knoten,
die vom Staat zum Ziel führt und eben mehr als
Karkanten hat
Ein schlechtes Zertifikat wäre irgendwie einfach nur ein Knoten. Da denkt man irgendwie,
das kann zwar auch ein Zertifikat sein so,
aber das überzeugt mich nicht davon, dass das eine Jahrinstanz ist in dem Beispiel.
Deswegen muss man, wenn man Virofikationsalgorithmus angibt, immer angeben,
wie die Zertifikate aussehen sollen und was der Algorithmus dann damit macht.
Okay, sonst noch Fragen. Gut, dann,
was man jetzt macht, ist, jetzt wissen wir irgendwie,
okay, es gibt diese Klasse P, es gibt diese Klasse NP,
nicht die terministische Algorithmen lassen sich aber irgendwie nicht implementieren,
weil alle Rechnermodelle,
die wir haben,
sind ja
irgendwie deterministisch
Und jetzt kann man sich erst mal überlegen,
wenn ich jetzt also weiß,
dass ein Problem in NP liegt und mir fällt zuerst mal nichts ein,
wie ich zeigen kann, dass das in P liegt,
wie kann ich das jetzt irgendwie deterministisch lösen?
Also wenn ich irgendwie mehr Zeit und mehr Platz
zur Verfügung habe, wie kann ich das machen?
Also wie löst man so ein Problem aus NP deterministisch?
Und geht das überhaupt? Kann ja auch sein,
dass das gar nicht geht,
sondern dass das irgendwie dringend nötig ist, dass diesen Nicht-Determinismus auszunutzen.
Da wissen wir schon, das muss irgendwie deterministisch gehen,
weil wir ja jede NTM in eine äquivalente DTM umwandeln können.
Das war diese Idee,
dass die DTM quasi eine Breitensuche in dem Baum der Konfiguration
der nicht-deterministischen Touring-Maschine macht
Also irgendwie muss es gehen. Die Frage ist, wie
aufwendig wird das? Und was man halt zeigen kann,
ist, wenn ich so eine Sprache habe,
die sich nicht die terministischen Polymialzeit lösen lässt,
dann gibt es irgendwie eine Konstante und einen deterministischen Algorithmus,
der das dann in zwei von zwei Hocho von Herrn Hochkahl löst.
Soll bedeuten, wenn es hier eine Touring-Maschine gibt,
die dieses Problem L in O von N-Hochkahl löst, dann gibt es einen,
die das deterministisch in zwei Hocho von Herrn Hochkahl löst.
Wie macht man das, wenn LNLP ist,
da gibt es so einen Verifikationsalgorithmus,
der irgendwie in dieser Zeit abläuft und das Zertifikat hat so
eine Länge irgendwie hier in O von N hochc
Ja, für irgendeine andere konstante C. Und dann geht man
alle diese zwei Hoch-O von Endhoch-C-Zertifikate durch und führt für jeden den Verifikationsalgorithmus aus.
Und dann ist man fertig. Also wenn ich weiß,
das Zertifikat hat beispielsweise die Länge 10 und wir nehmen mal an,
ich habe als Eingehalts,
als Alphabet nur 0 und 1,
dann sind die möglichen Zertifikate halt all die Werte zwischen 10 0 und 10 einsen.
Und all diese Zeichenketten kann ich mir raten.
Und danach kann ich einfach deterministisch
den Verifikationsalgorithmus ausführen
Äh, beraten und jetzt bin ich selbst durcheinander gekommen.
All diese Zertifikate bestimme ich nacheinander. Das sind zwei Hochendviele.
Und für jedes, für ich dann diesen Verifikationsalgorithmus aus.
Ich will ja gerade deterministisch sein und ich nicht deterministisch.
Klar, also ich mache quasi das,
was die nicht deterministische Touring-Maschine durch ihr Raten macht.
Das mache ich quasi sequenziell hintereinander. Das kann ich deswegen machen,
weil ich eben dieses Zertifikat,
was die nicht deterministische Touring-Maschine sonst raten würde,
weil ich die einfach alle nach und nach
aufbauen kann
Das hier? Die Notation hier, das stimmt,
er hat gerade gefragt, was das hier soll,
weil das da oben ja jetzt irgendwie eine Menge ist,
die Schreibweise hier, so bedeuten das, oh,
verschluckt ja quasi immer eine Konstante, also in dem N-Hoch,
in dem U von N-OK sind ja all die Funktionen drin,
die sich irgendwie ausdrücken,
da ist als irgendeine konstante zehnmal dieses N hochkam.
Und die Notation hier soll bedeuten,
es gibt irgendwie eine konstante, ich nenne jetzt mal D,
weil D hatte ich noch nicht,
derart,
dass die Laufzeit beschränkt ist durch zwei
hoch D-Mal-N-Hochka
Nee, das wäre,
wenn du das O hier vorne hin schreiben würdest,
also O von 2 hoch N, dann wäre die Konstante ja unten,
dann würde das eine Konstante wieder,
das D-Verschlug irgendwie von dem mal zwei hoch N oder dem mal zwei Wochen LOK.
Ja, dann kommt ja was anderes raus.
Oder? Nee
Nee. Ich will ja die Konstante da oben verschlucken. Ich möchte ja auch sagen,
dass es... Dann wäre es ja nur eine Adition.
Also wenn du dann hast zwei hoch, irgendwas,
mal zwei hoch, irgendwas, du willst eine Adition.
Also zumal die Idee hierbei ist, du sollst dir da
jetzt nicht irgendwie eine konstante aussuchen dürfen, sondern es wird quasi eine verschluckt.
Man kann jetzt irgendwie so ähnlich wie man sagt,
bei diesen Linearzeitalgorithmen, die wir in der letzten Vorlesung hatten,
mit diesem Max Mustermann und so, hat man ja gesagt,
wo die Laufzeit ist in U
Und die Idee war, dass diese Notation bedeuten sollte,
es gibt eine bestimmte Konstante, die ich jetzt aber nicht genauer bestimmen möchte,
sodass die Laufzeit in D mal N ist.
Also sie sollen mir sich nicht aussuchen dürfen,
sondern es gibt sie immer, wie sie noch nicht aufschreiben.
Eine Sache noch hier mit dem N hoch C und N hoch K,
also eigentlich wäre die Laufzeit hier ja,
wenn man alle diese zwei Hochofen N hoch C-Zertifikate durchgeht und
für jedes so ein Verifikationsalgorithmus in der Laufzeit hier ausführt,
dann wäre die Laufzeit ja eigentlich zweimal O von N hoch C multipliziert mit O von N hoch
K. Und dann kann man aber dieses O von N hoch
K abschätzen durch zwei Hochofen N hoch K.
Das kommt hier nochmal
In der Laufzeit ist das Verfahren eigentlich,
jetzt kann man dieses O von N hochkarl nach oben abschätzen,
durch zweimal, zwei Hochufen Endhochkarl, dann hat man das.
Und dann darf man eben K-Größe gleich C annehmen,
weil sonst die Laufzeit kürzer wäre, als eben die Zertifikatlänge.
Das ist üblicherweise nicht so. Und dann kann man hier noch
das Zwei-Beruf von NOC abschätzen, durch zwei Hof oder nur hochk.
Und dann hat man eben das hier. Und dann hat man
da, verschluckt man die Zwei ja auch nochmal mit.
Und dann weiß man, dass die Laufzeit in zwei Hofen
in OK ist. Was wichtig ist, mitzunehmen,
ist für einen Algorithmus, der nicht die terministischen Polenialzeit abläuft,
kann ich einen machen,
der deterministisch in Exponentialzeit abläuft
Indem ich alle Zertifikate rate. Genau. Da nochmal die beiden Beispiele,
die wir jetzt ja auch gestern und eben auch schon hatten,
deterministisch wäre dieser Algorithmus, wenn ich hier sage,
ich gehe alle Timing von S durch, wenn S jetzt irgendwie en viele Elemente hat,
dann gibt es eben zwei hoch enden viele Teilmengen.
Deswegen ist die Laufzeit dann die terministische in O von zwei hoch enden. Und wenn ich das nicht deterministisch mache,
wenn ich hier sage, ich rate eine so eine Teilmenge,
dann ist die Laufzeit eben die Terminist,
nicht die terministische in O von S, weil dieses Raten,
das kriege ich in esst vielen Schritten hin,
ich gucke mir jedes Element von S an und rate,
ob es drin sein soll oder nicht in A,
Und dann habe ich eine Laufzeit in Ohren von S.
Also viel schneller, ne? Also hier irgendwie O von 2
hoch S. Böse Laufzeit, O von S gute Laufzeit,
aber bedauerlicherweise eben in NP. Genau. So,
und hier gibt es jetzt noch so eine Liste von vielen
weiteren Problemen, die irgendwie DNP liegen.
Nur das ist so ähnlich. Da kriege ich jetzt eine
Menge gegeben und eine natürliche Zahl Tee und ich möchte wissen,
ob ich eine Teilmenge finden kann in S, die sich gerade zu Tee aufaddiert.
Beim Clicken-Problem kriege ich einen Grafen und eine Zahl K und möchte wissen,
ob eine K klickt in dem Grafen ist.
Also ob es irgendwie K viele Knoten gibt,
die alle paarweise miteinander verbunden sind
Und beim Färbungsproblem kriege ich einen Graphen G gegeben und eine Zahl K und möchte wissen,
ob ich den mit K-Farben färben kann, wobei Färben bedeutet,
ich gebe jedem Knoten eine Zahl von 1 bis K
und keine zwei benachbarten Knoten dürfen die gleiche Farbe haben.
Das sehen wir nachher noch hier, das Klicke-Problem.
Und das Herbungsproblem kommt auf den Übungszettel dran.
Und was man sich halt schnell überlegen kann,
was auch bei den Übungen einmal gemacht werden soll,
ist, sind tatsächlich all diese Probleme in NP.
Falls ja, wie würde man das machen?
Also entweder was würde nicht die terministische Algorithmus machen oder
was wäre das Zertifikat
Und beim Clique-Problem zum Beispiel, und wenn ihr wissen wollt,
ist da eine Karklicke drin,
dann wäre ein gutes Zertifikat eben einfach Karknoten,
von dem man behauptet, dass es eine Clique ist.
Und dann kriege ich dieses Zertifikat und überprüfe einfach deterministisch,
sind diese Karknoten alle paarweise miteinander verbunden.
Falls ja, ist eine Karklicke, falls nein, nicht.
Genau, und beim Färbungsproblem einfach eine Liste aller Knoten mit
der Farbe, die sie kriegen sollen.
Und dann gehe ich halt alle Kanten durch und gucke,
ob die unterschiedlich gefärbt sind.
Und das würde man da machen. So, die hier,
die sind alle in NP,
lassen sich also schnell nicht deterministisch lösen und die besten bekannten
deterministischen brauchen aber
exponentiell viel Laufzeit
Und jetzt ist halt die Frage, ob es wirklich nicht schneller geht.
Hier steht ja nur die besten bekannten, deterministischen Algorithmen,
benötigen exponentielle Laufzeit, was ja nicht bedeutet,
dass es keinen deterministischen Algorithmus gäbe, geben könnte,
der nicht schneller ist.
Das heißt erstmal nur, es hat noch keiner einen gefunden.
Und was man jetzt gerne hätte, ist eine Möglichkeit zu sagen,
für dieses Problem gibt es keinen Algorithmus mit der und der Laufzeit.
Also es wäre schon mal cool,
wenn man überhaupt sagen könnte, lineare Laufzeit geht nicht.
Also wenn man wenigstens O von N
ausschließen könnte oder sowas
Kann man aber alles irgendwie noch nicht, aber so eine
Technik hätten wir gerne. Das hier ist noch allgemeiner,
also dieses Problem lässt sich für kein KNU von NOK lösen.
Das wäre richtig super, dann könnten wir zeigen,
dieses Problem lässt sich nicht im Problem Jahrzeit lösen.
Können wir aber leider nicht. Was wir machen können,
ist, wir können unsere Vermutung, dass das nicht geht,
möglichst gut untermauern. Also dafür sorgen,
dass wir zu sowas kommen, wie wenn das jetzt doch geht,
dann passieren diese und diese und diese sehr, sehr,
sehr unwahrscheinlichen Sachen.
Das unterstützt einen dann in der Vermutung,
dass das eben nicht geht,
weil dann würden komische Dinge folgen
Was wir machen ist, wir zeigen das Problem in eine bestimmte Eigenschaft haben,
sodass wenn das Problem doch im P lösbar ist,
sehr unwahrscheinliche Dinge folgen würden. Also wir wollen zum Beispiel zeigen,
das Clique-Problem hat eine bestimmte Eigenschaft, die uns dabei hilft zu sagen,
naja, also wenn das jetzt IP wäre,
dann würde echt was ganz, ganz Komisches folgen.
Was wir machen, ist, wir wollen etwas etablieren,
um sagen zu können, dass ein Problem zu den schwierigsten Problemen seiner Klasse gehört.
Dann können wir sagen,
das Problem gehört zu den schwierigsten seiner Klasse und die Idee ist nachher,
dass wir quasi, das ist dann dieser Begriff NP vollständig,
es gibt ganz viele Probleme in NP, die NP vollständig sind.
Das sind die schwierigsten Probleme dieser Klasse und wenn eins
davon schnell gelöst werden kann,
dann können alle
schnell gelöst werden
Und das hilft dann,
wenn man dann für ein neues Problem zeigen kann,
das ist NP vollständig, dann weiß man,
das ist genauso schwierig, wie all diese 10.000 anderen Probleme,
von denen wir schon gezeigt haben, dass die NP schwierig sind.
Und dann, das unterstützt einen da drin, dass es sehr unwahrscheinlich ist,
dass es effizient gelöst werden kann, weil, wie gesagt,
an all die anderen Probleme auch effizient gelöst werden können.
Und an denen hat man halt schon teilweise seit 2000 Jahren
rumgearbeitet und keinem müssen effizienter Algorithmus eingefallen.
Also es ist irgendwie unwahrscheinlich, dass es da einen gibt.
Für das hier, um das schwierigste Problem einer Klasse einzuführen,
dafür brauchen wir den Begriff der Reduktion.
So, und jetzt wird es tricky. Fragen bis dahin
, jetzt wird es gleich schwierig
Die kommt jetzt auch erst. Fragen. Gut, dann
Reduktion. Reduktion, die Idee bei der Reduktion ist,
ich möchte ein Problem in ein anderes umwandeln mit bestimmten Eigenschaften,
aber ich will ein Problem in ein anderes umwandeln.
Wenn ich zwei Sprachen habe, L1L2, in dieser Sprachsichtweise,
das sind ja Probleme, dann sagen wir,
dass du L1 auf L2 in polynumialer Zeit reduzieren können,
wenn, ist eine polymialzeitberechenbare Funktion gibt,
mit der folgenden Eigenschaft
Wenn X in NL1 ist, dann ist auch F von
X in L2. Und wenn X nicht in LL1 ist,
dann ist F von X nicht in L2. Bedeutung.
Ich will also einen Algorithmus angeben. Das ist diese Impolenialzeit berechenbare Funktion F,
die mir eine Probleminstanz des einen Problems in Probleminstanzen des anderen Problems umwandelt.
Und zwar mit der Eigenschaft, wenn das eine eine Jahrinstanz ist,
dann soll auch mein neukonstruiertes Problem eine Jahrinstanz sein.
Und wenn das eine 9-instanz ist, dann soll auch mal
neu konstruiertes Problem eine 9-instanz sein. Das führt dazu,
dass ich dann meine andere Sprache,
wenn ich einen Algorithmus für meine andere Sprache habe,
auf die ich reduziert habe,
dann kann ich jetzt auch das ursprüngliche Problem lösen,
indem ich einfach die gleiche Antwort gebe
Notation so, L1, kleiner gleich L2. Und da unten nur noch mal 5,
das ist dann für die Nachbereitung statt diesem kleinen gleich P,
gibt es auch sowas wie kleiner gleich Poll oder kleiner gleich OMP und
ein M. P oder Poll steht eben immer für Polynomiel,
dass man weiß, das ist eine polemielle Reduktion,
dass man kleiner gleich nimmt.
Das hat damit zu tun, dass man weiß,
dass L1 höchstens so schwierig ist wie L2 und eben nicht schwieriger.
Also das kleiner Gleiche ist sozusagen als kleiner gleichbezüglich der Schwierigkeit
des Problems
zu lesen
Zu lesen und das M, das steht für Many One,
weil hier oben quasi nur gefordert wird,
das Jahrinstanzen auf Janstanzen abgebildet werden und Nein-Instanzen auf Nein-Instanzen.
Man kann aber mehrere Jahrinstanzen des einen Problems auf eine Jahrinstanz des anderen Problems abbilden.
Sieht man gleich auch noch mal in der Abbildung da.
Hier habt ihr euer eines Problem A,
also eure eine Sprache A,
die grünen Punkte sind die Ja-Instanzen,
die roten Punkte sind die Nein-Instanzen und eingebettet halt in die ganze,
in die Menge aller Zeichenketten über dem Alphabet
und das bildet ihr jetzt ab auf irgendwie so ein neues
Problem B hier
Und dann müsst ihr eben deswegen die Pfeile hier, ja,
Instanzen der Einmenge sollen auf Jahrinstanzen der anderen Menge abgebildet werden
und Neininstanzen der Einmenge sollen auf Neininstanzen der anderen Menge abgebildet werden.
Und es ist weder gefordert, dass sie auf der rechten Seite alle Elemente erwischt.
Also beispielsweise ist hier ja der eine grüne Dot,
der hat nichts abgekriegt und die beiden roten ja,
die haben auch nichts abgekriegt.
Das ist okay und es ist auch okay,
dass irgendwie mehrere Pfeile von der linken Seite zu einem Element auf der rechten Seite gehen.
Das ist alles okay. Wichtig ist nur, ja,
Instanzen auf Jahrinstanzen, Lineinstanzen auf Neininstanzen.
Einmal kurz die Folie, die ich übersprungen habe hier
Die könnt ihr euch zu Hause nochmal angucken.
Da steht einfach nur, dass hier dieses Sigmar-Stern- und Gamma-Stern,
das können halt prinzipiell auch unterschiedliche Alphabete sein.
Das brauchen wir jetzt hier aber eigentlich nicht so.
Üblicherweise haben wir ja nur mit 0 und 1 irgendwie zu tun.
Ja. Das hier, mit einem Brühe als berichbare Funktion
, das? Nee, berechenbar heißt,
es gibt eine Touring-Maschine, die die Funktion F berechnen kann.
Also der ich quasi so ein X vorlegen kann und
dem berechnet sie das F von X. Ja.
Also beziehungsweise man kann es so machen, dass sie hält.
Es wird eigentlich nicht gefordert zwingend,
aber kann man so machen,
dass sie dann anhält
Hängt damit zusammen, dass sie ja in Pulin die Allzeit ist.
Dann kann man wieder diese Geschichte von vorhin machen,
dass man erstmal das Pulinom ausrechnet und dann weiß man,
nach wie vielen Schritten sie anhalten muss.
Also wenn man sich hier jetzt irgendwie mit diesem inpulinialzeit berechenbare Funktionen und so,
wenn man sich mit der Denkweise gerade schwer tut,
eine andere Denkweise ist eben zu sagen, es gibt einen Algorithmus,
den kann ich Probleminstanzen des einen Problems vorlegen und das berechnen wir Probleminstanzen des anderen Problems.
Also wenn ich das Problem habe,
vorhin dieses Teilsummen-Berechnungsproblem auf der einen Seite und auf der anderen Seite dieses Problem,
einen längsten Pfad in einem Grafen zu finden,
dann wandelt eine Reduktion eben immer Dieses eine Problem,
wo ich nur eine Menge S habe, um ein anderes Problem,
wo ich irgendwie einen Grafen habe und Knoten und so weiter.
Und die Idee ist dann, wenn es hier eine Lösung gibt,
dann gibt es auch hier einen und wenn es hier keine gibt,
dann gibt es hier auch keine.
So soll die Reduktion sein. Nee,
du kannst zeigen, dass wenn du jetzt einen Algorithmen,
also wenn du eine Reduktion hast und du hast einen Algorithmus für das Problem,
auf das du reduzierst,
also in dem Fall für diese Menge
B hier
Dann kannst du jetzt auch das andere Problem lösen,
indem du erst die Reduktion machst.
Und dann das Problem hier auf der rechten Seite entscheidest.
Deswegen auch Reduktion. Man hat quasi seine Aufgabe,
diese Menge A zu entscheiden. Darauf reduziert die Menge B
zu entscheiden. So, dann nochmal Ja, Instanzen werden
auf Janstanzen abgebildet. Nein, Instanzen auf Nein-Instanzen.
Damit gibt es eben die gleiche Antwort auf die Frage,
ob XNA ist oder ob F&XNB ist.
Und da nochmal viele Janstanzen können
auf eine Ja-Instanz abgebildet werden.
Daher auch Many-Wan-Reduktion
So. Und jetzt das, was ich eben hier als Antwort kurz hatte mit dem,
dass man damit jetzt das andere Problem lösen kann.
Was noch viel schöner ist, wenn ich zwei Sprachen habe,
und ich kann L1, Imponimialzeit auf L2 reduzieren, dann folgt,
wenn ich L2 entscheiden kann, kann ich jetzt auch L1 entscheiden,
aber viel besser noch, wenn ich L2 schnell entscheiden kann.
Also wenn L2 in P ist,
dann liegt auch L1 in P. Idee dabei,
gegeben einer Instanz des Problems L1, also gegeben ein X,
wo ich testen möchte, ist X&L1 oder nicht,
berechne ich erst die Reduktion, also diese Polinialzeitreduktion,
dass er eine Polinialzeitreduktion,
sprich, ich brauche eine Polymial viele Schritte dafür.
Und danach löse ich die Frage, ob F von X in L2 ist.
Und der L2 ja in P entschieden werden kann,
habe ich quasi zwei Polynome, die ich hintereinander ausführe.
Das bleibt ein Polymialzeitalgorithmus. Da nochmal ein Detail,
wenn ich L1 auf L2 reduzieren kann,
dann gibt es so eine Reduktionsfunktion mit dieser Eigenschaft,
X ist in L1, genau,
dann werden Aphone X in L2 ist,
die in Polinialzeit berechnet werden kann.
Wenn L2 IP ist, dann kann L2 von einem Algorithmus
imponieren, der als Zeit entschieden werden.
Und jetzt macht der Algorithmus der L1 im Polymialzeit entscheidet,
folgendes,
er berechnet zuerst F von
Und dann nutzt er A2 um F von X,
bin L2 zu entscheiden. Und wir wissen dann,
wenn er von X&L 2 ist,
dann ist X&L 1 gewesen und wenn F von X nicht in L2 ist,
dann ist X auch nicht in L1. Also haben wir einen Algorithmus,
der L1 entscheidet.
Und was wir uns noch angucken müssen, ist,
ob der wirklich im Kolonialzeit abläuft.
Also man hat hier hier ein Polynom und da ein Polynom.
Bei beiden Schritten, da ist nochmal, wie er arbeitet.
Und jetzt arbeitet auch ein Polynonialzeit. Warum? Erstmal berechnet er
ja das F. Da braucht er irgendwie x, x,
hoch c, viele Schritte für, um das F von X zu berechnen.
Und das F von X, was rauskommt,
ist dann von der Länge her eben auch in diesem O von X hochzähne.
Also wenn ich X hochc viele Schritte brauche, dann kann die Ausgabe,
die ich produziere, eben nicht länger sein als dieses X hochc.
Und dann ist die Laufzeit von A2 eben durch,
Laufzeit von A2 ist ja auch irgendwie ein Polynom,
N hochd oder so,
da packe ich jetzt das F von X rein,
F von X ist in U von X hochc.
Und dann habe ich hier O von X hoch zehnmal D.
Insgesamt, also die Laufzeit da. Das war jetzt ein bisschen schnell,
die Idee ist hier, die Schritte hier,
dieses X hochc, die brauche ich,
um das F von X
zu bestimmen
Und dann brauche ich ja N-Hoch-D-fiele Schritte, um den Algorithmus A2
zu starten. Und das N kann jetzt aber eben von
der Länge her eben in diesem X hoch C sein.
Deswegen kommt da irgendwie X hoch 10 mal D raus.
Und ja, genau. Und das,
das ist wieder ein Polynom, also habe ich einen Algorithmus,
der L1 im Polynom der Allzeit entscheidet. So,
jetzt haben wir erstmal eine Reduktion und wir wissen,
wenn wir das Problem, auf das wir reduzieren,
wenn wir das effizient lösen können,
dann können wir auch das ursprüngliche Problem effizient lösen
Genau, da steht das nochmal, was ich eben
so alles erzählt habe. Und jetzt nochmal zu diesem,
jetzt kommt gleich der Übergang zu dieser NP-Vollständigkeit und nochmal,
um irgendwie dieses Zeichen jetzt zu erläutern,
dieses Zeichen bedeutet jetzt,
dass höchstens so schwierig ist wie
Deswegen auch so kleiner gleich. Also es ist quasi von der,
von seiner Schwierigkeit, es ist kleiner gleich, die Schwierigkeit von B. Warum?
A, kann nicht schwieriger sein. Wenn ihr B schnell
lösen könnt, dann könnt ihr auch A schnell lösen.
Weil ihr dann erst diese Reduktion macht und dann eben,
B, schnell löst und damit habt ihr auch A schnell gelöst.
Also kann A, nicht schwieriger sein als B,
zumindest mit dieser Brille, dass man sagt, alles,
was mit Polynomen zu tun hat, ist nicht wirklich eine Verschnimmerung.
Weil man erst diese Reduktion,
also eben war es ja auch so,
dass man gesagt hat, irgendwie,
dein Algorithmus ist in O von N hoch D und der andere ist dann in O von N hoch 10 mal D.
Das ist natürlich schlimmer, aber wenn man nur mit dieser Polynombrille draufguckt,
dann sagt man, ja,
das ist ein beides Polynom,
ist beides gut
Was eben nicht sein kann, ist, dass Aalen Exponentialzeit gelöst werden kann und
nur in Exponentialzeit gelöst werden kann und B im Polynumialzeit.
Dann würde ich sagen, naja,
dann nehme ich jetzt statt diesem Exponentialzeitalgorithmus,
den ich für A habe, nehme ich doch jetzt lieber den,
wo ich erst die Reduktion mache und dann B in Polymialzeit bestimme.
Das ist viel schöner. Und jetzt kommt die Idee für
die NP-Vollständigkeit. Wenn man jetzt jede Sprache aus NP
auf eine neue Sprache reduziert, dann bedeutet das,
dass L mindestens so schwierig ist wie ganz NP.
Ich reduziere alle Sprachen aus NP
auf meine neue Sprache
Und wenn ich die jetzt nämlich schnell lösen kann,
dann kann ich alles in der NP schnell lösen.
Und das macht es dann eben sehr unwahrscheinlich, dass diese Sprache
schnell gelöst werden kann. Wenn jetzt nämlich L in P wäre,
dann würde P gleich NP folgen und das ist sehr unwahrscheinlich,
dann würden nämlich plötzlich alle die Probleme,
die wir schon kennen,
aus NP
schnell lösbar sein
Ja, die Frage war,
ist doch da jetzt irgendwie ein Unterschied zum Halteproblem gibt,
weil beim Halteproblem wissen wir, das ist unentscheidbar.
Und hier mache ich jetzt ein bisschen Rumgeeier,
indem ich sage, ja, wir wissen es nicht besser.
Ist richtig. Ist genauso. Genau, man weiß es
halt einfach nicht besser. Man versucht quasi, man stellt fest,
so irgendwie im Doof, wir haben keine Technik,
um nachzuweisen, ob das Problem tatsächlich nicht effizient gelöst werden kann.
Deswegen versucht man jetzt eine Technik zu entwickeln,
mit der man das zumindest irgendwie gut untermauern kann,
dass das nicht geht.
Und das hier ist
eben eine sehr verbreitete und sehr gute Technik
Weil man das tatsächlich, man kann diese PNP-Frage,
also die Frage, ob P gleich NP ist,
die kann man noch aus ganz vielen anderen Blickwinkeln betrachten und alle Blickwinkel deuten darauf hin,
dass die eben eigentlich nicht gleich sein können.
Man kann da auch so mit Logikargumenten noch rangehen und so.
Deswegen ist diese Aussage hier, wenn er jetzt in P
wäre, dann ist P gleich NP.
Das ist ihm die Aussage, dass LNP ist sehr unwahrscheinlich,
weil man daran eben echt nicht glaubt, dass P gleich NP ist.
Ja, das ist die Idee bei NP-Vollständigkeit,
formal eingeführt, eine Sprache wird als NP vollständig bezeichnet,
wenn sie erstens in NP ist und zweitens,
ich jedes Problem aus NP auf L reduzieren kann in Polymialzeit
Und dann gibt es noch so eine weitere Sache,
wenn man das erste gar nicht zeigen kann,
wenn man zunächst vielleicht nur die zweite Eigenschaft zeigen kann,
dann ist LNP schwierig. Das tritt dann auf,
wenn ich für ein Problem zeigen kann,
dass ich zwar alles aus MP darauf reduzieren kann,
dann weiß ich, dass es mindestens so schwierig wie alles in NP,
aber es kann auch viel, viel schwieriger sein.
Deswegen ist es nicht unbedingt möglich, den ersten Schritt auch zu zeigen.
Für unsere Fälle hier am meisten schon. Genau,
die vollständigen Probleme, die Komplexitätsklasse, die nennen wir jetzt NPC,
das C steht für Complete aus dem Englischen.
Wir haben also P, wir haben NP und wir haben
NP C für NP
Wie meint ihr, wie das hier, das Ven-Diagramm,
wenn man jetzt die Mengen da notieren will,
unter der Annahme, dass P ungleich NP ist,
wie sieht das dann aus?
Wo ist irgendwie P, wo ist NP und wo
ist NP Complete zu verordnen? Was meint ihr? Also
zum Beispiel hier ist NP und drumherum ist P. Ehrlich,
das würde bedeuten, es gibt mehr Probleme in P als NNP,
also da schon eher andersrum.
Und wo ist das NPC
Genau, aber wo ist jetzt das NPC? Wo werdet ihr
das hinmalen? Ja, und wo ist es noch?
Ja, genau. Also P ist hier so ein kleines Ei,
drumherum ist das NP und das NPC ist nochmal
so ein Ei irgendwo in NP drin,
was nichts mit P zu tun hat.
Also wo
der Schnitt leer ist
Genau, unter der Annahme, dass P-Ungleich-NP ist, unter der Annahme.
Ansonsten, genau, ansonsten wäre das nur das,
wo wir glauben, dass das so aussieht.
Also irgendwie so, ne? Also Peson-Ei-NP drumherum und die
NP-vollständigen liegen dann auch irgendwie drin und haben nichts mit P zu tun.
Und wenn man ein Problem finden kann,
das sowohl NP ist als auch NP vollständig,
dann weiß man,
dass P gleich NP ist
Was eben unwahrscheinlich ist. Da kommt es auch noch mal,
wenn ich eine Sprache habe, die NP vollständig ist,
wenn ich von der jetzt zeigen könnte, dass LNP ist,
dann würde sofort dieser sehr unwahrscheinliche Fall eintreten,
dass P gleich NP ist.
Beweis geht relativ fix, mit dem,
was wir vorhin schon hatten. Wenn ich das also weiß,
dass die Sprache LNP vollständig ist und NP,
dann nehme ich mir jetzt irgendwie eine Sprache aus NP.
Die kann ich, weil L ja NPV ständig ist,
im Polonialzeit auf L reduzieren.
Und weil L jetzt aber NP ist,
folgt aus dem Satz, den wir vorhin hatten,
dass dann
auch L-Strich NP ist
Und damit habe ich gezeigt, dass jedes L-Strich aus NP
eben auch ein P ist. Sprich, ich habe gezeigt,
dass NP eine Teilmenge von P ist, da ich das andersrum schon weiß,
P ist eine Timing von NP weiß ich,
habe ich gezeigt, dass P gleich NP ist.
Und weil das sehr unwahrscheinlich ist, dass dieses P gleich NP ist,
sagt man eben, wenn ich für ein Problem L nachgewiesen habe,
dass es NP vollständig ist, ist dieser Fall,
dass LNP ist, sehr unwahrscheinlich.
Also nehme ich quasi die Aussage, wenn ich für ein Problem nachweisen kann,
dass es NP vollständig ist, das nehme ich als Aussage,
dass ich sagen kann, für dieses Problem gibt es,
Klammer auf, sehr wahrscheinlich, Klammer zu,
kein Polymialzeitalgorithmus,
also kein Algorithmus,
der das Problem effizient löst
Das ist deswegen schön, weil man dann aufhören kann für
ein gegebenes Problem, so einen effizienten Algorithmus zu suchen.
Man kann dann anfangen, irgendwie andere Dinge zu tun.
Heuristiken entwickeln, Approximationsalgorithmen entwickeln, mit irgendwelchen anderen Techniken
da rangehen. Deswegen sind solche Unfähigkeitsbeweise, in Anführungsstrichen,
dann eben doch praktisch, dass man sagen kann, okay,
das geht zwar nicht, aber vielleicht geht was anderes.
In Levers? Ob einige NP-Complete-Probleme in der Natur gelöst wurden,
Heißt ich, ich habe gerade so ein Bild im Kopf,
wie zwei Käfer anfangen, irgendwie einen längsten Pfad zu suchen oder so.
In der Natur lässt sich, also, also ohne jetzt
Experte auf dem Gebiet zu sein, meines Wissens nicht.
Und wenn, dann arbeiten sie halt mit Heulesticken.
Oder mit sogenannten genetischen Algorithmen, in Anführungsstrichen,
also wo man versucht, sowas auch zu kopieren.
Das hat dann aber nicht so diesen direkten Algorithmusbegriff.
Das wäre jetzt nichts, was man dann so implementieren würde.
Da noch eine äquivalente Formulierung
So. Das war das, was ich eben jetzt, glaube ich, viermal gesagt habe.
Und da drunter nochmal, warum wir nicht glauben,
dass P gleich NP ist. Es gibt auch noch andere Begründungen,
warum man nicht glaubt, dass P gleich NP ist,
aber Die da reicht eigentlich. Es wäre auch übrigens,
wenn ihr diese Verifikationsalgorithmus-Idee noch im Hinterkopf habt,
dieses mit Zertifikat und Zertifikat überprüfen und so, P gleich NP,
wer auch aus gewisser Sicht völlig langweilig, weil es bedeuten würde,
dass für all diese Probleme es genauso lange dauert,
eine Lösung zu überprüfen,
wie eine Lösung zu finden.
Das wäre fast schon ein bisschen schade.
Ein Verifikationsalgorithmus überprüft ja nur, ob eine vorgegebene Lösung
richtig ist
So, zweites Theorien, was wir noch brauchen,
damit wir jetzt nämlich, anders, ich fange mal anders an,
ein Problem bei dieser NP-Vollständigkeit ist ja noch,
also jetzt sagen wir, oh, ist ja cool,
dass wenn ich jetzt für ein Problem nachweisen kann,
dass es NP-vollständig ist, dann weiß ich,
es ist höchstwahrscheinlich nicht NP.
Das ist ja nett, aber, wie will ich das überhaupt machen?
Alle Probleme aus NP auf ein neues Problem zu reduzieren,
das ist irgendwie nicht so richtig praktikabel.
Also in NP gibt es ja unendlich viele Probleme,
all die nicht diministrischen Touring-Maschinen, die im Polemialzeit ablaufen.
Das geht irgendwie nicht
Was uns jetzt hilft,
ist, erstmal so eine Transitivitätsgeschichte, dass wir sagen,
wenn ich ein Problem L1 auf dem Problem L2 impulimiere Zeit
reduzieren kann und ich kann ein Problem L2 im Polymialzeit auf L3 reduzieren,
dann kann ich auch L1 im Polymialzeit auf L3 reduzieren.
Wie ich für die beiden Reduktionen hintereinander aus. Das,
worauf ich achten muss, ist, ist das wirklich noch im Polymialzeit.
Wenn ich die beiden Polymen hintereinander ausführe,
die Begründung ist aber so ähnlich wie das,
was wir vorhin auch schon hatten, wenn ich diese beiden Reduktionsfunktionen,
wenn ich die mal F und G nenne,
dann kann ich bei einer Eingabe X mit X,
bei jetzt Länge N,
berechne ich F und X
in PVN
vielen Schritten
Also P ist das Polynomen, was zu der Funktion F quasi gehört.
Dann berechne ich, gehe von F von X. Und jetzt muss ich aufpassen,
wenn man Polynom für diese Reduktionsfunktion gehe, wenn das,
wenn das Kuh ist,
dann brauche ich jetzt nicht Kuh von N viele Schritte,
sondern ich brauche eben,
ich stecke da ja das F von X rein,
Kuh von F von X vielen Schritten.
Und dieses F von X, das kann in der Länge,
das kann Pele von N lang sein,
weil ich ja für die Berechnung von F von X P von N viele Schritte gebraucht habe.
Möglicherweise habe ich mit jedem Schritt irgendwie ein Ausgabesymbol produziert.
Gleiche Argumentation,
die vorhin auch
Und dann ist der Aufwand insgesamt eben durch dieses Kuh von P von N gegeben,
plus das P von N, was ich vorher berechnet habe,
also P von N plus QVP von N,
was wieder ein Polynom ist.
Und eben die Eigenschaft hier, die folgt direkt aus den
gegebenen Reduktionen. Das G von F von X in L3
ist genau dann, wenn X in L1 ist.
Man würde sagen, X ist in L1 genau dann,
wenn F von X in L2 ist, genau dann,
wenn G von F von X in L3 ist.
Genau. Und dann hat man das. Und damit kann man jetzt,
wenn ich jetzt eine Sprache habe, von der ich was Neues zeigen will.
Und ich habe schon eine Sprache, die NP vollständig ist.
Dann reicht es mir, eine Reduktion anzugeben von dieser NP
vollständigen Sprache auf meine Sprache L, um zu wissen,
dass LNP schwierig ist.
Ich kann jetzt nämlich jedes Problem aus NP auf L-Strich reduzieren.
L-Strich ist ja schon NP vollständig und von L-Strich weiter reduzieren auf L.
Und wegen dieser Transitivität der Reduktion,
der Satz von eben, weiß ich dann,
ich habe jedes Problem aus NP auf L reduziert,
also ist L-NP schwierig,
wenn es zusätzlich noch in NP ist,
ist es sogar
irgendwie vollständig
Also wenn L-Strich in NP, wenn L-Strich NP vollständig ist,
dann kann ich jedes Problem aus NP auf dieses L-Strich reduzieren.
Und weil das ja gelten soll,
weil ich L-Strich im Pulli mehr Zeit auf L reduzieren können soll,
kann ich mit dem vorherigen Satz eben von L-Strich zu L-Strich gehen und von L-Strich zu Ellen.
Also kann ich insgesamt von L-Strich zu L gehen.
L-S-NP schwierig. Und dann, wenn es zusätzlich ein NP ist,
ist es Nachdefinition im NP vollständig. Und das hilft uns jetzt,
weil wir jetzt sagen können,
sobald ich jetzt ein NP vollständiges Problem habe,
wird es danach einfacher,
weil jetzt kann ich das nehmen und das auf ein neues
Problem reduzieren und dann kann ich so meine Menge der NP
vollständigen Probleme vergrößern
Ich muss jetzt also nicht mehr für jedes Problem,
für das ich nachweisen will, dass es NPV-ständig ist,
diesen Akt machen, jedes Problem aus LP darauf zu reduzieren.
Es reicht ein NPV-Stellungsproblem zu haben, danach wird es einfacher. Und je mehr ich habe,
desto einfacher wird es, weil ich dann immer,
wenn ich ein neues Problem als NPV-vollständig nachweisen will,
kann ich halt mir eins aus meinem bisherigen Fundus nehmen und von dem auf dieses neue Problem reduzieren.
Problem ist aber immer noch, ich brauche ein erstes NPV-vollständiges Problem.
Aber wenn wir das gleich haben, wenn wir ein erstes haben,
dann da mal die Methode zum Beweis, was man machen müsste,
wenn man ein Problem als NPV-vollständig nachweisen möchte,
ich zeige zuerst, dass das Problem ein NP ist,
Dann wähle ich mir ein Problem aus,
von dem ich schon weiß, dass das NP vollständig ist.
Wir gehen jetzt mal davon aus, ich habe schon
ein paar. Und jetzt muss ich einen Algorithmus angeben,
der eben diese Reduktion von L-Strich auf L berechnet.
Das heißt, er soll jede Instanz X von L-Strich
auf eine Instanz F von X von L abbilden.
Und zwar mit dieser Eigenschaft, dass XNL-Strich es genau dann,
wenn er von XNL ist, das muss ich dann beweisen.
Und dann muss ich noch beweisen, dass der Impulimalzeit abläuft.
Und diese Schritte 3, 4, 5, die zeigen eben,
dass sich eine Reduktion von L-Strich nach L habe.
Und mit dem vorherigen Satz folgt dann eben,
dass dann L-NP vollständig ist
Also was man macht, ist, man wählt ein NPV-Vorständigesproblem aus,
gibt eine Reduktion auf das neue Problem an und zeigt eben,
dass das tatsächlich eine Pullinimalzeitreduktion ist.
Also, dass die Polinialzeit abläuft und dass sie die Eigenschaft
XSNL-Strich hat, genau dann, wenn F-Frone X&L ist.
So, und jetzt brauchen wir aber ein erstes Problem. So,
da die Zusammenfassung einmal, was wir bisher gemacht haben,
bevor wir dann eben Probleme als NPV-ständig nachweisen,
Also in P sind die, die in Polynialzeit lösbar sind,
das sind die, von denen wir im Allgemeinen sagen,
die sind effizient lösbar.
In NP sind die Probleme, die nicht die terministisch im Polynialzeit
gelöst werden können, oder eben deterministisch, zumindest in Exponentialzeit.
Und jetzt brauchten wir irgendwie eine Methode, um sagen zu können,
zumindest schneller als Polynialzeit wird es auch nicht gehen.
Also das ist ein Problem, das in NP liegt eben voraussichtlich,
oder das in NP und über P liegt,
voraussichtlich tatsächlich nicht EP liegt.
Und dafür haben wir diesen Begriff NP vollständig eingeführt.
Und die Begriffe jetzt, die waren im P,
NP, Reduktion, NP schwierig,
NP vollständig.
Fragen bis dahin
Jetzt kommen vier Fragen eigentlich. Ich überspringe die mal,
damit wir Zeit haben, uns gleich die Reduktion ein bisschen genauer anzugucken.
Ihr dürft ja dann zu Hause nachbereiten. Da ist ja
auch die Lösung. Ich möchte zum ersten NP
vollständigen Problem kommen. Das war das sogenannte Satt-Problem,
Satisfiability, für Aussagen logische Formeln. Nach den Ferien,
also in zwei Wochen, da wollen wir uns aussagen,
Logik und so nochmal im Detail angucken und angucken,
was da
so alles geht
Für heute reicht uns so ein intuitives Verständnis.
Und das geht wie folgt. Man hat Ulsche Variablen.
Das sind einfach irgendwelche Variablen, die den Wert Null oder
Eins annehmen können. Und die möchte man verknüpfen können.
Null soll für falsch stehen. Eins soll für wahrstehen.
Und jetzt möchte man so Dinge sagen können,
wie nicht X1. Und wenn X1 dann eben gerade wahr war,
dann soll nicht X1 eben falsch sein.
Also kennt ihr alles aus der Programmierung mit Bullshit-Variablen?
Verknüpfung, die es gibt, Negation mit der Eigenschaft.
Nicht 0 soll eins sein,
nicht 1-0-0 sein,
also nicht False ist Two und nicht True
ist False
Disjunktion, das Oder, das wird eins genau,
dann wird mindestens eine der beiden Variablen eins ist.
Konjunktion wird eins, wenn beide eins sind. So,
und wenn man jetzt so eine Formel hat,
dann ist eine Belegung eine Funktion, die jeder Variablen da drin,
eben einen Wert aufs Null oder eins zuweist.
Und dann kann man mit diesen obigen Verknüpfungen eben die Formel sukzessive auswerten und prüfen,
ob die Formel durch die Belegung erfüllt ist oder nicht,
wenn da am Ende eins rauskommt, sagt man,
die Formel ist erfüllt.
Kurzes Beispiel X1 oder X2 und nicht X1 und
nicht X2 oder nicht
Wenn man da jetzt, da reden die Variablen X1 und X2 auf,
wenn man da jetzt sagt, X1 soll 0 sein und
X2 soll eins sein, dann setzt man das ein.
Lünonum. Und dann macht man üblicherweise zuerst mal die Negationen
da weg. Also wertet die aus. Ja,
und jetzt kann man sich hier das Oder angucken,
0 oder eins wird zu eins,
hier das Oder 0 oder eins wird zu eins.
Und dann hat man 1 und 1 und 1,
1 oder 1, fertig. Da hatte ich jetzt gerade
noch keine Klammerersparnisse, Regeln und so drin. Wir machen das,
wie gesagt, auch nochmal im Detail nach den Ferien.
Aber so von der Idee her, ich habe Ariablen,
die kann ich mit 0 oder 1 belegen und ich habe
die drei Operationen, Negation und,
und,
Und wird halt zu eins, wenn beides eins ist oder
wird zu eins, sobald eins davon eins ist.
Das genügt uns erstmal, dass es quasi Sintax und Semantik
der Aussagenlogik auf jetzt eine sehr intuitive Basis.
Und jetzt kann man dieses Problem formulieren, gegeben,
so eine Formel Vieh, ne,
und die soll drin sein in der Menge satt genau dann,
wenn die erfüllbar ist.
Sprich, was wir brauchen, ist ein Algorithmus, der testet,
ob eine gegebene Aussage logische Formel erfüllbar ist oder nicht.
Das kann man überlegen, findet man einen Algorithmus in P,
so direkt findet man erstmal keinen, findet man einen in NP,
Ja, was würdet ihr, wenn ihr jetzt mit dieser Verifikationsalgorithmus-Idee rangeht,
was würdet ihr als Zertifikat nehmen?
Um zu prügeln. Ich gebe euch eine Formel und ihr
sollt mich jetzt davon überzeugen, dass ihr die erfüllen könnt.
Wie macht ihr das? Nicht eine mögliche, sondern welche?
Genau, ein Zertifikat ist eine erfüllende Belegung, genau.
Weil ein Zertifikat, das die Formel nicht warm macht,
würde mich nicht davon überzeugen, dass du weißt,
wie du die Formel erfüllen kannst
Aber genau, das wäre ein Zertifikat oder ein NP-Algorithmus eben,
also nicht die terministischer Algorithmus, redende Belegung und testet dann,
ob damit die Formel erfüllt wird oder nicht.
Also den NP liegt das auf jeden Fall.
Frage ist jetzt, ob das NP vollständig ist.
Da ist nochmal der Beweis, dass es in NP ist.
Wir raten eine gegebene, raten wir gegeben, eine Formel,
so eine Belegung und wir infizieren dann eine Politikalzeit, ob es die Formel erfüllt.
Und wenn man jetzt zeigen möchte, dass das tatsächlich NP vollständig ist,
dann müsste man alle Probleme aus NP auf satt reduzieren.
Das ist jetzt Also die Idee ist, es ist
relativ schnell gesagt, die Ausführung ist halt ziemlich technisch.
Deswegen wollte ich das jetzt hier nicht im Detail machen.
Ich will euch das gleiche lieber am Beispiel, diese NP-Vollständigkeitsgeschichte,
lieber am Beispiel illustrieren, wo man die Reduktion auch nachvollziehen kann.
Die Idee ist, dass man, man muss jetzt ja
alle Probleme aus NP aufs Satt reduzieren. Und dann ist die Idee,
dass man gegeben eine nicht die terministische Touring-Maschine,
die im Polemialzeit abläuft,
dass man deren Arbeitsweise in eine Formel kodiert und dass die Formel genau dann erfüllbar ist,
wenn die gegebene nicht deterministische Touring-Maschine eine akzeptierende Berechnung hat.
Und dazu macht man so Dinge,
dass man quasi jeden Konfigurationsübergang durch eine Formel ausdrückt
Oder durch ein Formelteil und all die Dinger verknüpft man damit und.
Und dann kodiert man auch irgendwie die Startkonfiguration rein und eine
Endkonfiguration und sowas. Und dann kann man nachher sagen,
die Formel ist genau, kann genau dann erfüllt werden,
wenn es eine akzeptierende Berechnung gibt. Die erfüllende Belegung,
also die Formel, die Variablen, die zu eins gemacht werden,
die geben einem dann quasi vor, wie die NTM arbeiten müsste,
um den, um die Eingabe zu akzeptieren.
Wen es genau interessiert, könnt ihr mein Buch nachlesen,
sind glaube ich so sechs Seiten in dem Beweis,
lässt sich aber gut lesen.
Es ist halt nur so, dass das so ein bisschen so,
es ist halt so ein Rumgefrängel,
dass es halt so quasi auf,
es ist noch schlimmer
als Assembler-Programmierung
Ist noch schlimmer als unkommentierter, ist ja eine Programmierung.
Genau, das zur Nachbereitung, jetzt das Schöne,
nämlich wir haben jetzt ein NP vollständiges Problem.
Jetzt können wir noch mal ein paar mehr konstruieren.
Jetzt machen wir noch so Sachen wie erstmal Begrifflichkeiten,
wenn ich ein positives oder negatives,
wenn ich eine positive oder negative Aussage logische Variable habe,
also sowas wie X3 oder ich habe nicht X2,
dann nenne ich das ein Literal.
Und eine Klausel ist jetzt eine Oder-Verknüpfung von Literalen.
Also sowas hier, Literal oder Literal oder, oder, oder.
Und wenn ich diese ganzen Dinger jetzt mit unverknüpfe,
nenne ich das, eine KNF, also dann sage ich das,
die Formel in konjunktiver Normalform ist.
Die Idee ist halt,
dass das und quasi der Hauptoperator ist und mit dem
und sind jetzt ganz viele Klauseln verknüpft und bei den Klauseln
habe ich mit oder ganz viele außerlogische Variablen verknüpft,
die unter Umständen noch niviert sind.
Aber insbesondere ist die Negation immer ganz dicht an den Aussagen dran.
Das nennt man eine KNF, das ist deswegen ganz praktisch,
weil man jetzt die folgenden Sachen zeigen kann,
wenn ich euch eine außerlogische Formel in KNF gebe und die Frage ist,
ob die erfüllbar ist oder nicht.
Das Problem ist auch wieder NP vollständig
Die Frage, wenn ich euch eine KNF gebe,
bei der zusätzlich noch jede Klausel genau drei verschiedene Literale hat.
Auch die Frage ist NP vollständig, da steht es.
Und das Schöne ist jetzt,
jetzt muss man nicht immer von satt ausgehen,
bei Reduktionsbeweisen, sondern man in üblicher Weise dieses 3CNF.
Warum nimmt man das? Weil man dann in der
einen Probleminstanz mehr Struktur drin hat. Also ich will jetzt
eine Probleminstanz des 13NF-Problems reduzieren auf ein Grafenproblem zum Beispiel.
Und da hilft es mir, dass da eine gewisse Struktur drin ist.
Also dass ich weiß, es gibt die Negationen sind
nur an den Aussagen logischen Variablen. Ich weiß,
ich habe immer genau drei Literale in der Klausel,
all solche Geschichten,
das hilft mir dann
So, jetzt wollen wir wirklich mal probieren als MP vollständig
nachweisen, nämlich das Problem da klicke. Also Klickenproblem,
ihr kriegt einen ungerichteten Grafen G und ihr kriegt eine Zahl K
und ihr solltet jetzt einen Algorithmus angeben, der eben berechnet,
ob es in NG K viele Knoten gibt,
die alle paarweise miteinander verbunden sind.
Also wenn K3 ist, dann ist nach dem Dreieck gefragt,
wenn K4 ist, dann ist nach dem Viereck gefragt,
wozusätzlich die beiden Ecken jeweils noch miteinander verbunden sind und
bei K5 eben nach fünf Minuten,
die alle paarweise miteinander verbunden sind und so weiter
Ja. Nee, lass sie mal schlafen, ist schon okay.
Geht mir ja auch so. Nach gestern. So,
das wollen wir machen. Das ist in NP, ist
das klar, ne? Ich rate Karknoten und gucke,
ob die alle paarweise miteinander verbunden sind oder nicht.
Bin ich fertig
Als Zertifikat oder eben als Raten. Wir nehmen so eine
Menge von Knoten und überprüfen, ob die alle miteinander verbunden sind.
Das ist der einfache Teil. Jetzt kommt der schwierige Teil
. Und wenn ihr euch noch an diese Abfolge erinnert,
als erstes wählen wir jetzt ein NP vollständiges Problem aus,
von dem wir die Reduktion machen können.
Das Problem, das wir jetzt gerade haben, ist,
wir haben noch kein Grafenproblem, das NPV ständig ist.
NPV-ständigkeitsbeweise sind meistens dann einfacher, wenn man quasi irgendwie innerhalb eines bestimmten Gebiets bleibt.
Also wenn man innerhalb der Logik bleibt oder innerhalb der Grafentheorie oder so,
ist dann immer ein bisschen schwierig,
wenn man von einem Gebiet den Brückenschlag zum anderen Gebiet machen möchte.
Das müssen wir jetzt aber machen. Wir müssen irgendwie von
der Logik rüberkommen zu dieser Grafentheorie
Was wir zeigen wollen, ist, dass wir dieses 3CNF-Problem auf Clique reduzieren können.
Also wir kriegen jetzt eine Probleminstanz, die,
die sind taktischer Mist sind, die ignorieren wir mal.
Das macht man üblicherweise so, weil man quasi vorher einmal
gucken kann, ist die Instanz überhaupt eine sinnvolle 3CNF-Instanz?
Also kann das eine Ja- oder Nein-Instanz sein?
Oder ist das totaler Käse? Also sowas wie irgendwie
die Sintaxkette und, und, und X3. So,
das macht irgendwie keinen Sinn, weil das keine Formel ist.
Da weiß man sofort, das Ding ist nicht erfüllbar.
Und dann reduziert man das halt irgendwie auf Unsinn auf der anderen Seite.
Da nimmt man Grafen mit drei Knoten und fragt,
ob da eine Vier-Clique drin ist.
Das ist auch automatisch in einen Instanz
Sowas kann man also vorher einmal testen. Und das,
was jetzt halt wirklich spannend ist, ist,
wenn man eine sinnvolle Instanz kriegt,
also wenn man eine Formel kriegt, die in dieser 3CNF-Form ist.
Und jetzt prüfen will, ist die erfüllbar oder nicht. Jetzt muss man das hinkriegen,
dass man, wenn die Formel erfüllbar ist,
dann muss es reduziert werden auf eine Instanz,
bestehend aus Graf, G und Zahl K derart,
dass der Graf wirklich eine Karklicke enthält.
Und wenn die Formel nicht erfüllbar ist,
dann muss das reduziert werden auf so eine Instanz GK,
der, dass G eben keine Karklicke enthält.
Und das Problem ist aber, ihr berechnet ja nicht,
ob die Formel erfüllbar ist oder nicht.
Dafür braucht ihr
viel zu lange
Also ihr wollt ja gerade das benutzen, um zu zeigen,
dass es gar kein P-I, das ist vermutlich kein P-Algorithmus gibt.
Also könnt ihr vorher nicht berechnen, ob die Formel der Filber
ist oder nicht. Ihr müsst also irgendwie eine Konstruktion machen,
für die ihr dann nachweisen könnt, dass,
wenn die Formel erfüllbar ist, dann hat der Graf eine Kartlicke,
wenn die Formel nicht dafür über ist,
hat der Graf keine Kartlicke.
Also, wie sehen die Dinge aus?
Wir haben diese Formeln viel, bestehend aus k-fielen Klauseln.
Diese L1L2L3, hoch R, das sollen jeweils die drei
verschiedene Literale sein. Und jetzt überlegen wir uns,
wie wir so eine Instanz von Klicke
konstruieren können
Und jetzt macht man, das nennt man so Gadget-Konstruktionen.
Jetzt überlegt man sich halt meistens irgendwie gegeben,
so eine Klausel, was baue ich mir dafür im Grafen?
Beispielsweise kann man versuchen für die drei Knoten,
die in der Klausel sind, Dreiecke im Grafen zu konstruieren.
Drei Knoten in der Klausel, Dreiecke im Grafen.
Das könnte man versuchen. Macht man hier nicht,
aber das wäre so eine Idee, was man machen könnte.
Was man hier macht ist, zu jeder dieser Klausels
kommt doch gleich ein Bild.
Zu jeder dieser Klauseln nehmen wir so ein Triebel von drei Knoten.
Und jeder Knoten repräsentiert quasi ein Literal in der Klausel
Wenn man das hat, also jetzt habe ich,
nehme man, ich habe drei Klauseln,
dann habe ich irgendwie jetzt hier so drei Triebel von Knoten
und erstmal habe ich auch gar keine Kanten.
Jetzt noch die Frage, wie mache ich Tanten?
Das mache ich jetzt so, dass ich zwei Knoten,
VIS und VJT, die verbinden dich genau dann miteinander, wenn.
Erstens, es und leicht Tee ist. Was bedeutet,
dass die in unterschiedlich zu unterschiedlichen Klauseln gehören?
Ja gut, die Knoten innerhalb, die drei Knoten,
die quasi zu einer Klausel gehören, die verbinde ich nie miteinander.
Und dann, wenn die zuhörigen Literale nicht zueinander komplementär sind, Genau.
Also sprich, ich verbinde die miteinander, die quasi gleich sind.
Also wenn ich X1 in der einen Klausel habe und X1
in der anderen Klausel, dann verbinde ich die miteinander.
Genau, und der Wert K, also ich will das ja
abbilden auf GEK, den Grafen habe ich jetzt gerade beschrieben.
Ich habe alle Knoten beschrieben und alle Kanten. Jetzt muss ich
mir noch den Wert K überlegen. Da sage ich,
der entspricht der Anzahl der Klauseln von Vieh. Warum sehen wir gleich hier,
wenn ich jetzt das als Formel habe,
jetzt sage ich quasi, ich habe hier drei Klauseln,
also mache ich mir für die erste Klausel drei Knoten für
die zweite Klausel drei Knoten und für die dritte Klausel
drei Knoten
Die Klauseln, die ich zu, die Knoten,
die ich zu einer Klausel gemacht habe, die verbinde ich nicht miteinander.
Und jetzt gucke ich aber beispielsweise, dass hier nicht X drin ist,
was weder hier noch da auftritt, also den Knoten,
der für das Nicht-X steht, den verbinde ich mit nix.
Hier ist ein X drin, das ist da auch drin,
die beiden Knoten verbinde ich miteinander.
Kommt dann das raus. Nicht X, YZ,
das ist für die erste Klausel, X,
nicht Y, Nicht-Z ist für die zweite Klausel,
X, Y Z ist für die dritte Klausel.
Wartet mal, was habe ich denn noch gemacht?
Ach ja, genau
Und die hier, die Dinger, die habe ich eben
gar nicht erzählt, die sind natürlich auch nicht komplementär zueinander.
Also nur X und nicht X oder sowas,
die sind ja komplementär zu einer Energie, verbindet man nicht,
aber X und X verbindet man miteinander.
Das ist nicht komplementär zueinander und X und Y verbindet man auch miteinander.
Das ist auch nicht komplementär und X und Z und so weiter,
die verbindet man alle. Und die Idee ist jetzt,
wenn es jetzt eine Dreiklicke gibt,
so wie die hier angedeutete,
dann kann ich aus der eine erfüllende Belegung für die Formel extrahieren,
indem ich die gewählten Literale dieser klicke,
die mache ich alle wahr
Und damit wird jede Klausel wahrgemacht. Hier habe ich das
Z rausgewählt. Damit wird die Formel, die Klausel wahr.
Da habe ich das nicht Y gewählt, damit wird die Klausel wahr.
Da habe ich auch das Z gewählt, damit wird auch die Klausel wahr.
Da die alle mit unverknüpft sind, ist jetzt die ganze
Formel wahr. Und ein Widerspruch entsteht deswegen nicht,
weil ich ja gerade komplementäre Literale nicht miteinander verbunden habe.
Das heißt, wenn hier eine Clique drin ist,
dann wird nicht sowas passieren, wie dass ich aus der
einen Klausel das X rausgewählt habe und aus der anderen das nicht X.
Und das, so wie in dem Beispiel jetzt,
für das X quasi kein Wert gewählt wird.
Also hier würde man ja jetzt sagen,
ich mache Z wahr,
also Z wird zu 1 ausgewertet und ich möchte nicht Y zu 1 auswerten,
also mache ich Y
zu null
Und das X ist gar nicht genau spezifiziert. Das bedeutet,
das ist egal alles, was ich mit dem X mache.
Ob ich das X zu 0 oder eins mache,
ist in dem Fall egal.
Die sind ja alle nur mit oder verknüpft. Das heißt,
sobald ich einen davon warm mache, bin ich fertig.
Ja, das ist die ganze Konstruktion. Also für alle Knoten einer Klausel,
für alle Literale einer Klausel einen Knoten einführen und dann eben so miteinander verbinden,
dass man nicht innerhalb so eines Blockes verbindet.
Und zu den anderen Blöcken nur dann verbindet,
wenn die Knoten keine komplementierenden Literale repräsentieren
Meinst du für das 3CNF? Mit zwei nicht,
das ist im K, mit vier, fünf,
sechs und so wird es auch gehen. Ich weiß nicht,
drei ist, glaube ich, einfach nur so historisch.
Ich glaube, weil man da gesehen hat,
dass es das erste Mal springt quasi,
dass es bei zwei CNF noch schnell lösbar ist, weil drei CNF nicht mehr.
Und dann hat man quasi schön viel Struktur in der Formel und aber auch,
wenn ich jetzt acht CNF nehme oder so,
dann habe ich da überall acht Stück drin,
das bringt dann irgendwie nichts mehr
Genau, der Unterschied zu satt ist einfach,
dass es nicht so, satt kann irgendwie beliebig sein.
Also eine außerirdische Formel kann viel beliebiger sein als dieses 3CNF.
So, was wir jetzt noch machen müssen, ist,
wir müssen zeigen, dass die Reduktion tatsächlich korrekt ist.
Also, dass, wenn wir diese Art von Konstruktion machen,
tatsächlich immer gilt, wenn die Formel erfüllbar ist,
gibt es in dem Grafen eine K-Klicke.
Und wenn die Formel nicht erfüllbar ist,
gibt es in dem Grafen keine K-Klicke.
Das müssen wir machen. Und wir müssen zeigen, dass
die Reduktion in Polimialzeit geht. Dass es in Polimialzeit geht,
das kann man sich relativ schnell überlegen.
Ich gehe einmal über die Formel rüber und für jedes Literal,
das ich hier finde,
da stelle ich mir
einen Knoten
Das dauert so lange, wie die Formel eben lang ist. Naja,
und dann gehe ich meinetwegen pärchenweise über alle Knotenpaare rüber und gucke immer,
ob die ein komplementäres Literal sind oder nicht.
Und verbinde die halt dementsprechend. Also da bin ich irgendwie
in O von N plus N Quadrat.
Das ist nicht so wirklich tragisch. Warte, steht so
. Das ist relativ einfach
Schwieriger ist es zu zeigen, dass die Reduktion auch korrekt ist.
Also dass wirklich gilt, X ist in L1 genau dann,
wenn Afro X in L2 ist.
Das machen wir nochmal. Also wir müssen noch zeigen,
dass dies wirklich eine Reduktion ist. Der gegebene Graf,
also genau dann eine Klicke enthält, wenn die Formel erfüllbar ist.
Also da sind wieder zwei Richtungen zu zeigen. Also man kann zeigen,
wenn die Formel erfüllbar ist, hat der Graf eine K-Klicke,
wenn der Graf eine K-Klicke hat, ist die Formel erfüllbar.
Oder man kann zeigen, wenn die Formel erfüllbar ist,
hat der Graf eine K-Klicke, wenn die Formel unerfüllbar ist,
hat der Graf keine K-Klicke.
Sowas kann man machen. Gehen wir davon aus,
dass die Formel erfüllbar ist
Dann muss es eine Belegung geben,
die in jeder Klausel mindestens ein Literal wahrmacht.
Sonst die einzelnen Klauseln sind ja alle mit unverknüpft.
Das heißt, die einzelnen Klauseln müssen alle wahr werden.
Und damit die Klausel wahr wird, da ist ja alles.
Oder verknüpft all die Literale, muss immer mindestens ein Literal wahrgemacht werden.
Wenn ich jetzt aus jeder Klausel eins dieser Wahlliterale rausnehme,
da könnten ja auch mehrere wahrgemacht werden.
Ich will jetzt einfach immer eins raus.
Und zu jedem dieser Literale gehört ja ein Knoten im Grafen
Eine entsprechende Konstruktion. Und die Behauptung ist jetzt,
dass die jeweils zugehörigen Knoten eine K-Klicke bilden.
So, warum ist das so? Naja,
erstens müssen es K-Knoten sein. Ich hatte ja K-Klauseln,
wenn ich jetzt aus jeder Klausel ein Literal auswähle, das wahrgemacht wurde,
habe ich Karl Literale, die wahrgemacht wurden, das sind K-Knoten.
Und jeweils zwei Knoten, ja, ich muss jetzt zeigen,
ich habe jetzt keine Knoten, jetzt muss ich noch zeigen,
dass das wirklich eine K-Klicke ist, indem ich zeige,
dass jeweils zwei Knoten auch wirklich miteinander verbunden sind.
Ich kann mir also zwei nehmen,
es muss auf jeden Fall gelten,
dass er ungleich es ist
Dass die Knoten es so unterschiedlichen Klauseln gehören.
Warum? Weil ich ja oben gesagt habe, ich nehme
mir aus jeder Klausel nur genau eins der Wahlliterale raus.
Dafür ist das wichtig. Dann weiß ich also,
er ist ungleich es. Und außerdem weiß ich,
dass die zu den Knotengehörigen Literale nicht komplementär sind,
weil die Belegung ja eine erfüllende Belegung war.
Und eine Belegung kann ich gleichzeitig beispielsweise X war und X falsch machen.
Ich kann nur entweder X war oder X falsch machen.
Genau. Und dann weiß ich,
da gibt es eine Kante zwischen, also bin ich fertig.
Das zeigt die eine Richtung. Das zeigt, wenn die
Form erfüllbar ist, dann hat der konstruierte Graph eine K-Klicke.
Andersrum, wenn es in dem Graph eine Karkwicke gibt,
jetzt will ich zeigen, dass die Formel dann erfüllbar ist
Dann muss zunächst jeder Knoten aus einem anderen Triebel sein.
Warum? Die Knoten in einem Triebel sind ja nach Konstruktion
nicht miteinander verbunden. Wenn ihr an das Beispiel hier da
die drei Knoten ja auf der linken Seite alle nicht miteinander verbunden,
die drei auf der rechten alle nicht miteinander verbunden.
Genau, dann kann man eben dem zu so einem Knoten zugehörigen Literal den Wert eins zuweisen.
Und damit hat man eine Belegung, weil, also zumindest keine widersprüchliche,
weil die Knoten ja nur dann mit Kanten verbunden sind,
wenn die eben nicht komplementär zueinander sind.
Das heißt, Eine Variablen wird nur,
entweder der wird eins oder der wird null zugewiesen.
Genau. Und damit hat man dann eben jede Klausel erfüllt,
in jeder Klausel hat man ein Literal wahr gemacht und ist fertig.
Was man unter Umständen,
was ich vorhin einmal kurz erzählt hatte bei dem Beispiel,
was man noch beachten muss, ist,
um wirklich eine Belegung zu haben, muss man unter Umständen die Variablen,
für die man jetzt noch keinen Wahrheitswert gewählt hat,
auch noch irgendwie mit null der Eins belegen.
Aber das kann man in dem Fall ganz beliebig machen.
Genau, und dann ist man fertig
Das sollte ja an einem, es sollte ja einmal in
einer Präsenzaufgabe machen und einmal in den Übungsaufgaben so einen Beweis führen.
Und in den Präsenzaufgaben ist es ein Grafproblem gegeben.
Da kann man halt mal gucken, dass man mit diesem Grafproblem,
wir haben jetzt ja Clique kennengelernt, dass man versucht,
eine Reduktion von Clique auf dieses Grafproblem anzugeben.
Dann kann man sich halt überlegen,
so wenn ich einen Grafen habe, wo ich weiß,
da soll jetzt eine Karklicke drin sein,
wie konstruiere ich da draußen Grafen, bei dem eben die andere Eigenschaft,
die jetzt gesucht ist,
dann auch gilt und wenn dem Grafen keine Karklicke ist,
wie mache ich das dann
Hier nochmal so ein buntes Gemenge an weiteren NP vollständigen Problemen.
Bisher hatten wir dieses Satt-CNF, 3CNF-Clique und all die Probleme,
die vorher so in der Vorlesung waren, die sind auch alle NP vollständig.
Dieses Teil-Summen-Problem, das Mengen-Partitionsproblem, das Knotenüberdeckungsproblem,
die Ober beiden kannten wir schon, das untere, kannten wir noch nie.
Independent Set. Es ist quasi eine Frage,
die ist so ähnlich wie Clique,
nur dass man jetzt nicht Karknoten sucht,
die alle miteinander verbunden sind,
sondern Karknoten,
die das
gerade nicht sind
Das ist, glaube ich, das aus den Präsenzaufgaben,
wenn ich das gerade richtig erinnere. Das Färbungsproblem,
was ich vorhin beschrieben habe, ist auch in Pi vollständig,
Hamilton-Kreis, Problem, ist auch NP vollständig,
das könntet ihr in DM gehabt haben.
Da ist ein Knoten, da ist ein Kreis gesucht,
der alle Knoten enthält des Grafen. Und das Interessante ist,
auch wenn die Probleme da jetzt eben so ein bisschen abstrakt aussehen,
das ist meistens der herausgeschielte Kern aus in der Praxis auftretenden Problemen.
Also das Färbungsproblem, das hat beispielsweise um zwei prominente Beispiele zu nennen,
erstens was mit der Planung von Stundenplänen zu tun und zweitens
was mit einem Sudoku spielen.
Also Sudoku auf dem monetlichen Feld ist eigentlich
ein Färbungsproblem
Sodoku auf einem Feld, ist ein Färbungsproblem. Und Planung von Stundenplänen
sind eigentlich auch Färbungsprobleme. Oder was heißt eigentlich Färbungsprobleme?
Also das ist das Problem, den Stundenplan zu planen,
aber man kann es eben umformulieren in Färbungsproblemen. Genau,
und dann weiß man eben, wenn das hier NP vollständig ist,
dann ist dieses ursprüngliche Stundenplanproblem eben auch irgendwie vollständig.
Ja, ergo, die treten alle in der Praxis auf.
Deswegen ist das ärgerlich, dass man die nicht
effizient lösen kann. Kurze Zusammenfassung, PNP ist klar,
die Richtung ist ungelöst
Also ob auch jedes Problem aus NP schnell gelöst werden kann.
Und diese Theorie der NPV-ständigen Sprachen, die führt man eben deswegen ein,
um eben zumindest einen Hinweis darauf zu haben, dass das da nicht gilt.
Agil. Jo, und die oben genannten Probleme alle MPV-ständig.
So, die Take-Home-Message, wenn ihr mal Algorithmen entwickelt.
Wenn man jetzt Algorithmen entwickelt und sich nicht die ganze Zeit noch mit NPV-ständigkeitsbeweisen beschäftigen möchte,
Dann steckt man natürlich Zeit, irgendwie reinen Algorithmus zu entwickeln.
Und wenn man irgendwann merkt, Mensch,
ich denke jetzt schon irgendwie zwei Wochen darüber nach und mir fällt nichts Sinnvolleres ein,
als im Prinzip eben den ganzen Suchraum durchzugehen,
was Äquivalent dazu ist, irgendwie alle Zertifikate zu überprüfen,
dann kann man vermuten,
dass das Problem wohl irgendwie NP-vollständig ist.
Und dann kann man losgehen und halt statt weiter Algorithmen zu suchen,
eben versuchen, so einen MP-Vollständigkeitsbeweis zu führen.
Und wenn man den hat, dann kann man sich relativ sicher sein,
dass man dafür wohl keinen schnellen Algorithmus finden kann.
Und dann kann man losgehen und
andere Dinge tun
Wenn man weiß, dass es in NP Vollständen,
wenn man weiß, dass es irgendwie vollständig ist,
dann weiß man halt erst mal nur, okay,
deterministisch kann ich es in Exponentialzeit lösen.
Das ist nicht so cool. Deswegen versucht man dann andere Sachen
zu machen als Ausblick für A und D und Algorithmik,
dass man dann eben sagt, naja, ich meine,
das Problem will ich ja trotzdem lösen.
Also nur weil jetzt irgendwie jemand sagt, dass es irgendwie vollständig ist,
denke ich so, ja, dann kann ich halt sagen,
naja, vielleicht sieht meine Eingabe ja immer,
vielleicht ist die ja gar nicht so generell.
Also wenn ich keine Klicken in Grafen in ganz generellen Grafen suche,
sondern wenn ich Klicken nur in speziellen Grafen suche,
dann wird das unter Umständen sehr viel einfacher,
das zu lösen
Das kann ich machen. Also mir angucken,
mit welchen Eingaben ich eigentlich arbeite.
Ich kann gucken, dass ich mit Approximationsalgorithmen arbeite.
Statt das Optimum zu bestimmen, genügt mir vielleicht eine ungefähre Lösung.
95 Prozent ist auch noch gut genug.
Kann mit anomisierten Algorithmen arbeiten, ich kann mit Teuristiken arbeiten.
Ich kann versuchen, Quantencomputer zu bauen, vielleicht hilft das.
All sowas kann ich machen. Für ARD. Fragen.
Ich habe doch nicht überzogen heute. Also noch nicht.
Es sei denn, ihr habt jetzt ganz viele Fragen.
Fragen zum ersten,
zum zweiten
Dritten, zum vierten, zum hümpen. Dann habt ihr
noch Übungsgruppen und dann danach wünsche ich schöne Ferien und so.
Erholt euch gut. Und ab Anfang Juni machen wir dann
einen Logikteil und dann müsst ihr mich ein paar Mal daran erinnern,
dass ich möglichst bald die Probeklausur konstruiere,
damit die dann auch rechtzeitig da ist.
Und ab 20.07. schreiben wir dann
die Klausur und dann ist auch schon durch.
Tada. Feierabend