So. Jetzt können wir anfangen. Bisschen kleine Gruppe heute,
ne? Wie, das sind ja kaum noch 30.
Das ist ja, selbst für Dienstagmorgen ist das ja eher schwach.
Naja. Heute, P und NP. Haben wir gestern
schon gesehen, die Definition. Zwei der wichtigsten Komplexitätsklassen,
denen man so begegnet. Also nicht nur in der Veranstaltung
hier, sondern so allgemein im Informatikstudium.
Versteckt sich auch so eine der Kernfragen der Informatik hinter,
die eben nicht nur in der Theorie wichtig ist,
sondern insbesondere eben in der Algorithmik
Wenn wir nochmal sehen, warum die Frage so bedeutend ist,
da kommen wir, glaube ich,
erst nächsten Montag zu, aber schon mal so,
das ist ein, zwei der ganz wichtigen Komplexitätsklassen,
die insbesondere auch so quasi trennen,
ob ein Problem irgendwie gut gelöst werden kann oder eben sehr,
sehr, sehr wahrscheinlich nicht.
Wie haben wir die definiert? P,
da sind all die Sprachen drin,
zu denen ist irgendwie eine Touring-Maschine oder ein Algorithmus
gibt und irgendein Polynom,
sodass der Algorithmus eben
die Sprache entscheiden kann
Und gleichzeitig bei einer Eingabe der Länge N,
brauche eben maximal P von N viele Schritte.
Also das Polynom wird am Anfang festgehalten und Algorithmus wird festgehalten
und dann soll der Algorithmus das Problem lösen,
also die Sprache entscheiden und gleichzeitig soll er eben bei der Eingabe der Länge N maximal diese P von N vielen Schritte brauchen.
Und wenn das irgendwie für eine Sprache möglich ist,
dann sagt man, okay,
die Sprache ist ein P und kann man sich schon mal so merken,
so intuitiv wird das bedeuten, dass man üblicherweise sagt,
die Sprache ist eben effizient lösbar oder das Problem.
Und ein NP, im Grunde genommen genau das Gleiche,
nur dass man eben statt die terministische Touring-Maschine,
eine nicht die terministische Touring-Maschine nimmt und dann eben zusätzlich
diesen Nicht-Determinismus benutzen kann
Und dann wird eben bei der Zeitschranke,
das ist ja wichtig an der Stelle,
dann wird bei der Zeitschranke nicht etwa alle Konfigurationen in diesem Konfigurationsbaum gezählt oder so,
sondern es wird halt gesagt,
wenn ich mir eine Erfolgsrechnung angucke oder,
weil man das auch entscheiden kann, eine Rechnung,
dann darf die Rechnung eben nur P von N viele Schritte brauchen,
egal welche Rechnung ich mir angucke.
Genau, das ist P und NP. Und genau,
da darf man das mit Akzeptanz und Entscheidbarkeit und was das eben umgangssprachlich oder
nicht mehr so ganz jungsprachlich, was das eben bedeutet,
dass man auch bei Eingaben der Länge N nach P von in vielen Schritten anhalten muss.
Und den Beweis, dass Akzeptanz und Entscheidbarkeit gleich ist,
den haben wir gestern noch mal kurz bei P gesehen.
Die Kernidee ist im Grunde genommen einfach,
dass man sagt, wenn ich einen Algorithmus A habe,
der eben durch so einen Polynom P zeitbeschränkt ist,
dann kann ich mir auch einen anderen Algorithmus machen,
der zuerst das P von N ausrechnet und dann auf jeden Fall nach so vielen Schritten aufhört.
Dann braucht man ein bisschen länger, ist aber immer noch Polynomialzeit beschränkt und entscheidet das Problem.
Und bei NP geht das genauso und in etlichen Büchern,
zum Beispiel auch in diesem Hauptcraft Ulman,
ist es auch gleich so definiert, dass man von vornherein sagt,
ich halte immer nach so und so vielen Schritten an.
Der Grund, warum man das im Allgemeinen,
also warum man das dann im ganz Allgemeinen nicht macht,
ist, weil das eben nicht für alle komplett Extremitätsklassen funktioniert,
aber für die uns interessierenden P und NP geht das super.
Genau. So und da nochmal, man könnte auch in eine rote Box,
dass euch irgendwie nochmal klar wird, hier dieses Touring-Maschinen und Algorithmen,
das macht halt im Grunde genommen keinen Unterschied. Man guckt halt jetzt,
man kommt halt von den Touring-Maschinen her,
weil es da einfach ist, diese Zeit und Platzmaße einzuführen,
weil man eben nur irgendwie eine Operation hat und nur irgendwie diese Bannzellen und das halt einfacher,
das da einzuführen, als wenn man irgendwie gleich mit einer imperativen Programmiersprache kommt und irgendwie sagt,
naja, was habe ich alles für Möglichkeiten,
Areas Unions und so weiter und dann ist das halt irgendwie komplexer,
das einzuführen.
Aber im Grunde genommen ist es
das Gleiche
Einmal zum Reinkommen so, ich habe, ehrlich gesagt,
wusste ich nicht genau, ich wollte das irgendwo unterbringen und ich wusste nicht genau wo,
deswegen habe ich es einfach am Anfang getan, Abschlusseigenschaften,
kann man sich genauso wie bei den ganzen anderen Sprachklassen,
die wir hatten, überlegen,
wenn ich zwei Sprachen in P habe oder zwei Probleme in P,
ist dann auch die Vereinigung, der Schnitt und so weiter,
ist das auch alles in P.
Und von der Implementierungsidee her würde das bedeuten,
wenn ich zwei Probleme habe,
die ich in polymieller Zeit lösen kann, also keine Ahnung,
kürzester Pfad berechnen und zwei Zahlen zu addieren,
kann ich dann auch den Durchschnitt,
das würde so von der Idee her, würde das dementsprechend,
ich will beides ausrechnen oder sowas,
so hintereinander,
kann ich
solche Sachen machen
Und bei NP eben die gleiche Frage, Vereinigung und Kompliment,
das geht im Grunde genommen genauso wie bei Entscheidbarkeiten,
nur dass man sich zusätzlich noch Gedanken machen muss über die Zeitschranke.
Also ich gehe dann ja los, sage bei Vereinigung zum Beispiel,
ich habe zwei Probleme, die ein P sind,
dann weiß ich, es gibt irgendwie zwei Polynome,
P1, P2 und zwei Algorithmen A1A2,
sodass eben diese Sprachen L1L2 entschieden werden.
Und dann mache ich mir jetzt Gedanken,
kann ich jetzt einen Algorithmus konstruieren,
der die Sprache L1 vereinigt, L2 entscheidet,
mit wieder einer polynomiellen Zeitbeschränkung.
Wie geht das
Wir haben heute übrigens leider keine Klicker-Fragen,
weil wir haben ganz viele Stellen zum Mitdenken.
Oder ganz viele Stellen für Pausen aus meiner Sicht.
Auch sehr angenehm. Wie kann ich Vereinigung machen? Grunde
genommen genauso, wie wir das bei Entscheidbarkeit gemacht haben.
Na, wie geht das Vereinigung
Kriege ich jetzt als Eingabe irgendwie so ein Wort X und ihr wollt entscheiden, ist,
dass in L1 vereinigt L2, wie macht ihr das?
Ihr habt einen Algorithmus, der entscheidet,
ob ein Wort X in L1 ist, ihr habt einen Algorithmus,
der entscheidet, ob ein Wort X in L2 ist.
Ihr kriegt ein Wort X als Eingabe, ihr wollt ausrechnen,
ob das in L1 vereinigt L2 ist, was macht ihr?
Genau, von der Programmiersprach-Idee, genau. Ich teste
die beide, verknüpft das mit dem Oder, fertig.
Warum ist das immer noch polemiell beschränkt? Das ist jetzt
ja so der Kniff, sonst die gleiche Argumentation haben wir auch gemacht bei Entscheidbandproblemen.
Beide ausführen, dann weiß ich, die stoppen immer.
Und sobald einer von beiden ja sagt,
sage ich dann irgendwie auch, ja,
warum ist das noch polemiell zeitbeschränkt
Genau, Summe von mir aus noch plus eins oder irgendwie
sowas, aber egal, geschenkt.
Also wenn ich für L1 Endquadrat viele Schritte brauche und für N2 N
hoch drei viele und ich führe die jetzt hintereinander aus,
dann brauche ich halt Endquadrat plus N hoch drei.
Das ist irgendwie immer noch ein Polynom.
Also das klappt. Und bei Kompliment genauso,
bei Kompliment oder so ähnlich nur bei Kompliment sagt man,
naja, dann führe ich halt den Algorithmus aus und drehe das Ergebnis um.
Das ist ein Schritt mehr. War noch nicht so lange.
Einmal fürs Kompliment hier super ausführlich. Also mit ganz formal,
für Komplimentabschluss sei L1 und P und A1 ein Algorithmus der L1 entscheidet.
Wir dürfen jetzt immer davon ausgehen, dass die Sprache
entschieden wird
Und jetzt will ich irgendwie zeigen, das Kompliment ist in P.
Und dann muss ich also einen Algorithmus angeben,
der mir bei Vorlage von X entscheidet,
X ist in Kompliment von L1 oder nicht.
Dann führe ich halt A1 aus und drehe die Antwort um,
ne? Also hier bei Eingabe X Staaten,
starte ich A1 und invertiere dann das Ergebnis.
Also wenn eins liefert, dann liefere ich 0,
wenn er 1-0 liefert, liefere ich eins.
Dann kann man noch argumentieren, der tut genau das,
was er soll. Und wichtig dann die letzten zwei Zeilen,
dass ein polemieller Zeit läuft, muss man noch argumentieren.
Das ist klar an der Stelle,
weil nur ein weiterer Schritt nötig ist
Und wenn man sich das hier oben jetzt so anguckt,
so Vereinigung, Durchschnitt, Kompliment geht alles, Konkordination geht,
Sternbildung geht, gehen auch noch so ein paar Sachen mehr.
Und bei NP sieht man hier Vereinigung, Schnitt,
Konkordination, Sternbildung, Kompliment fehlt irgendwie.
Warum? Meine Idee. Also, warum mache ich das nicht genauso?
Bei allen anderen würde man nämlich mehr oder weniger sagen,
ich mache die gleiche Idee. Also bei Vereinigung würde ich auch sagen,
bei NP, ich habe zwei Algorithmen,
die nicht die terministischen Polemialzeiten mein Problem entscheiden, naja,
dann führe ich die hintereinander aus.
Stoppen ja beide nach endlichen Schritten so und dann führe ich
das hintereinander aus. Und wenn er irgendwie einmal ja sagt,
dann sage ich auch ja, super.
Und beim Schnitt, wenn beide ja sagen,
sage ich ja, klappt super.
Warum klappt das bei Kompliment nicht
Genau, wenn ich bei, also das Problem ist,
dass man bei Nicht-Determinismus ja quasi immer diese Magie in Anführungsstrichen drin hat.
Ich habe irgendwie eine Rechnung drauf und wenn ich bei einer
Rechnung ja sage, dann sagt der ganze Algorithmus ja.
Und da passiert ja nicht sowas wie,
dass er in einem Schritt nochmal irgendwie die Ergebnisse alle zusammenführen würde oder so,
wie man das machen müsste, wenn man das deterministisch machen will,
sondern das passiert ja quasi per Magie.
Und jetzt kann ich genauso Sachen haben wie,
ich habe eine Rechnung, die führt zum Erfolg,
ich habe eine Rechnung,
die führt zum Misserfolg
So, wenn ich jetzt einfach bei beiden Rechnungen das Ergebnis umdrehe,
dann habe ich eine Rechnung, die führt jetzt zum Misserfolg und eine Rechnung,
die führt zum Erfolg, würde ich immer noch ja sagen.
Das ist irgendwie doof, das will ich nicht. Und wenn ich eine Instanz habe,
wo ich auf allen Faden ja sage, dass wir,
okay, dann sage ich jetzt auf allen Faden,
nein, wenn ich eine Instanz habe,
wo ich auf allen Faden nein sage, ist okay,
sage ich jetzt auf allen Faden,
ja, aber die viel, viel mehr und viel,
viel häufigeren Auftretenden Instanzen dazwischen,
dass ich nämlich vielleicht nur auf ein oder zwei Rechnungen ja sage und auf den anderen nein,
die kann ich nicht gut so umdrehen.
Deswegen klappt das nicht. Und auch das ist ein großes,
offenes Problem, ob NP gegenüber Komplimentbildung abgeschlossen ist.
Deswegen kann man sich da noch so eine Klasse QNP
einführen,
Kompliment von NP-Problemen
Aber deswegen fehlt hier halt das Kompliment,
weil von der Idee her ist nicht so einfach geht wie hier bei P und nicht klar ist,
ob man das vielleicht irgendwie anders machen kann.
Auch da, wenn man zeigen könnte,
dass das nicht, Moment, wenn man sein könnte,
dass es nicht gegenüber Kompliment abgeschlossen ist, was wüsste man dann sofort?
Ich zeigen könnte, dass es nicht gegenüber Kompliment abgeschlossen hier,
also wenn ich zeigen kann, NP,
für NP gilt nicht, wenn LNNP ist,
ist das Kompliment in NP,
was wüsste ich dann sofort?
Na,
siebtes Semester-Gym
Das ist auch gut. Es ist immer schön,
Leute aus den höheren Semestern hier zu haben, als Gast ist toll.
Dann weiß man, wenn NP nicht gegenüber Kompliment abgeschlossen ist,
P aber gegenüber Kompliment abgeschlossen ist, dann können die Klassen nicht gleich sein.
Deswegen ist das Problem auch so schwierig,
wenn ich das irgendwie zeigen könnte, dann wüsste ich gleich,
hui, die Klassen sind unterschiedlich und das ist eines der großen offenen Probleme.
Wenn ich zeigen könnte, dass NP gegenüber Kompliment abgeschlossen ist,
wäre auch ein großer Durchbruch,
aber dann würde zumindest für PNP erstmal so direkt nichts folgen.
Wäre aber auch ein
ziemlich großer Durchbruch
Ja, so was wollte ich, genau. Jetzt wollen wir
uns ein bisschen, jetzt wollen wir hiervor mal weg.
Jetzt wollen wir uns ein paar Probleme angucken und zeigen,
dass die ein P sind und dass die ein NP sind oder dass die ein NP sind.
So ein typisches Problem für ein Problem in P,
hatten wir gestern einmal schon gesehen, so kürzeste Pfade bestimmt.
Ich kriege irgendwie einen Grafen G, ich kriege zwei Knoten,
Start und Zielknoten und ich kriege irgendwie so eine Grenze K und dann ist gefragt,
kann ich so ein ST-Pfad finden,
also ein Pfad von S zu T,
der höchstens Karkanten benutzt.
Kann ich irgendwie da extra das Algorithmus anschmeißen oder kann auch irgendwie,
wenn da jetzt keine Kantengewichte dran sind,
mache ich eine Breitensuche,
dann kriege ich auch irgendwie
einen kürzesten Pfad von S zu
Und dann gucke ich, ob der irgendwie höchstens Karakanten benutzt.
Und wenn ja, sage ich ja.
Das kriege ich also ein P hin. Und es gibt
eine Vielzahl an Problemen, die irgendwie ein P sind,
glücklicherweise, weil man mit denen irgendwie effizient umgehen kann.
Und es gibt aber eben auch ganz viele Probleme,
die in NP sind, wo nicht klar ist,
ob die NP sind oder nicht.
Und wichtig ist erstmal, dass man, also von der Algorithmenidee,
neues Problem. Und was ich dann mache, ist,
ich probiere erst mal so beides, ich probiere erst mal zu zeigen,
dass es so einen Algorithmus gibt, der das Problem schnell löst.
Und gleichzeitig versuche ich einen Algorithmus anzugeben,
der ein NP ist. Und dann kann ich versuchen,
doch einen NP zu finden oder machen wir später zu zeigen,
dass das wahrscheinlich nicht existiert
Und was oft Probleme macht, ist,
sich schnell zu überlegen, wie so ein NP-Algorithmus aussieht.
Bei den Problemen, die wir haben,
ist das aber im meisten Fall gar nicht so schwierig.
Man redet eine mögliche Lösung und überprüft, ob das eine ist.
Wenn wir das Problem hier zum Beispiel habt,
das ist jetzt nicht pass, sondern längster Pfad,
gegeben, auch wieder das G, S und T.
Und jetzt wird gefragt, gibt es einen Pfad von S zu T,
der aus mindestens K-Kanten besteht, also nicht mehr höchstens K-Kanten,
sondern mindestens K-Kanten.
Wenn ihr jetzt kein Polinialzeitalgorithmus entwickeln wollt,
es geht nämlich gar nicht so einfach,
sondern nicht die terministischen Kandideterministischen,
sondern nicht die terministischen
Könnte man das machen? Weil nicht die Terminismus darf man
raten. Wie geht das? Am Stichwort mögliche Lösung raten
und überprüfen, ob es eine ist
Aber alle Pfade von S nach Tee angucken,
ist schwierig, die habe ich ja nicht.
Also die müsstest du jetzt irgendwie bestimmen.
Wie machst du das? Naja, du meintest ja gerade,
du guckst dir alle Pfade von S nach Tee an.
Aber wie ermittelst du die denn? Mit einer Tiefensuche kriegen
sie nicht alle. Also mit einer Tiefensuche kriege ich irgendwie
bestimmte Kanten. Jetzt habe ich mir auch noch überlegen,
dass ich irgendwie, mir alle kannten ja irgendwie währenddessen mal angucke,
aber ich kriege nicht unbedingt alle Pfade von S zu T. Also das müsste,
muss man noch irgendwie, wie macht man das?
Es geht zwar, aber wie mache ich das?
Ich kriege alle Pfade
Bitte? Alle Pfade angucken. Ja, ist immer noch unterspezifiziert.
Alle Pfade ist auch so ein bisschen... Aber alle Pfade,
guck mal, nehmen wir an die Eingabemenge,
ist eine Menge S mit zehn Zahlen.
Da macht die Aussage, ich gucke mir alle Zahlen an,
irgendwie Sinn, weil man dann sagen kann, alles klar,
machst eine Vorschleife, guckst du dir alle an.
Irgendwie sowas. So, jetzt kriegst du diesen Grafen.
Wer hat Knoten und Kanten? Da ist ja erstmal nichts
mit Faden. Wer hat Knoten, Kanten.
Wenn ihr jetzt sagt, ich gucke mir alle Pfade an
So, und jetzt kommt Frank doof um die Ecke
und sagt, aber da sind doch gar keine Pfade.
Ich habe Knoten, ich habe Kanten, wo ist in deinem Pfad?
Also maximal irgendwie einschrittige Pfade oder so, durch die Kanten.
So, wenn ihr euch jetzt alle Pfade angucken wollt,
vor allem, kurzer Exkurs, wenn da Kreise drin sind,
sind das unendlich viele.
Die kann ich mir gar nicht alle angucken.
Bitte, Entschuldigung, Christine. Genau, und dann,
was machst du
Genau, ich fange beim Startknoten an, gucke mir alle Nachbarn an.
Also ich rate mir quasi. Das Wichtige ist,
dass er irgendwann anfängt mit diesem Radiogeschichten.
Ich fange beim Startknoten an und rate mir jetzt alle möglichen Nachfolger.
Also alles, was mit Kanten verbunden ist. Wichtig ist,
ich mache das nicht deterministisch, also nicht,
dass ich mir die jetzt alle merke,
so wie wir da Breiten suchen oder sowas,
sondern dass ich sage, nicht deterministisch gehe ich in die einzelnen Nachbarn.
Dann mache ich das für die wieder und wieder und wieder und wieder.
Wichtiger Punkt dabei. Jede nicht die terministische Verzweigung ist endlich
Ein Knoten hat nur endlich viele Nachbarn. Also kann ich
auch nur nicht deterministisch endlich viele weitere Schritte raten.
Es gibt auch so ein paar Pfade dann,
wenn ich das so mache, wo ich so Dinge tue,
wie von V1 nach V2 gehen, nach V1 gehen,
nach V2 gehen, nach V1 gehen, nach V2 gehen.
Ist mir aber egal. Da sind ja auch die
guten Pfade drin, wo ich irgendwie weitergehe.
Wenn ich irgendwann mal bei Tee ankomme, dann überprüfe ich,
ob ich K-Schritte gemacht habe. Jetzt merke ich,
oh okay, am Anfang war es vielleicht ein bisschen unterspezifiziert.
Ich mache das mit diesem Raten und nehme Zähler mit,
den ich hochzähle, damit ich testen kann,
ob ich K-Schritte gemacht habe.
Jetzt komme ich irgendwann bei Tee an
Und sage, alles klar, super, sind das Kahlschritte gewesen oder nicht?
Und wenn ja, ist gut. Also eine andere Idee,
nee, warte. Na, machen wir das mal anders.
Da gibt es noch Probleme. Welche? Wir haben ja
gesagt, wir wollen immer nach punioniell vielen Schritten stoppen.
Tue ich das hier? Wenn ich das so mache,
so wie ich das eben beschrieben habe,
ich bin mir gerade nicht sicher,
vielleicht hattest du das eben schon besser beschrieben,
aber so wie ich das eben beschrieben habe,
gibt es noch ein Problem.
Also meine Idee war,
ich rate mir immer Nachfolger
Erhöhe währenddessen so einen Zähler und wenn ich irgendwann bei Tee ankomme,
dann gucke ich mir den Zähler an und wenn das mehr als K sind,
sage ich ja, wenn es weniger als K sind,
sage ich nein, wo ist da noch ein Problem?
Bitte? Nee, du redest ja nicht deterministisch weiter,
also da ist bestimmt auch ein kürzester Pfad dabei,
da stellst du dann fest, das sind nicht mehr als K-Schritte gewesen,
dann akzeptierst du nicht und irgendeine andere Rechnung,
die er später da ankommt, die sagt, ah ja,
mein Chao ist größer und dann sagt er,
super.
Also du hast ja auch quasi bei jeder nicht deterministischen Verzweigung
quasi einen anderen Zähler
Also du hast nicht einen globalen Zähler, in Anführungsstrichen.
Gibt es ja auch, geht gar nicht,
aber hast ganz viele. Nee, anderes Problem.
Problem ist gerade im Worst Case jetzt mal, ne?
Vielleicht gibt es ja gar keinen Pfad von S zu T,
dann mache ich das irgendwie immer weiter und habe überall
unendlich lange Rechnung möglicherweise in der Kreise drin.
Da habe ich überall eine endlich lange Rechnung. Das ist
also auch doof. Also muss man das nochmal anpassen,
dass man sagt, ich höre auf jeden Fall nach,
oh nach wie viel Schritten höre ich denn auf?
Also irgendwann will ich mal aufhören.
Das ist ja irgendwie Sache. Ja, schon tricky.
Ja, was kann ich
damit machen
Ja. Ja, oder auch nicht,
wenn ich die unendlich lange drehe.
Ja. Ja. Ja, also geht's nicht?
Es wäre aber schade
Das wäre auch, also ich muss zugeben,
das ist mir leider erst heute Morgen eingefallen, beim Flution,
das ist kein didaktisch besonders gut gewähltes Beispiel. Die Beispiele,
die gleich kommen, sind didaktisch sehr viel besser,
weil bei dem Beispiel schon ganz viel Mist passiert,
den man eigentlich nicht haben will,
weil die eigentliche Idee bei den meisten Problemen, die wir betrachten werden,
ist, ich rate mir eine Lösung, ich überprüfe,
ob es eine ist, ich bin fertig.
Das wäre hier, ich rate mir ein Pfad, ich gucke,
ob er die richtige Länge hat, ich bin fertig.
Das Problem gerade ist, mit diesem Pfadraten, ich habe keine obere Schranke dafür.
Das ist total ätzend, bei einer Aussagen logischen Formel,
ich rate mir eine Belegung, ich, für jedes Aussagensymbol,
das da drin ist, 0 oder 1.
Da gibt es irgendwie nur endlich viele Möglichkeiten, das zu machen.
Ich überprüfe, ob es das löst, fertig.
Hier ist das Problem, dieser Pfad,
es kann ja auch sein, nehmen wir mal an,
ich habe zehn Knoten, so ein kleiner Graf, zehn Knoten.
Und nehmen wir mal an, dass K ist eine Million.
Dann ist die Frage gerade, ob ein Pfad existiert,
der länger eine Million von da nach da.
Kann ja durchaus sein, Schwuppkreis ganz oft entlang gehen und dahin kommen.
So, Problem ist aber, wenn ich jetzt sage,
naja gut, dann rate ich mir meinem Pfad,
der länger eine Million und gehe da hin.
Jetzt bin ich plötzlich nicht mehr im Pulli mehr in der Laufzeit,
weil die Zahl eine Million,
die ist ja nicht unnäher gegeben als eine Million Striche,
sondern irgendwie als so eine Binärzahl der Länge
Und dann wird aber quasi die Berechnung viel zu lang.
Wie komme ich da drumherum?
Verstanden eben, so grob. Das ist irgendwie doof gemeint
Genau. Genau,
wenn ihr zehn Knoten habt und ihr wollt von S nach T gehen oder so,
dann kann man sich überlegen, wie kurz,
lang oder kurz, wie lang so ein Pfad maximal sein kann,
wenn da einmal ein Kreis drin auftritt,
einmal reicht ja
Dass ich sage, okay, ich komme von S zu Tee,
zehn Knoten, dann kann ich da maximal irgendwie neun Kanten entlanggegangen sein.
Und ein Kreis, bei dem ich noch nie den Zielknoten
besucht habe, der kann maximal die Länge neun haben.
Das heißt, ich kann maximal irgendwie von meinem Startknoten über
neun Knoten zum Startknoten gehen und dann zum Zielknoten oder sowas.
Also ich habe so grob so eine Schranke,
dass ich weiß so, wenn ich zehn Knoten habe,
die doppelte Anzahl der Knoten ist so das Schlimmste,
was ich suchen muss für Fahrt von S zu T,
wo ein Kreis drin ist.
Ab da muss spätestens das erste Mal so Kreis auftreten.
Solche Überlegungen kann ich irgendwie machen. Und dann rate ich mir,
statt Fade der Länge K zu raten, rate ich mir
alle möglichen Pfade der Länge 2N 3N oder irgendwie sowas,
aber so grob 2N müsse reichen.
Und dann gucke ich, führt mich der Fahrt von S zu T
, dann gucke ich, ob der mindestens Karkanten hat.
Und falls nicht, falls Karl noch größer ist,
gucke ich noch nach, ist in dem Fahrtenkreis drin.
Und falls Ja, kann ich auch wieder Ja sagen.
Und dann habe ich es gelöst. Dann bin ich um
dieses Karschritte-Raten rumgekommen und habe nur zwei endviele Schritte geraten.
Kann man das machen? Wir sehen gleich viele einfachere Beispiele,
die Grundidee hier wäre auch gewesen,
ich rate mir alle Fahrte der Länge K, prüfe,
ob da irgendwie so ein langer dabei ist.
Und wenn ja, ist gut. Aber dann merkt man
hier halt, dass das ein bisschen diffizil ist,
dass man an etlichen Stellen da noch rumbasteln muss
Aber die Kernidee ist auch, ich rate mir Fahrt von S
nach T, überprüfe, ob der die richtige Länge hat.
Und wenn das Karl deutlich größer ist als die Anzahl der Knoten,
dann muss ich halt noch gucken, ob da Kreise drin sind.
Und dann habe ich das. Da noch einmal,
wenn man sich diese Probleme hier anguckt, das sind ja alles so Entscheidungsprobleme,
das hatten wir ja gestern und auch bei Entscheidbarkeit ein bisschen diskutiert.
Üblicherweise, wenn man das jetzt algorithmisch macht,
dann ist es üblicherweise so ein Karnich gegeben,
sondern eben der Graf und irgendwie Start- und Zielknoten.
Also wenn ich irgendwie bei der HVV-App eingebe,
ich will von Altona nach Barenfeld,
dann gebe ich üblicherweise ja auch nicht einen,
also da gebe ich ja keinen K ein oder so,
sondern ich sage irgendwie Startziel und ich möchte bitte
einen kürzesten Pfad
Das wäre dann das sogenannte Optimierungsproblem, während das hier das zugehörige Entscheidungsproblem ist.
Und die beiden lassen sich aber immer sehr einfach ineinander überführen,
dass man quasi, wenn ich das Optimierungsproblem lösen kann,
dann kann ich den kürzen Pfad ermitteln.
Und dann kann ich gucken, ist der Pfad irgendwie kürzer als dieses K
und bin fertig. Und wenn ich das Entscheidungsproblem lösen kann,
dann taste ich mich quasi an die Optimierungsvariante heran,
indem ich prüfe, gib es einem Pfad mit V-Knoten,
gibt es einen mit V-Knoten, mit V-2-Knoten,
mit V-minus 3-Knoten.
Und das mache ich dann so lange,
bis ich bei dem kleinsten Wert angekommen bin.
Und dann weiß ich, das ist mein kleinster Pfad.
Oder wenn man das ein bisschen cleverer machen will,
dann arbeitet man hier bei dem Karmid mit Bineem Suchen.
Also V-halbe Knoten,
V-3-Viertel-Knoten und so weiter
Und dann sind die beiden äquivalent. Also hier steht das
nur noch mal, falls ihr euch wundert, warum,
dass ihr immer Entscheidungsprobleme sind,
der Übergang zu Optimierungsproblemen ist mit wenig Zeitaufwand möglich,
mit wenig zusätzlichem Zeitaufwand.
Okay, machen wir noch mal ein paar NP-Probleme,
die deutlich einfacher zu lösen sind als das eben.
Das da, Independent Set. Ungerichteter Graf,
also Graf mit Knoten und Kanten ohne Spitzen
und irgendwie so eine Zahl kam
Und die Frage ist jetzt, ob G in die Pen-and-Z enthält,
der größte Kader, das bedeutet, ob der Kark-Knoten enthält,
die alle paarweise nicht miteinander verbunden sind.
Also ihr habt so fünf Knoten,
zum Beispiel für K5, gibt es fünf Knoten derart,
dass es keine Kante zwischen diesen fünf Knoten gibt.
Das ist das Independence-Z-Problem. Clicke kennt man vielleicht eher so,
klicken Problem, eine Clicke der Größe 5,
das sind fünf Knoten, die alle miteinander verbunden sind.
Und independence-Z ist quasi so irgendwie,
dass das Komplementäre in Anführungsstrichen dazu, da suche ich fünf Knoten,
die alle gerade nicht miteinander verbunden sind.
Also gibt es fünf Städte, die ich alle gegenseitig,
die sich alle gegenseitig nicht besuchen können
Wie löst ihr das? Das ist jetzt sehr viel einfacher
als das eben und gehe genau mit dieser Technik,
dass man sagt, ich rate mir eine mögliche Lösung,
ich überprüfe, ob es eine ist, ich bin fertig.
Also wie würde man das hier machen?
Nee, zu kompliziert. Ich glaube, es klappt,
aber wird zu kompliziert.
Probier es mal mit Lösungraten überprüfen
Genau. Ja, also deins ist wahrscheinlich schneller,
aber das nutzt komplett den Nicht-Eterminismus aus.
Und ich fange bei, habe noch gar nichts, Startkonfiguration,
habe nichts. Und dann rate ich mir K verschiedene Knoten,
nicht deterministisch, bin ich schön verzweigt, so nicht deterministisch.
Und dann überprüfe ich deterministisch für jede dieser Rechnungen,
wo ich gerade angekommen bin, ob diese K geratenen Knoten,
ob die alle nicht miteinander verbunden sind.
Und wenn ja, sage ich ja und wenn nein,
sage ich nein. Zwei Sachen, die man dann immer
überprüfen muss. Erstens ist das korrekt und zweitens
stimmt die Laufzeit
Korrektheit, bei solchen Beispielen, naja, wenn es so
ein Independence-Set der Größe K gibt, dann muss ich es auch raten.
Wenn es keins gibt, kann ich es nicht raten.
Ganz einfache Argumentation. Und Laufzeit, K-Knoten zu raten,
dauert so grob O von K viele Schritte oder O von V. Wahrscheinlich
muss ich über die V-Knoten rübergehen und mir da K raussuchen,
dann bin ich bei O von V. Und danach gehe ich alle Kanten durch und gucke immer,
ob eins, nee, und gucke,
ob beide Enden von diesen K gewählten Knoten sind.
Und falls ja, gibt es da leider gerade eine Kante,
das ist doof und dann höre ich auf.
Also bin ich irgendwie ein O von V plus E,
ne? Also bei Eingabe K, G und K
raten wir K-Knoten
Entsteht hier in Klammern nochmal, wie man das machen kann.
Entweder führt man so einen Zähler mit und achtet darauf,
dass man genau K. Knoten wählt oder man
... Oder indem man für jeden Knoten von Gerät,
ob er gewählt werden soll oder nicht.
Also ich gehe über alle Knoten rüber und sage immer eins oder null,
ich will den oder ich will den nicht.
Und dann muss ich danach nochmal gucken,
ob ich wirklich K. Knoten gewählt habe.
Und mache halt nur weiter, falls ja. Und danach
deterministisch prüfen, ob die Karknoten paarweise nicht miteinander verbunden sind.
Genau, also ganz wichtig,
hier eine nichtdeterministische Phase
Am Anfang und hier eine deterministische Phase danach. Genau,
und dann Korrektheit und Laufzeit, Korrektheit,
wenn ich Tagknoten habe, die ein Independence Z bilden,
irgendeins, vielleicht habe ich auch mehrere, aber wenn es mindestens eins gibt,
dann muss das in dieser Ratephase auch irgendwo einmal geraten werden.
Und bei der Rechnung, wo ich das geraten habe,
da führt danach die deterministische Überprüfung dazu, dass ich sage,
jo, das ist wirklich ein Independence Z,
also akzeptiere ich
Und wenn es aber gar keins gibt, wenn der Graf gar keinen Independence hat,
dann kann ich in dieser Ratephase natürlich auch keins raten.
Also soll das gehen, gibt ja keins. Und Laufzeit,
Ratephase, also diese nicht-diterministische Phase geht in den O von V,
anschließend die deterministische Phase in O von E,
also zumindest so wie es auf der vorherigen Folie beschrieben ist,
sieht man das gut.
Erstmal alle Knoten durchgehen, O von V,
dann alle Kanten durchgehen, O von E.
Und dann hat man insgesamt O von V plus E,
was Puddingmellen der Eingabe ist. Die Eingabe ist auch,
wenn das ein Graf hier ist,
entweder ist die Eingabe V plus E oder wenn das irgendwie als Addizenzmatrix gegeben ist,
V-Quadrat,
aber da sind wir puddingmell in der Eingabe und dann haben wir ein nicht-diterministischen Algorithmus,
der das Problem impulimärer Laufzeit entscheidet und damit ist das Problem
dann in NP
Nicht der Algorithmus übrigens. Nicht der Algorithmus ist ein NP,
sondern das Problem oder die Sprache da oben ist in NP.
Man spricht zwar manchmal auch so umgangssprachlich von einem NP-Algorithmus,
aber da muss man, also irgendwann darf man das mal benutzen,
aber am Anfang lohnt es sich so ein bisschen auf die Trennung zu achten,
dass das eine ein Algorithmus ist, der nicht deterministisch ist,
so eine polymuelle Laufzeit arbeitet und das andere ist die Sprache,
die ist dann ein NP.
Zweites Problem. Das kennen wir schon. Satisfibility,
Fee, Aussagen logische Formel, die zusätzlich erfüllbar sein soll.
Deterministische Algorithmus dafür, Wahrheitstafel aufbauen, gucken,
ob da irgendwo
eine Eins ist
Nicht deterministischer Algorithmus, geht sehr viel schneller, wie macht der das?
Ja, Tafel aufbauen macht er nicht. Wenn er Tafel
aufbaut, dann braucht er ja auch zwei hochendviele Zeiten.
Genau, ich rate mir die Belegung,
dein Baum ist quasi dieser Konfigurationsbaum.
Wo ist jetzt übrigens
deine Wahrheitstafel
Ja, ja, also die Wahlstaffel in dem Baum,
quasi die Wahlstafel, ist, wenn du so möchtest,
über alle Rechnungen verteilt.
Also wenn man alle Rechnungen zusammenfassen könnte, dann hättest du die Wahrheitstafel.
Jede Rechnung ist quasi eine Zeile in der Wahrheitstafel.
Das Problem ist nur, man kommt da nicht ran.
Also ich habe halt keine Möglichkeit, von der Einrechnung zu sagen,
ich möchte mal nachgucken, was in der anderen Rechnung passiert.
Aber quasi per Magie, wenn keine dieser Rechnungen ja sagt,
dann sagt der ganze Algorithmus eben nein.
Also wir raten für jedes Aussagesymbol eine Belegung,
0 oder
Nach der Ratephase deterministisch überprüfen, ob die geratene Belegung viel wahr macht.
Also dann gehe ich in die Formel rein und überprüft das. Schreibe überall null und einzeln hin und rechne das aus. Falls ja,
akzeptiere ich,
sonst wird abgelehnt und dann kann man sich schnell wieder überlegen,
ist korrekt, so wie eben auch und arbeitet in Polymialzeit,
weil diese Ratephase hier, da brauche ich halt nur,
oh von viel,
viele Schritte oder genauer oh von Anzahl der Aussagensymbole und um zu gucken,
ob eine schon geratene Belegung viel wahr macht,
da brauche ich auch nur so grob oh von Vieh oder im schlimmsten Fall so,
oh von Vieh Quadrat,
aber das bleibt auf jeden Fall in Polymialzeit
Klappt also auch. Wenn ihr das vergleicht,
hier die beiden Ideen, bei beiden ist die Idee,
ich rate mir eine Lösung,
also hier suche ich ein Independent Set,
also funktioniert der Algorithmus so, dass ich sage,
ich rate mir mal eine Menge der Größe K und gucke,
ob das eins ist.
Hier suche ich eine erfüllende Belegung, also sage ich,
naja, dann rate ich mir eine Belegung, die eine erfüllende sein könnte.
Also ich rate mir einfach irgendeine Belegung und gucke, ob das eine erfüllende ist.
Und wenn ja, akzeptiere ich. Letztes Beispiel,
ein bisschen ich da vielleicht so an dem,
was man manchmal machen möchte,
wenn ich so einen ungerichteten Grafen habe und ich habe
eine Entfernung D und ein Budget
Dann frage ich mich jetzt, also der Graf ist quasi
eine Abstraktion von einer Stadt oder was auch immer.
Und ich möchte, gehe Lagerhäuser so auf diesem Grafen platzieren,
dass keine Stadt irgendwie weiter als D von so einem Lagerhaus entfernt ist.
Sprich, dass ich alles gut beliefern kann. Typisches logistisches Problem,
müsste man jetzt, wenn das ein richtiges logistisches Problem ist,
dann würde man jetzt noch arbeiten mit irgendwie Kantengewichten,
dass man sagt, naja, wenn ich hier ein Lagerhaus hinstelle,
nach da komme ich schnell,
nach da,
aber vielleicht nicht so schnell,
je nachdem wie die Straße
so beschaffen ist
Aber so auf einer gewissen Abstraktionsebene ist das schon ganz okay.
Da habe ich irgendwie einen Grafen. Und ich darf jetzt
gehe Lagerhäuser so platzieren oder ich darf gehe Lagerhäuser platzieren.
Und ich will wissen, ob ich das so hinkriege,
dass kein Knoten des Grafen jetzt weiter als d von diesem Lagerhaus entfernt ist.
Oder von einem der Lagerhäuser. Das kann man auch wieder
so wie jedem vorgehen, irgendwie eine mögliche Lösung raten.
Und das Überprüfen wird dann ein bisschen schwieriger.
Also G-Stück?
Wie machst du das
Genau, aber das, jetzt muss man ein bisschen aufpassen,
dass man mit diesem, also dann schmeißt irgendwo mal das Wort nicht deterministisch und deterministisch rein,
weil an der Stelle willst du es nicht mehr nicht deterministisch machen.
Genau. Also ich wähle nicht dieterministisch, gehe Lagerhäuser und jetzt überprüfe ich deterministisch,
gehe ich jetzt quasi von jedem Lagerhaus aus,
mache eine Breitensuche zum Beispiel, dann weiß ich irgendwie,
erstes Lagerhaus angefasst, Breitensuche machen, ein Schritt,
zwei Schritte, drei Schritte oder so, dann weiß ich,
das ist so die Kugel von Knoten,
die drei Schritte von diesem Lagerhaus entfernt sind.
Das mache ich dann so,
bis ich bei D angekommen bin und all diese Knoten,
die ich so erreicht habe,
die habe ich mir jetzt markiert und das gehe ich dann für jedes Lagerhaus durch,
vielleicht einige Knoten mehrmals markiert,
weil die von mehreren Lagerhäusern schnell zu erreichen sind,
egal.
Ich mache ja die Markierung nicht wieder weg.
Und danach gehe ich nochmal alle Knoten durch und gucke,
ob sie alle markiert sind.
Bin ich fertig. Und da Breitensuche in Polyniumialzeit geht,
rate ich mir hier, also geh viele Knoten.
Und dann habe ich noch einen Algorithmus, der geh mal Polyniumialzeit ist.
Und dann bin ich fertig. Bleibt das ein Polynum.
Also nicht die terministisch gehe Knoten raten. Und dann für
jeden gewählten Knoten, zum Beispiel mit einer breiten Suche gucken,
wo komme ich überall hin mit die Kanten und jeder
so besuchte Knoten
wird markiert
Korrektheit, ja, ne, weil ich irgendwie,
wenn ich wieder so Geh-Lagerhäuser gibt,
die ich da verteilen kann, dann finde ich die hier auch.
Muss man halt mit arbeiten noch. Hier ist korrekt,
hat schwieriger, weil man noch argumentieren muss,
dass die Idee hier mit der Breitensuche, dass die tatsächlich funktioniert.
Aber wenn man jetzt Breitensuche kennt oder so, dann sagt man,
naja, ist ja klar, eine Breitensuche tut genau das,
eine Breitensuche ermittelt gerade in ihrer dritten Ebene,
welche Knoten drei Schritte von Startknoten entfernt sind.
Und Laufzeit ist auch ein bisschen schwieriger,
weil man auch wieder hier sich überlegen muss,
dass Breitensuche auch in Pulimialzeit geht,
dass ich hier maximal V viele Knoten habe
V mal die Breiten suchen. Dann bleibe ich im Punyumialzeit
und dann ist das alles okay.
Also es ist korrekt und lauft sie das auch gut.
Also das als ein etwas komplizierteres Beispiel. Die ersten beiden sind
ziemlich einfach, was sie so in Erinnerung behalten solltet.
Erster Schritt immer nicht die terministische Ratephase. Ich rate mir
eine mögliche Lösung. Zweiter Schritt, ich überprüfe, ob
sie eine ist. Und dann, was ich immer zeigen muss,
ist das wirklich korrekt und stimmt die Laufzeit auch.
Und bei den meisten Problemen, die wir so angucken,
genügt es, das so zu machen.
Es gibt auch Probleme, wo es sehr viel anspruchsvoller ist,
überhaupt einen NP-Algorithmus zu entwerfen.
Aber das machen wir dann hier nicht mehr.
Also bei uns bleibt das so in dem Bereich von sowas
wie dem Independence Z-Problem oder sowas
Gut. Fragen dazu? Also gestern haben wir ja relativ viel so Einführendes gemacht,
dass aus der heutigen Vorlesung, damit sollte man dann auch umgehen können,
also dass man irgendwie einen NP-Algorithmus, einen Algorithmus,
der zeigt, dass ein Problem in NP ist,
dass man sowas entwerfen kann, das sollte gehen.
Genau. So, und jetzt als nächster Schritt,
ja, jetzt können wir P-Algorithmen werfen und NP-Algorithmen,
naja, P-Algorithmen und entwerfen machen wir eine Algorithmenvorlesung nochmal richtig,
aber Allgemein, Problem in P gilt als effizient lösbar.
Versucht man das natürlich möglichst gut zu machen, aber erstmal,
egal was für ein Polynom ist, sagen wir erstmal, das ist gut.
So, und jetzt hatten wir eben mehrere Probleme,
die letzten drei oder vier, die waren alle in NP,
so längster Pfad, Independence Z, eben das mit dem Lagerhaus,
da haben wir für alle gezeigt, dass sie in NP sind.
Wenn man da jetzt versucht, einen Algorithmus zu entwickeln,
der zeigt, dass das Problem in P ist,
dann gelingt das irgendwie nicht so.
Also zumindest nicht so einfach
Herstellt man fest, das funktioniert irgendwie auch nicht inkompliziert so.
Also irgendwie ist das, irgendwie ist das schwierig. Und was man jetzt gerne hätte,
ist eine Möglichkeit, so ähnlich wie bei Entscheidbar, Unentscheidbar,
zu sagen, oh, das geht auch wirklich nicht.
Also ich hätte gerne so eine Technik,
mit der ich mir ein Problem angucken kann und dann sagen kann,
das geht gar nicht im Pulli im Jahrzeit.
Warum hätte ich das gerne? Naja, weil ich dann
aufhören kann, einzusuchen. Also wenn, keine Ahnung,
euer Chef zu euch kommt und sagt, hier,
das und das ist das Problem, mach mal,
dass das schnell geht und ihr dann sagen können,
das geht aber gar nicht, weil das Problem unentscheidbar ist.
Schau mal gut, wenn ihr sagen könnt,
das geht aber auch nicht schnell oder es ist zwar scheibar,
aber es geht nicht schnell,
auch gut,
dann kann euch euer Chef irgendwas anderes zu tun geben oder
ihr könnt einen Kaffee trinken gehen oder keine Ahnung
Aber das hätte man gerne, ne? Problem ist,
das geht gar nicht so einfach, wie man das gerne hätte.
Also für entscheidbar, unentscheidbar haben wir eine Technik.
Hierfür fehlt uns noch komplett die Technik. Hätten wir aber gerne.
Wir hätten gerne, da hätten wir gerne so eine Technik,
mit der wir sagen können, dass es das nicht gibt.
Kursiv und mit Klammern. Solche Technik gibt es leider
im Moment nicht. Da komme ich jetzt zu.
Das da meinst du, ne? Da komme ich ja
zu. Also so eine Technik hätten wir gerne
Was man jetzt, also gibt es aber nicht so,
ist noch keiner drauf gekommen, wie man so solche unteren Laufzeitschranken zeigen könnte. Das Problem ist,
für eine obere Schranke, also wenn ihr sagen möchtet,
ich kann dieses Problem in N hoch 4 lösen und dann kommt jemand daher und sagt,
ah, ich kann das sogar in N hoch 3 lösen und dann kommt jemand daher und sagt,
ich kann das sogar in Endquadrat lösen.
Das ist deswegen einfacher, in Anführungsstrichen,
das ist natürlich auch eine Herausforderung, aber das ist deswegen einfacher,
weil man, um zu zeigen,
dass ich ein Problem in O von N hoch 3 lösen kann.
Da muss ich einen Algorithmus für angeben,
einen Algorithmus für das Problem, zeige ich,
dass der korrekt ist und dass der die richtige Laufzeitschranke hat
Und dann, glaube ich, meine Behauptung gut untermauert.
Dann weiß ich, okay, ich kann den lösen im Ofen in der Hoch-3.
Wenn ich aber zeigen möchte, ich kann ein Problem,
wie zum Beispiel dieses Independent Z, auf keinen Fall in,
sagen wir mal, oh, von Endquadrat lösen.
Also wenn ich sage, ich brauche mindestens mehr als so ein quadratisches Polynom.
Dann müsste ich irgendwie darüber argumentieren können, dass ich sage,
egal welchen Algorithmus man vorschlägt für dieses Problem,
der braucht mindestens Endquadrat viele Schritte oder halt sogar mehr.
Und das ist schwierig, weil dieser Raum,
in Anführungsstrichen, aller Algorithmen ist ja schwer zu fassen
Also selbst wenn ich sage,
ich gucke mir nur imperative Programmiersprachen an oder so,
woher sollte man wissen, dass nicht jemand auf die Idee kommt?
Ich wandle den Grafen erstmal in komisches Matrix-Konstrukt um und dann
mache ich hier komische Sachen und dann addiere ich die Zahlen,
die ich den Knoten zugewiesen habe und bla bla bla.
Also es gibt ja unendlich viele Möglichkeiten und Ideen, die man so haben kann.
Und das macht es halt schwierig, untere Schranken zu beweisen.
Das sollte einen jetzt üblicherweise nicht einfach davon abhalten,
das zu tun, aber es ist auch so,
dass jetzt irgendwie in den letzten 1.000,
2.000 Jahren niemandem was Gutes eingefallen ist,
wie man solche unteren Schranken zeigen kann.
Deswegen ist das Problem
so berührt
Und so kompliziert. Man hat das halt in den letzten 50,
60 Jahren, da hat man es hingekriegt,
das Problem, sehr exakt zu beschreiben.
Das hängt mit diesem PNP-Unterschied zusammen. Das werden wir noch sehen
. Und es war ja aber vorher auch schon so,
dass man ganz viele Probleme, also sowas wie das Independent-Set-Problem oder sowas,
es gibt ganz viele Probleme,
die hat man schon seit tausenden von Jahren sich irgendwie angeguckt und hat versucht,
dafür Algorithmen zu entwickeln.
Und hat es aber keine Schnellen hingekriegt. Und hier dieses mit sehr unwahrscheinlich,
das rührt daher, dass wir eine Technik entwickeln werden,
mit der man sagen kann,
ich zeige für irgendein Problem,
dass das eine bestimmte Eigenschaft hat
Und dann weiß ich, wenn ich jetzt dieses Problem schnell lösen könnte,
also wenn ich ein Polynumialzeitalgorithmus dafür angeben könnte,
dann könnte man all diese zigtausend Probleme,
für die man in den letzten 100, 200,
300 Jahren keinen schnellen Algorithmus gefunden hat,
obwohl da ganz, ganz viele Leute daran gearbeitet haben,
die könnte man dann plötzlich auch alle sehr schnell lösen.
Und da man das nicht glaubt so, also das ist mir Glaube,
also dieses sehr unwahrscheinlich bezieht sich jetzt nicht auf unwahrscheinliche oder Wahrscheinlichkeitsrechnung,
sondern auf Intuition, das macht es sehr unwahrscheinlich,
dass man das Problem plötzlich schnell lösen kann.
Also die Argumentation ist quasi, dass man sagt,
Seit ein paar Jahrhunderten haben ganz,
ganz viele Leute an ganz, ganz vielen unterschiedlichen Problemen gearbeitet,
für die sie nie einen schnellen Algorithmus gefunden haben.
Und ich zeige jetzt für mein neues Problem,
wenn man das schon erlösen kann,
oder wenn ich es schaffe, das schnell zu lösen,
dann kann ich all diese Probleme schon erlösen.
Ich bin besser als die ganzen Typen aus den letzten Jahrhunderten als alle.
So, und das macht es halt unwahrscheinlich so.
Das ist ein Argument, es gibt noch ganz,
ganz viele andere, die hängen damit zusammen,
wie man unterschiedlich auf P und NP draufgucken kann.
Und dann kann man auch deutlich andere Argumente bringen,
warum die Klassen sehr wahrscheinlich unterschiedlich sind und warum man dann
sehr wahrscheinlich eben für die Probleme,
die wir uns später angucken werden,
keinen Pulli mehr als Zeitalgorithmus entwickeln kann
Da wollen wir hin. Bevor wir da hingehen,
machen wir noch mal kurz einen Exkurs zu so einer alternativen Definition von NP.
Dann gucken wir uns ganz kurz an,
wie man Probleme in NPD-terministisch lösen kann. Das brauchen wir,
um nachher gut sagen zu können,
dieses Problem lässt sich sehr wahrscheinlich nicht schnell lösen,
weil es nur in NP liegt,
aber nicht in P. Also den zweiten Punkt brauchen wir dann wieder dringend.
Der erste ist kleiner Exkurs mehr, braucht man gut in der Algorithmik.
Der zweite ist wichtig und beim dritten werden wir
dann anfangen eine Technik für das eben angesprochene zu entwickeln.
Und da brauchen wir vor allem den Begriff der Reduktion
Okay, gehen wir einmal kurz in die alternative Definition von NP,
die man vor allem bei einer algorithmischen Sicht braucht.
Wenn wir uns nochmal dieses längste Pfadproblem angucken,
dann ist das so, es scheint schwierig zu sein,
zumindest effizient, das Problem zu lösen.
Also einen möglichst langen Pfad zu suchen. Oder wenn wir
bei diesem Independent-Set-Problem sind, ein Independent-Set zu finden,
scheint schwierig zu sein, also das schnell zu machen.
Schwierig bezieht es jetzt darauf, dass es wohl nicht
möglich ist, das schnell zu machen.
Was aber sehr schnell geht, ist zu überprüfen,
ob eine behauptete, gegebene Lösung tatsächlich eine ist oder nicht
Also bei diesem längsten Pfad, man gäbe mir K-Kanten,
von denen man behauptet, dass es ein S nach Tee
pfad und ich prüfe, ob das wirklich so ist.
Oder halt mehr als K-Kanten. Bei dem Independent Z,
man gebe mir die gewünschte Anzahl von Knoten, von denen man behauptet,
dass es ein Independent Z ist und ich überprüfe,
ob es das ist.
Also dieses Überprüfen, das ist dann quasi das,
was wir eben immer in der deterministischen Phase gemacht haben.
Nicht die terministischen haben wir eine mögliche Lösung geraten,
danach haben wir sie überprüft. Und das ging dann immer effizient.
Und das kann man ausnutzen als Alternative Definition von NP,
dass man nicht mit Nicht-Determinismus arbeitet,
sondern dass man quasi, man nennt es ein Zertifikat,
dass man mit einer behaupteten Lösung oder eben ein Zertifikat arbeitet
Das geht wie folgt. Man führt sogenannte Verifikationsalgorithmen ein.
Es hat jetzt nichts zu tun mit Verifikationen,
wie man das heutzutage so über, ob wir uns Software-Kontext meint,
sondern das meint nur für eine Probleminstanz,
kriege ich eine behauptete Lösung und ich überprüfe,
ob es eine ist.
So ein Verifikationsalgorithmus, der ist deterministisch. Da wird also
kein Nicht-Determinismus benutzt, die terministisch. Und er kriegt zwei
Argumente X und Y. X ist die ganz normale Eingabe,
zum Beispiel der Graf und die Zahl K.
Und Y ist ein Zertifikat. Y ist jetzt immer
die behauptete Lösung, die von der ich annehme.
Das ist eine
Und A, verifiziert X, also die eigentliche Probleme ist Science X,
wenn es irgend so ein Zertifikat Y gibt,
sodass A XY, schreibt man da einfach gleich eins ist.
Die von A, wie infizierte Sprache,
das sind dann all die Xe, also die eigentlichen Probleminstanzen,
für die irgendein Zertifikat existiert, sodass A XY eins ist.
Also die Xe würden die Sprache, nicht die Y,
da sagt man nur, es müsste welche geben.
Also beim Independent Z-Problem würde man sagen, ja,
es gibt einen Verifikationsalgorithmus, der arbeitet nämlich damit,
dass man ihm K-Knoten gibt und dann überprüft,
ob das ein Independent Z ist
Und dann nimmt man alle die Grafen, das sind dann all die Xe,
für die es irgendwie so ein Y gibt,
nämlich die K-Knoten, die in Independence Set sind,
die Grafen, die nimmt man alle in die Sprache.
Und dann hat man auch Independence Set. Und das ist so
eine andere Sichtweise auf NP, statt mit Nicht-Iterminismus zu arbeiten,
arbeite ich mit Determinismus, aber ich sage dann,
ich kriege als Zu der Eingabe zusätzlich noch ein Zertifikat.
Genau, jetzt gibt es,
das ist erstmal allgemein ein Verifikationsalgorithmus, um jetzt zu zeigen,
dass das und NP, also die bisherige mit Nicht-Iterminismus,
definierte Sache,
dass das gleich ist,
muss man
noch auf eine Sache achten
Dieses Zertifikat hier, das darf nicht zu lang werden.
Wenn ich irgendwie eine Eingabe in Stanz X habe,
dann darf das Zertifikat nicht zu lang werden,
weil der nicht die terministische Algorithmus,
so wie wir das vorher gemacht haben,
der darf ja auch nur in der Eingabelänge polynumiell viele Schritte machen.
Also wenn ich, nehme an, ich habe so ein
Endquadratalgorithmus und ich kriege als Eingabe in Graf mit 100 Knoten,
dann darf ich vielleicht nur 100 Quadrat viele Schritte machen.
Und damit ich tatsächlich zeigen kann, dass alles,
was ich mit dieser Art von Algorithmen machen kann,
identisch ist, muss ich verlangen, dass der in Polynialzeit abläuft,
das A und dass gleichzeitig dieses Y hier nicht zu groß wird.
Das Zertifikat darf auch nur polynumielle Länge in X haben
Also da steht es nochmal, für das Zertifikat Y verlangen wir zusätzlich, dass das die Länge von Y polyniumiell ist in der Länge von X. Und wenn wir dann sagen,
dass der Verifikationsalgorithmus Premiumial in X ist,
dann ist er das auch in X und Y. Und dann kann man definieren oder den Satz beweisen,
eine Sprache LS in NP, nee,
dass die Definition der Sprache LSNP, genau dann,
wenn, genau dann, wenn so ein Verifikationsalgorithmus A existiert,
zwei Eingaben X und Y, polymäle Laufzeit,
sodass noch für dieses C hier gilt,
all die Xe packe ich nach L,
für die so ein Zertifikat Y existiert,
polymäle Länge X,
sodass der Verifikationsalgorithmus richtig ja sagt
So kann ich NP auch definieren und dann kann ich eben zeigen,
dass nicht die Terminismus und Verifizieren das Gleiche ist.
Beim Nicht-Determinismus rate ich vorneweg nicht deterministisch eine mögliche Lösung,
beim Verifikationsalgorithmus kriege ich diese mögliche Lösung als Zertifikat mit.
Dann nochmal der Unterschied, Verifikationsalgorithmus hätte neben der eigentlichen Eingabe,
also den Xen hier,
kriegt er immer noch so ein Zertifikat Y und kann dann überprüfen,
ist das wirklich ein positives Zertifikat sozusagen,
also überzeugt mich das,
dass das eine Jahrinstanz ist oder nicht und der
nicht-deterministische Algorithmus,
der kann raten
Und wenn man sich das beim Independence Set anguckt,
dann ist der Unterschied, der nicht deterministische Algorithmus,
das haben wir ja vorhin gemacht, der rät sich,
so ein Independence Set der Größe K und überprüft, ob es eins ist.
Und dann überlegt man sich, ja, das ist korrekt und ja,
das ist in Polynialzeit, also ist das Problem in NP.
Mit der Verifikationsbrille sagt man, ja,
es gibt so einen Verifikationsalgorithmus für das Problem,
der in Polymialzeit abläuft und mit klein genügt, genügend kleinen Zertifikaten arbeitet,
nämlich wie folgt, der kriegt auch den Grafen.
Gehe als Eingabe und dann kriegt er als Zertifikat K-Knoten,
mit was anderem arbeitet er gar nicht, sondern erwartet,
dass ein Zertifikat genau K-Knoten hat und dann guckt er,
ist das ein Independence Set oder nicht
Und das ist ein Verifikationsalgorithmus,
der das Problem von dem Jahrzeit löst,
denn wenn es so ein Independence Z gibt,
dann gibt es auch ein Zertifikat, das ihn davon überzeugt,
wenn es keine Independence Z für den Grafen gibt,
gibt es kein Zertifikat, das ihn davon überzeugt.
Also sagt er bei den richtigen Instanzen, ja,
bei den richtigen Instanzen, nein.
Und läuft im Polymialzeit und das Zertifikat ist klein genug.
Also alles gut. Und genau so kann man argumentieren,
dass diese beiden Sichtweisen identisch sind und dass es also egal ist,
ob man Verifikationsalgorithmus für ein Problem angibt oder nicht die terministischen Algorithmus,
mit den zusätzlichen Eigenschaften Polymialzeit und so weiter.
Und mit beiden Herangehensweisen kann man zeigen,
dass ein Problem in NP ist
Diese Nicht-Eterminismus-Sichtweise, die wird viel in der theoretischen Informatik benutzt.
Diese Verifikationssichtweise wird viel in der Algorithmik so benutzt. Zum Beispiel,
wenn jetzt so das klassische Algorithmenbuch im nächsten Semester in die Hand nimmt,
den Korm in der Algorithmen eine Einführung,
da wird halt mit dieser Verifikationsidee gearbeitet.
Sprich, wenn ihr euch die letzten Folien nochmal anguckt,
dann seid ihr da auf den Teil auch gut vorbereitet schon.
Da nochmal der Satz,
dass das equalent ist
Und die Idee, wenn man das jetzt ganz allgemein zeigen will,
dann habe ich ja NP eingeführt über Turing-Maschinen.
Und dann ist dieser Nicht-Determinismus hängt ja mit Turing-Maschinen zusammen und um dann zu zeigen,
dass Verifikation, aber das Gleiche ist,
dann gibt man als Zertifikat quasi die Erfolgsrechnung der Turing-Maschine mit und überprüft dann,
ob das tatsächlich eine Erfolgsrechnung ist.
Und dann hat man das gut gezeigt. Okay,
Fragen dazu. Das ist auch nur so Exkursartig. Also
wenn ihr das mit Nicht-Determinismus verstanden habt und immer macht,
dann ist das auch super.
Man kann es aber eben auch mit dieser Verifikationsbrille machen
Dann das. NP-Probleme deterministisch lösen. Das geht,
ist aber teuer. Also wenn ich ein Problem habe,
das in NP ist und gleichzeitig auch noch in P,
P ist ja eine Teilmenge von NP,
dann ist alles gut, dann kann ich das schnell lösen.
Aber wenn ich jetzt allgemein sage,
ich nehme mal so ein NP-Problem und ich will das jetzt deterministisch lösen,
dann stelle ich aber einigen Problemen fest,
mir fällt auf lange Sicht kein P-Algorithmus ein irgendwie.
Also kein Algorithmus, der ist in Polimalzeit löst.
Und dann versuche ich, das irgendwie mit Brutforce zu lösen.
Und dann landet man leider auch bei solchen Laufzeiten hier.
Wenn ich jetzt so ein Problem habe, das in NP ist,
dann kann ich das mit einem deterministischen Algorithmus zwar entscheiden,
aber ich brauche sehr lange.
Ich brauche hier zwei Hoch-O von NHK.
Also Polinom
Wird jetzt plötzlich exponent von dieser Zwei-Hochfunktion und die Kernidee dabei ist,
wenn ich vorher bei dem nicht deterministischen Algorithmus diese Ratephase hatte,
wo ich mir alle Lösungen geraten habe und die dann überprüft habe.
Das kann ich halt deterministisch nicht machen, was ich aber machen kann,
ist, ich gehe all diese Stränge, wo ich geraten habe,
die gehe ich nach und nach durch.
Also ich sage nicht, ich rate mir nicht deterministisch,
alle K-Elementeigen Teilmengen von meiner Knotenmenge und gucke,
ob das ein Independent Z ist,
sondern ich sage jetzt,
ich gehe die nach und nach alle durch
Brauche ich leider, weil das ja ziemlich viele sind,
das sind ja schnell exponentiell viele, brauche ich da eben sehr lange.
Das ist so die Idee,
und das kann man dann eben nochmal formal komplett ausführen,
hier diese Idee mit dem Verifikationsalgorithmus, wenn LNNP ist,
dann gibt es so einen Verifikationsalgorithmus in O von NhochK.
Das Zertifikat hat so eine Eingabelänge U von NhochC,
für irgendwelche konstanten K&C. Naja, und dann sagt man jetzt,
na gut, wenn ich das jetzt deterministisch machen will,
dann gehe ich alle möglichen Zertifikate durch.
Wenn ich O von Ende, wenn das Zertifikat die Länge
O von NhochC hat, Und nehmen wir mal an,
ich habe nur zwei Symbole, 0 und 1.
Dann habe ich zwei Hochufen und N hoch 10 Zertifikate.
Naja, und dann sage ich jetzt, okay,
dann gehe ich für jedes dieser Zertifikate,
die gehe ich jetzt halt stupide durch.
Und für jedes davon schmeiße ich mein Ofen in Hochk-Algorithmus an.
Und wenn der irgendwann mal ja sagt, sage ich auch ja.
Und wenn der immer nein sagt, sage ich nein.
Und da bin ich halt irgendwie in zwei Hochufen N hoch C,
mal Ufen N hoch K. Und dann kann man das
noch nach oben abschätzen durch dieses Zwei-O von N hochkamen.
Also anders ausgedrückt, es wird sehr teuer.
Man kann das machen, aber die Laufzeit ist exponentiell
Kurze Anmerkung dazu auf so einer blauen Folie, was die eigentliche da,
hier ist an einigen Stellen, ist ja so ein bisschen das salopp gehalten,
da steht so ein bisschen drauf, wie man die einzelnen Schritte genau nachvollziehen kann.
Mir reicht es jetzt aber, wenn ihr mitnehmt,
ich kann Probleme in NPD-terministisch lösen, die Laufzeit wird aber exponentiell,
wenn ihr das mitnehmt, alles super.
Das könnt ihr euch zu Hause nochmal angucken, wenn ihr mögt. Fragen wir es dahin,
also wichtige Punkte heute, wie entwerfe ich einen NP-Algorithmus,
ein Algorithmus, der zeigt, dass das Problem in den Fee ist,
dann Genau, das ist das eine Wichtige,
das zweite Wichtige, ich kann Probleme in NP2D-terministisch lösen,
aber wenn ich das ganz generell halte,
wird es exponentielle Laufzeit und das ist teuer.
Genau, das sind die zwei wichtigen Punkte, die ihr heute mitnehmen solltet.
Das mit Verifikationsalgruppen ist auch nett, aber die zwei solltet ihr mitnehmen.
Und das, was jetzt noch kommt, ja, das,
was jetzt noch kommt mit Reduktion, das solltet ihr auch noch mitnehmen.
Fangen wir es dahin, also NP und ich kann es explizit lösen.
Dann brauchen wir jetzt dieses Hilfsmittel von Reduktion,
was wir jetzt nämlich machen wollen, ist,
haben wir ja vorhin schon diskutiert,
Wenn ich diese mir anfangs hier betrachteten Probleme angucke,
dann sind die alle in nicht deterministischer Zeit schnell lösbar.
Aber blöderweise nicht deterministisch. Die besten bekannten, deterministischen,
die tun im Grunde genommen das, was auf der vorherigen Folie gemacht wurde,
nämlich alle Möglichkeiten durchgehen und gucken, ob das klappt.
Und alle Möglichkeiten durchgehen, das ist immer exponentielle Laufzeit,
das ist blöd. Und jetzt fragt man sich, klar,
man will die Probleme ja trotzdem lösen und dann fragt man sich,
geht es wirklich nicht schneller.
Also fällt mir nur gerade nichts ein, keine Ahnung,
hier Erfüllbarkeitsprobleme der Aussagenlogoik oder das Independent Z-Problem,
fällt mir nur gerade nichts ein oder geht es wirklich
nicht schneller
Achso, die Fragestellung, die man in der Algorithmik ständig
rauf und runter hat, irgendein Problem habe ich gelöst,
geht es noch schneller oder geht es tatsächlich nicht mehr schneller?
Und dass diese, insbesondere diese vier Probleme hier,
die alle in NP sind, für die vermutet man tatsächlich,
dass es nicht schneller geht.
Das Problem ist nur, wie kommt man dahin? Falls nicht,
würden wir gerne, genau, falls das nicht geht,
also falls sich tatsächlich das nicht schneller machen kann,
als mit exponentieller Laufzeit, dann möchte ich zumindest mal zeigen können,
es gibt kein Problem im Jahrzeitalgorithmus dafür.
Also es gibt kein K, sodass sich das
in OfenN hochkarr lösen kann
Kriegen wir irgendwie nicht hin. Und jetzt gibt es aber einen anderen Ansatz,
den wir vorhin schon einmal kurz angesprochen haben,
was wir nämlich jetzt machen wollen, ist,
wir kriegen ein neues Problem, probieren Algorithmus zu entwickeln,
merken, wir kriegen es hin, Algorithmus in NT zu entwickeln,
aber irgendwie keinen, um das NP zu machen.
Und dann wollen wir jetzt zeigen,
dass dieses Problem eine ganz bestimmte Eigenschaft hat,
sodass wir dann sagen können, wenn das Problem doch in P lösbar ist,
dann passieren sehr unwahrscheinliche Dinge, nämlich dieses vorhin angesprochene,
dass sie plötzlich ganz viele Sachen sehr schnell lösen kann.
Was wir dazu brauchen, ist, dass wir formal ausdrücken können,
dass ein Problem zu den schwierigsten Problemen in seiner Komplexitätsklasse gehört.
Wir möchten nämlich ausdrücken können, dass diese eben genannten Probleme,
so Set und Independence Set und sowas,
dass die zu den schwierigsten Problemen in NP gehören.
Das wollen wir ausdrücken können. Und dazu brauchen wir Reduktion. Wie wir das hier machen,
mit schwierigsten Problemen in der Klasse, das machen wir nächstes Mal,
das wird dann direkt zur NP Vollständigkeit führen und damit werden wir dann sagen können,
wenn ein Problem NP vollständig ist, dann gibt es sehr Wahrscheinlichkeit,
kein Pudelmehlzeitalgorithmus dafür.
Das machen wir nächstes Mal und heute machen wir noch den
ganz wichtigen Begriff der Reduktion, den wir dazu brauchen.
Eine Reduktion ist im Grunde genommen auch ein Algorithmus
Und zwar einer, der eine Probleminstanz in eine andere umwandelt. Mit bestimmten Eigenschaften. Formal,
wie folgt, wenn ich zwei Sprachen habe, L1L2,
und stellt euch mal immer schon mal vor,
statt Sprachen Probleme, dass ihr sagt, naja,
vielleicht habe ich jetzt sowas wie das Erfüllbarkeitsproblem der Aussagenlogik auf der einen Seite und das Independent-Z-Problem auf der anderen Seite,
wenn ihr das mal so kurz mittragt,
vielleicht hilft das ein bisschen.
Also dann habe ich die zwei Sprachen hier und dann sagen wir,
dass sich L1 auf L2 in polemialer Zeit reduzieren kann,
wenn es so eine Funktion F gibt und die soll in Polymialzeit berechenbar sein.
Deswegen hier das in polymialer Zeit. Und die soll jetzt
noch mit eine bestimmte Eigenschaft haben, damit wir von der Reduktion sprechen können.
Und zwar soll sie die Eigenschaft haben, dass X in L1 ist,
genau dann, wenn F von X in L2 ist.
Und das soll für alle X gelten. Sprich,
das ist ein Algorithmus, also es ist eine Touring-berechenbare Funktion,
ein Algorithmus mit der Eigenschaft, der Algorithmus ist,
arbeitet in Polynalzeit, okay.
Und der nimmt so eine Probleminstanz von L1,
transformiert die in eine Probleminstanz F von X von L2
Und zwar so, dass wenn x eine Jahrinstanz ist,
wenn x eine erfüllbare Formel ist,
dann ist F von x ein Graf der tatsächlichen Independence Head der Größe K hat.
Und wenn x eine unerfüllbare Formel ist,
dann ist F von x ein Graf, der keine independencierte Größe K hat.
Das will man da erreichen. Das ist so ähnlich,
wie wenn ihr irgendwie Dinge konvertiert,
aber bestimmte Eigenschaften erhalten wollt oder so.
Und das Ganze soll in polymailer Zeit passieren.
Schreiben wir dann so mit diesem kleiner gleich,
warum man kleiner gleich schreibt,
sehen wir später noch
Hängt damit zusammen, dass von der Schwierigkeit bezüglich der Laufzeit betrachtet,
wird L2 nicht schwieriger sein als L1. Deswegen dieses Kleinergleich.
Also L1 ist im Grunde genommen einfacher zu lösen,
schneller zu lösen als L2. Es wird als Reduktionsfunktion bezeichnet,
ein Algorithmus, der F berechnet als Reduktionsalgorithmus.
Wir sehen auch gleich drei Beispiele dafür. Aber Idee,
ich habe einen Algorithmus, der transformiert Instanzen eines Problems in
Instanzen eines anderen Problems. Und zwar so,
dass wenn das eine Jahr Instanz ist,
ist das andere eine Jahr Instanz,
wenn das eine 9-Instanz ist,
das andere in einen Instanz
Und er macht das Ganze im Polymnalzeit. Andere Symbole noch hier,
so ein, auch kleiner gleich unten mit Poll,
ne, für Polynom,
hier das P auch schon für Polynom oder sowas wie PM,
M dann für Many One, weil hier oben ja nur verlangt wird,
dass sich ein X aus L1 auf dem F&X aus L2 abbilde.
Aber nicht, dass das irgendwie injektiv sein müsste oder sujektiv oder irgendwie sowas.
Ich kann mehrere Jahrinstanzen der Einsprache auf mehrere Jahrinstanzen der anderen Sprache
abbilden, das ist alles okay. Kurz noch allgemeiner,
wenn man hier nicht mit 0-1 arbeiten will,
dann kann man hier auch mit Sigma Stern und Gamma
Stern,
also mit unterschiedlichen Alphabeten arbeiten
Hat aber sonst genau die gleichen Sachen. Also wenn ihr
da für Siegmar Sterne und Gamma Sterne 0-1 hinschreibt,
also die Menge, die 0-1 enthält,
dann habt ihr genau das Gleiche wie das,
was wir da eben stehen hatten.
Und dann auch hier Reduktionen müssen nicht in Polymialzeit gemacht werden.
Hier wurde das ja so definiert, dass man gesagt hat
, das soll im Polymialer Zeit passieren.
Da kann man auch anders machen, dann kann man
diese Vollständigkeitsgeschichten später für andere Klassen einführen
Und da steht es nochmal, da kann man auch so P vollständige Probleme einführen.
Brauchen wir aber erstmal nicht. Das hier oben nur mit
dem Sigmar und Gamma, damit die Folgenabbildung Sinn macht.
Da steht nämlich oben Sigmar, Stern und Gamma Stern,
statt 0-1 Stern. Und zwar soll das illustrieren,
hier auf der linken Seite habt ihr Sigmar Stern,
also das Alphabet, wo das eine Problem drin ist,
dann habt ihr hier die Menge A,
also das ist euer Problem A,
und die grünen Blobbel sind also die Jahrinstanzen und die roten Blobbel sind die Meininstanzen.
Und auf der anderen Seite habt ihr das Alphabet Gamma Stern
und da drin ist eben die Sprache B,
und ihr wollt jetzt halt A auf B reduzieren.
Dann müsst ihr halt Ja-Instanzen, also die grünen Blobbel auf
die Jahrinstanzen auf der anderen Seite abbilden und die Nein-Instanzen,
die Routen auf die Nein-Instanzen auf der anderen Seite
Also Ja, Instanzen auf Ja, Instanzen. Nein,
Instanzen auf Nein-Instanzen. Und das Wichtige ist eben, dass ihr dann,
also deswegen macht man das überhaupt, deswegen macht man diese Reduktion,
dass ihr jetzt die gleiche Antwort auf diese beiden Fragen kriegt.
Das führt dazu, dass, nehmen wir mal an,
ihr habt keinen Algorithmus oder euch fällt keiner ein,
mit dem ihr dieses Problem A lösen könnt.
Ihr habt aber vielleicht einen Algorithmus, mit dem ihr
das Problem B lösen könnt. Dann sagt ihr,
na gut, statt dass ich jetzt weiter versuche,
das Problem A zu lösen, überlege ich mir,
wie kann ich so eine Reduktion von A nach B machen?
Und dann habt ihr auf diese Art und Weise plötzlich doch A gelöst,
indem ihr Probleminstanz von A auf B reduziert.
Also ihr kriegt jetzt hier irgendwie eine Instanz,
irgendein Kügelchen aus dieser linken Seite, dann wendet ihr euren Reduktionsalgorithmus an.
Der bringt euch dann hier auf die rechte Seite und für B habt ihr einen Algorithmus.
Den werft ihr an und wenn der Nein sagt, wisst ihr,
das Vorherige hier auf der linken Seite muss auch Nein gewesen sein.
Und wenn der Ja sagt, wisst ihr,
das Vorherige auf der linken Seite muss auch Ja gewesen sein
und könnt ihr also entsprechend antworten.
Deswegen macht man das mit Reduktion. Und da nochmal
viele Jahren pflanzen können auf einige Jahren Stanz abgebildet werden oder
auch viele in eigenen Instanzen auf einen eigenen Stanz
Okay. Genau. Da nochmal die Anmerkung. Reduktion machen lustigerweise auch immer irgendwie Probleme,
obwohl das im Kern auch einfach nur ein Algorithmus ist.
Ja, das ist ein Algorithmus, der jetzt nicht so
wie sonst irgendwie rechnet und dann ja oder nein sagt,
sondern der rechnet und transformiert eine Eingabeinstanz in eine andere.
Beim Algorithmus, der am Ende eins oder null ausgibt,
also für ja oder nein, da könnte man auch sagen,
dass der im Grunde genommen die Eingabeinstanz umwandelt in eine Eins,
wenn es eine Jahnstanz ist und umwandelt in eine Null,
wenn es eine Nein-instanz ist.
Das ist auch eine Reduktion.
Das ist aber eine sehr komische Sichtweise dann da drauf
Hier, was man mitnehmen sollte,
ist so eine Reduktion, ist im Kern ein Algorithmus.
Probleminstanzen, eines Problems in Probleminstanzen, eines anderen Problems umwandeln.
Beispiel, wir kennen tatsächlich schon relativ viele aus dem Logikbereich und auch aus anderen Bereichen.
Im Grunde genommen immer, wenn wir irgendein Problem durch etwas gelöst,
durch vorheriges Wissen gelöst haben. Beispiel dafür,
ganz einfach, wenn wir die Menge nehmen, taut,
da sind jetzt all die Aussagen logischen Formeln drin,
die Tautologien sind und wir nehmen Cont,
da sind all die Dinger drin,
die Kontraditionen sind
Da wissen wir schon, wenn ich irgendwie Tautologie,
wenn ich F habe und ich will gucken,
ob F eine Tautologie ist, dann kann ich auch gucken,
ob nicht Effen eine Kontradition ist.
Und genau das ist eine Reduktion. Was ich sage,
nehmen wir mal an, ich habe keinen Tautologie-Checker, also kein Programm,
in das ich eine Formel reintun kann und er sagt mir,
ja, das ist eine Tautologie, aber vielleicht habe ich einen Kontradiktionsprüfer.
Einen, wo ich eine Formel reintun kann und er kann
mir sagen, ja, die Formel ist eine Kontradiktion.
Tatsächlich haben wir das auch genau so, weil wir haben
hierfür für Kontradiktionen, da haben wir dieses Resolutionsverfahren kennengelernt.
Und das Resolutionsverfahren tut genau das,
ich gebe da eine Formel rein und es sagt mir,
ob das unerfüllbar ist oder nicht.
Er prüft aber nicht auf Tautologie, der prüft auf Unerfüllbarkeit.
Und wenn ich jetzt aber trotzdem auf Tautologie testen will,
dann muss ich
eine Reduktion angeben
Und wenn ich das jetzt kurz formal machen will,
dann will ich jetzt taut in Polymialzeit auf Kont reduzieren.
Und er muss sich erstens die Reduktion angeben. Zweitens zeigen, dass die korrekt ist.
Und drittens zeigen, dass die Polymialzeit abläuft. Also muss ich,
um die Reduktion anzugeben, muss ich aus einer Instanz von Tauten,
Instanz von Kont machen, eine Instanz von Taut ist,
irgendeine Formel, die darauf geprüft werden soll,
ob sie eine Tautogie ist.
Reduktion ist einfach, zu F wird einfach diese Formel Nicht-F
konstruiert. Kennen wir schon. Ist nur, damit ihr
das mal seht. Insbesondere bei dieser Reduktion,
es wird nicht vorher ausgerechnet, ob Eff eine Tautologie ist
oder nicht
Es wird nur damit gearbeitet, ich kriege eine Formel und die
wandle ich irgendwie um. Und das muss ich so machen,
dass, wenn ich jetzt so wie hier,
taut auf Conte reduzieren will, das muss ich so machen,
dass wenn F eine Tautologie ist,
dann ist gehe jetzt eine Kontradition.
Und wenn F keine Tautologie ist, dann ist gehe jetzt keine Kontradition.
So muss ich die Reduktion machen. Aber ich darf nicht damit arbeiten,
dass ich schon wüsste, dass F eine Tautologie ist.
Ich kriege ja nur irgendeine Formel,
von der ich eben wissen will, Tautologie oder nicht.
Und dann will ich das halt so reduzieren,
dass ich aus der Antwort auf die konstruierte Formel Ges
eine Kontradition prüfen kann,
dass F
eine Tautologie ist
Also das hier ist erstmal nur, die Reduktion ist einfach,
zu F wird G, vielleicht nicht F konstruiert,
das ist die Angabe des Reduktionsalgorithmuses.
Was mir jetzt zeigen muss, ist, dass der korrekt ist,
das sind die ersten beiden Punkte hier. Das war das,
wo vorhin gesagt wurde, X ist in L1 genau dann,
wenn Aphonix in L2 ist. Also ich muss zeigen,
wenn F eine Tautologie ist, dann ist G eine Kontraduktion,
wenn G eine Kontraduktion ist, dann ist Effnet Autologie.
Dann weiß ich, der Algorithmus ist schon mal korrekt,
dann habe ich den Algorithmus angegeben und habe gezeigt,
dass er korrekt ist.
Und dann muss ich noch zeigen,
die Reduktion geht auch in Podinialzeit
Bei dem Beispiel haben wir schon hinreichend diskutiert.
Da ist das relativ klar. Da sagt man,
naja gut, der erste Punkt ist erfüllt,
denn wenn Effen eine Tautologie ist, dann ist nicht F eine Kontradiktion.
Kann man beliebig tief jetzt einsteigen, aber das haben wir,
glaube ich, hinreichend schon im Außerlogischen Teil diskutiert.
Dann zeigt man das Gleiche hier nochmal, das ist aber die Argumentation ja genauso.
Und dann muss man noch argumentieren, dass die Reduktion in Polinialzeit geht.
Und da sagt man dann, naja, wenn ich zu F,
wenn ich davor noch eine Negation schreibe,
das wird wohl relativ schnell gehen.
Brauche ich einen Schritt für. Und dann bin ich damit
fertig. Also ganz einfaches Beispiel. Zweites auch aus
dem Ding
Ja. Achso, ob es genau den,
das hatte ich ja vorhin erzählt, der Sinn bei den ganzen Reduktionen ist,
dass wir jetzt Probleme durch Algorithmen für andere Probleme lösen können.
Wenn ich Formeln auf Portugie prüfen möchte,
dann kann ich sie jetzt statt das zu tun umwandeln mit
dieser Reduktion und die dann erhaltende Formel auf Unterfüllbarkeit testen.
Und insbesondere eben, wenn ich ein Unerfüllbarkeitstest habe,
aber aber keinen Tortologietester, dann kann ich den jetzt benutzen.
Bei dem Beispiel würde man jetzt sagen, ja,
ist doch klar, die Reduktion ist ja total einfach,
aber das soll euch nur einmal darauf schulen,
ihr habt vielleicht kein Programm, das das hier tut,
auf Tautologien testet, nur einen, der auf Unerfüllbarkeit testet.
Und das könnt ihr jetzt aber benutzen. Und in komplexeren Settings,
wenn ihr jetzt irgendwie, was wir gleich machen werden,
Unerfüllbarkeit auf dieses Independent Z-Problem abbildet oder auf Clique oder so,
da ist es dann gar nicht mehr so unbedingt klar.
Dann kann ich nämlich plötzlich statt ein Erfüllbarkeitstest da anzuschmeißen,
kann ich das Clique-Problem lösen und kann dann sagen,
oh, die Formel ist unerfüllbar oder nicht.
Das werden wir gleich nochmal sehen. Vorher noch ein
einfacheres Beispiel. Vollgabarkeit und Kontradition. Also bei Vollgabarkeit,
ich kriege ein Tupel von Formeln und es wird geguckt,
hier folgt COS-Fee, Aussagen logisch,
und konnte Redaktionen wieder,
die Formel ist eine Kontradition
Haben wir auch schon mehrfach gemacht,
aber damit ihr ein Gefühl dafür kriegt, nochmal,
wenn ich das jetzt machen will,
wenn ich jetzt Folgebarkeit auf Kontradiktion abbilden will,
dann muss ich so eine Eingabeinstanz von Folgebarkeit,
die muss ich abbilden auf so eine einzelne Formel,
die ich auf Kontradiktion testen will.
Und kennen wir ja schon, das mache ich,
indem ich fiepsy abbilde auf Vieh und nicht psy.
Und dann muss ich wieder zeigen,
wenn die beiden Formeln hier in Volk sind,
also wenn COS-Veh folgt, dann ist das hier eine Kontradiktion.
Und wenn das eine Kontradiktion ist, dann gilt diese Folgebarkeit.
Haben wir ja im Aussagen logischen Teil auch gemacht,
aber für die Korrektheit müsste man
das jetzt machen
Und dann müsste man zeigen, dass die Reduktion in Polymialzeit geht. Und auch das,
wenn ich Fee und Pee als Eingabe kriege, naja,
dann nehme ich mir die erste Formel, lasse sie,
wie sie ist, nehme mir die zweite,
negiere sie und machen und dazwischen.
Das kriege ich auch in Polymialzeit hin. Also geht die Reduktion wieder in Polymialzeit.
Und erstens und zweitens wissen wir mit dem Aussagen logischen Teil.
Aber auch da wichtig, ich arbeite nicht damit,
ob dieses Feep-See, ob das überhaupt, diese Feuerbarkeit überhaupt gilt.
Also zumindest noch nicht, wenn ich die Reduktion angebe.
Bei dieser Reduktion hier unten, bei ersten und zweitens,
da mache ich das nachher. Da arbeite ich dann damit,
da steht es ja auch im Wendteil,
wenn die Folgebarkeit gilt, dann ist das eine Kontradition.
Da arbeite ich damit, dass die Folgebarkeit gilt.
Aber hier bei der Reduktion, Da mache ich nicht so was wie,
ich gucke mal, ob die Folgerbarkeit gilt und falls ja,
bilde ich da und dahin ab.
Das mache ich nicht. Ich mache vielleicht so Sachen wie,
ich gucke mir die Länge der Formel an und arbeite damit oder sowas.
Aber ich rechne mir nicht das aus,
was ich hier bei dem Problem da testen will.
Die Idee bei den ganzen Reduktionen ist ja gerade,
das kann ich vielleicht auch gar nicht.
Also noch nicht. Klar, soweit? Dann kommt gleich
noch das kompliziertere Beispiel. Klar, von der Grundidee,
bei den Reduktionen. Ich nehme das mal so als
zustimmendes Nicken
Dann gucken wir uns nochmal ein komplizierteres Beispiel an, wo man sehen kann,
dass bei den Reduktionen üblicherweise doch ganz schön viel Arbeit nötig ist.
Dazu, damit man das gut machen kann, gucken wir uns,
wir hatten ja diese Sattgeschichte, wo halt die erfüllbaren Formeln drin waren.
Und was wir jetzt definieren wollen, ist drei CNF,
das ist im Grunde genommen auch,
das sind die erfüllbaren Formeln der Aussagenlogik,
aber die sollen noch eine bestimmte Struktur haben,
die sollen nämlich in konjunktiver Normalform vorliegen okay, also sowas wie,
ganz viele Literale, die mit oder verknüpft sind,
eine Klausel und ganz viele Literale,
die mit oder verknüpft sind und ganz viele Literale,
die mit oder verknüpft sind.
Das ist konjunktive Normalform und jetzt zusätzlich noch in der Klausel
sollen genau drei verschiedene Literale sein.
Also ihr habt sowas wie A oder B oder C und
nicht A oder Nicht-B oder D und Nicht-A oder E oder C,
immer drei Stücke in der Klausel mit oder verknüpft und die Dinger dann mit unverknüpft.
Das ist drei CNF für drei konjunktive Normalformen so.
Und wir gucken uns das Clicke-Problem an, da kriegen wir als Eingabe,
also und hier ist die Eingabemeister ist natürlich eine Formel,
ich kriege eine Formel und ich prüfe,
ob die erfüllbar ist oder nicht
Bei Clique kriege ich einen Grafen G und eine Zahl K und ich will gucken,
ob es in GK-Knoten gibt, die alle paarweise miteinander verbunden sind.
Also im Grunde genommen, so ähnlich wie in Dependence Set,
nur dass ich jetzt nicht gucke, ob es K-Knoten gibt,
die alle nicht miteinander verbunden sind, sondern ich gucke,
gibt es K-Knoten, die alle miteinander verbunden sind.
Und was wir machen wollen, ist 3CNF Aufklicke reduzieren. Da merkt man schon,
dass es ein ganz anderes Kaliber als die beiden eben behandelten Probleme,
weil ich hier, also unter anderem weil,
aber eine Sache, die man schnell sieht, ist,
ich wechsle hier quasi das Gebiet.
Also auf der linken Seite bin ich irgendwie in so einem Logik-Setting,
auf der rechten Seite bin ich irgendwie in
so einem Graf-Setting
Und was ich jetzt hinkriegen muss, ist, ich muss eine Reduktion angeben,
ich kriege eine Formel als Eingabe, ich konvertiere die irgendwie in Graphen.
Und das muss ich so machen, dass ich bei dem Graphen dann sagen kann,
also bei dieser, ich konstruiere mir hier irgendwie eine Probleminstanz,
also so ein Tupel G und K. Und das muss ich so machen,
dass ich dann einen Graphen rauskriege und eine Zahl K,
sodass gesagt wird, wenn dieser Graph eine K-Klicke enthält,
dann ist die ursprüngliche Formel erfüllbar,
wenn der Graph keine K-Klick enthält, ist Jona erfüllbar.
Und was ich halt nicht machen kann,
ist, ich gucke mal,
ob die Formel erfüllbar ist und falls sie das ist,
dann bilde ich das auf dem Dreieck ab und falls sie das nicht ist,
bilde ich das irgendwie auf drei Knoten ab,
die nicht miteinander verbunden sind.
Das kann ich nicht machen, weil ich hier ja
Nur putinuiell viel Zeit für die Reduktion habe.
Und um auszurechnen, ob die Formella Filber ist oder nicht,
brauche ich aber Wahrheitstafel machen oder so, dann brauche ich irgendwie exponentiell viel Zeit.
Kann ich also nicht machen. Das ist der Grund,
warum ich im Allgemeinen nicht vorher ausrechnen kann,
ob irgendwas ein Jahr oder eine Nein-Instanz ist,
sondern unabhängig davon einfach nur mit der Formel arbeite.
Ich kriege die Formel und bastel mir einen Grafen.
Ja. Oh, das wird viel Text.
Danach kommt ein Bild
Was man üblicherweise macht, wenn man sowas machen will,
man gibt erstmal eine Sachen, die man irgendwie benutzen will,
Namen, Namen sind immer gut, damit kann man arbeiten.
Wenn ich drei CNF, wenn ich eine Instanz von 13F kriege,
dann ist das irgendwie eine Formel, nennen wir die Vieh.
Und da sie ein KNF ist,
sind das ganz viele Klauseln, die mit unverknüpft sind.
Ich nenne die Klauseln C1 bis CK. Dann sage ich,
weil ich auch an die Literale ran will,
die Literale der Errtenklausel,
die nenne ich jetzt L1L2L3 und oben das hochgestellte R
für die Klausel
Jetzt habe ich also all meinen Klauselnnamen gegeben und all meinen literalen Namen gegeben.
Und jetzt kann ich anfangen, das nennt man jetzt Gadget-Konstruktion,
jetzt kann ich anfangen, mir zu überlegen,
dass ich für alle Literale und alle Klauseln irgendwie mir Sachen im Graphen konstruiere,
mit denen ich es dann hinkriege,
dass ich in dem Graphen bestimmte Knoten wählen muss für eine Clique,
um bestimmte Elemente in den Klauseln wahrzumachen.
Und die Idee ist, dass man ja so Sachen machen muss,
wenn ich das hier alles wahrmachen muss,
also C1 bis CK, eine erfüllende Belegung für die Formel,
die müsste jede Klausel wahrmachen.
C1 bis CK, um jede Klausel wahrzumachen,
müsste sie aber aus jedem Literal,
müsste sie aus jeder Klausel mindestens ein Literal warm machen
Und das kann man versuchen auszunutzen,
indem man quasi für jedes dieser Literale irgendwie Knoten nimmt und jetzt die Knoten,
die zu einzelnen Klauseln gehören, so miteinander verbindet,
dass ich im Graphen genau die Elemente mir auswählen muss für eine Clique,
sodass in jeder Klausel genau ein Literal wahrgemacht wird.
Also so grob die Idee, auf die das gleiche hinausläuft.
Gucken wir jetzt das mal an. Jetzt habe ich so
eine Klausel hier und für diese Klausel nehme ich mir jetzt so ein Triebel von Knoten.
Also mache ich erstmal sozusagen gar nichts anderes als zu sagen,
Für jedes Literal, das in der Klausel auftritt, nehme ich mir einen Knoten.
Okay, jetzt habe ich genauso viele Knoten,
wie es in der Formel 4 Literale gibt.
Ich kopiere die aber schon mal der Übersichtlichkeit halber so,
dass ich sage, zu so einer Klausel nehme ich mir genau drei Knoten.
Wenn ich jetzt also in meiner Formel klausel, Klausel,
Klausel, Klausel habe, dann mache ich mir jetzt immer so Dreiergrüppchen von Knoten.
Jetzt habe ich alle meine Knoten. Und jetzt gucke ich
mir noch an, wie mache ich die Kanten? Und die Kanten mache ich so,
dass ich zwei Knoten genau dann miteinander verbinde,
wenn sie zu unterschiedlich, also wenn es ungleich Tee ist,
sprich, wenn sie zu unterschiedlichen Klauseln gehören, also drei Knoten,
die zu einer Klausel gehören, die verbinde ich nicht miteinander.
Erstmal ein bisschen zu unterschiedlichen Klauseln gehören. Und wenn die zugehörigen Literalen nicht zueinander komplementär sind,
Sprich, wenn das nicht so was ist wie X,
nicht X. Die Idee ist,
wenn ich die beiden auswählen würde für eine Clique,
dann wäre die Behauptung auf der anderen Seite,
ich muss X und nicht X warm machen.
Das geht aber nicht, kann ich beides wahrmachen.
Also ich verbinde nur Sachen miteinander, die ich auch gleichzeitig wahrmachen kann. Und die Idee ist dann,
wenn es eine Clique gibt, eine Clique, eine K-Klicke,
dann K-Klicke, wenn es eine K-Klicke gleich gibt,
dann werde ich aus jedem, jeweils diesen drei Knoten,
die zu einer Klause gehören,
werde ich dann eingewählt haben müssen und die werde ich
alle gleichzeitig wahrmachen können
Und als Wirt K nehmen wir gerade die Anzahl der Klauseln
hier, also das K und das Chaos gleich.
Und dann haben wir eine Reduktion angegeben. Genau,
jetzt kommt das Beispiel, dann sieht man das ein bisschen besser.
Aber nochmal hier zu jeder Klausel C1 nimmt man für die
drei Literale, die da drin auftreten, drei Knoten.
Das kann man gut machen. Und dann verbinden nicht die genau dann mit einer Kante,
wenn sie zu unterschiedlichen Klauseln gehören und nicht zueinander komplementär sind.
Beispiel, wenn ich die KNF hier habe,
das ist jetzt ein einfaches Beispiel, um das mal zu illustrieren.
Wenn ich die KNF habe,
Dann habe ich hier drei Literale in der Klausel,
da drei Literale in der Klausel, da drei Literale in der Klausel.
Das heißt, ich mache mir drei solche Blöcke jeweils bestehend aus drei Knoten.
Und dann mache ich mir für die drei Knoten,
die zu diesen drei Literalen gehören, nicht XYZ,
die drei Knoten verbinde ich nicht miteinander,
weil die ja zu der gleichen Klausel gehören.
Aber ich verbinde zum Beispiel,
dass Nicht-X aus der ersten Klausel mit dem Nicht-Y aus der zweiten,
weil die nicht zueinander komplementär sind, die könnte ich beide gleichzeitig wahrmachen.
Ich verbinde aber nicht, dass Nicht-X mit dem X,
weil die zueinander komplementär sind.
Wie sieht das dann aus
Nicht XYZ, das sind die hier. X,
Nicht Y, Nicht-Z, das sind die drei.
Und XYZ, das sind die drei hier rechts. Und wenn ihr dann die Knoten durchgeht,
die kannten euch anguckt, dann seht ihr die drei Knoten,
die zueinander gehören, in Anführungsstrichen, also die drei auf der linken Seite,
die drei auf der rechten Seite und die drei,
die oben positioniert sind,
die sind alle nicht miteinander verbunden untereinander.
Aber mit den anderen, mit den Knoten der anderen Gruppen sind sie verbunden,
und zwar genau dann, wenn das nicht das komplementäre Literal ist.
Zum Beispiel, dass nicht X hier auf der linken Seite,
ist, nicht mit den Y und Z auf der linken Seite verbunden,
weil die aus der gleichen Klausel kommen.
Es ist aber hier oben mit dem Nicht-Y verbunden und hiermit
dem Nicht-Z. Nicht aber mit dem X, weil X und Nicht-X ja zueinander komplementär sind.
Und jetzt sieht man schon, bei den anderen Kunden genauso.
Und was man jetzt sehen kann, ist,
wenn ich hier eine Dreierklicke finden will in dem Graphen,
wenn es überhaupt eine Dreierklicke gibt, dann kann das nur so sein,
dass ich aus jedem Dreierblock hier genau einen Knoten rauswähle.
Wenn ich aus so einem Block mehr als einen Knoten rauswähle,
das geht schon nicht mehr, weil dann ja,
wenn ich hier Z und Y nehme auf der linken Seite,
die sind dann nicht miteinander verbunden.
Das wird keine Klicke. Also eine Dreierklicke kriege ich
nur hin oder nachher allgemein eine K-Klicke.
Wenn ich aus jedem Block genau einen Knoten nehme
Außerdem wird es so sein, dass da nie zwei Literale
miteinander verbunden sind, die zueinander komplementär sind,
weil die Kanten habe ich ja gar nicht dazu genommen.
Also kommt da irgendwas raus, für das ich eine erfüllende Belegung ablesen kann.
Hier kann ich sagen, mach mal Z wahr und mach
mal nicht Y wahr, dann hast du eine erfüllende Belegung.
Was man mit dem X macht, ist egal.
Klappt auch, wenn man sich oben die Formel anguckt,
mit Z wahr, wer das hier war,
mit nicht Y das und mit Z nochmal das.
Und dann bin ich zufrieden. Macht ja auch Sinn,
die Knoten entsprechen gerade den Literalen.
Also wenn ich die alle wahr mache,
dann mache ich die da oben gerade wahr
So, Konstruktion angegeben. Und jetzt muss man wieder argumentieren, dass sie korrekt ist.
Also, wenn die Formel erfüllbar ist, dann gibt es eine K-Clique.
Und wenn die Formel unerfüllbar ist, gibt es keine K-Clique.
Oder auch, wenn ihr Filbers, gibt es eine K-Clique,
wenn es eine K-Clique gibt, ist die Formel erfüllbar.
Das muss man machen. Und man muss zeigen, dass es eine Polymialzeit abläuft.
Erstens, Polymialzeit sieht man schnell ein. Man liest einmal die Formel,
dann kennt man die auftretenden Variablen und Klauseln,
konstruiert genauso viele Knoten, wie man hier wie man vorher
in der Form Literale hatte und das mit den Kanten,
das passt auch.
Ich mache ja maximal hier zwischen jeweils zwei Knoten irgendwie eine Kante,
dann sind das V-Quadrat viele, da passiert also nichts Schlimmes.
Also bleibe ich hier dann irgendwie in O von Viehquadrat oder O von V-Quadrat.
Schwieriger ist die Argumentation, warum das korrekt ist.
Haben wir jetzt ja schon so zweimal so grob andiskutiert.
Zwei Folien müsst ihr noch durchhalten, die und die nächste.
Wir müssen zeigen, dass das wirklich eine Reduktion ist.
Der gegebene Graf, also genau dann eine Clique enthält,
wenn die Formel dafür bei ist.
Angenommen die Formel ist erfüllbar. Dann gibt es
eine Belegung, die in jeder Klausel mindestens ein Literal wahrmacht
Sonnenbelegung nehme ich mir jetzt und halte die fest. Wenn man,
also ich nehme jetzt aus jeder Klausel eins dieser Wahlliterale.
Sprich, ich nehme mir eine Belegung,
halte die fest und dann nehme ich mir aus jeder Klausel,
die muss ja jetzt überall mindestens ein Literal wahrmachen und genau eins nehme ich mir raus.
Und die Behauptung ist dann, dass die zugehörigen Knoten zu
den Triebeln, dass die gerade eine K-Klicke bilden.
Wenn ihr das Beispiel von eben noch in Erinnerung habt,
kann man A, dass das wohl stimmen muss,
wenn man es formal ausführt, ja,
ich habe K-Knoten gewählt, haben wir gerade gemacht,
aber ich muss jetzt noch zeigen,
dass die wirklich alle miteinander verbunden sind
Warum sind sie das? Sind Karknoten, weil es
Karknoten sind? Und wenn ich zwei Knoten nehme,
dann gilt auf jeden Fall eher ungleich S,
weil ich ja die Literale aus verschiedenen Klauseln genommen habe,
also die Knoten auch aus verschiedenen Blöcken sind,
also die gerade miteinander mit einer Kante verbunden sein könnten.
So, die Knoten, die dritte,
die zugehörigen Literale sind nicht komplementär. Warum? Naja,
die Belegung macht die Formel ja wahr und eine Belegung kann beispielsweise
X nur entweder wahr oder falsch machen, aber nicht beides gleichzeitig.
Und dann kann ich in der einen Klausel X warmachen
und in einer anderen Klausel nicht X war.
Also es ist nicht möglich, dass ich mit der beschriebenen Wahl da,
dass ich da zwei Knoten rausnehme, oder zwei Literale,
die zueinander komplementär sind.
Ergo sind die Knoten durch eine Kante verbunden,
also ist das
eine Karklicke
Rückrichtung, wenn ich eine Karklicke habe, dann,
dann muss jeder Knoten aus einem anderen Triple sein,
weil die Knoten in einem Triebbe nicht miteinander verbunden sind.
Und jetzt nimmt man quasi,
also wenn ich jetzt einen Knoten habe,
der aus dem Literal hervorging, das positiv war,
dann setzt sich das jetzt positiv, wenn es negativ war,
setzt sich das negativ und das ist eine erfüllende Belegung.
Also wir können nun dem zu einem Knoten von einer gehörigen Literal
den Wert eins zuweisen ohne dadurch dem Literal und seinem Kompliment den Wert einzuzuweisen,
weil ja zwei Knoten nur miteinander verbunden sind,
wenn die Literale gerade nicht komplementär sind.
Sprich, ich kriege tatsächlich eine Belegung raus.
Unter Umständen habe ich gar nicht alle Aussagensymbole belegt.
Dann mache ich das noch. Dann habe ich eine passende Belegung.
Und dann erfülle ich die. Jede Klausel ist erfüllt,
weil ich aus jedem Triebel genau einknoten gewählt habe.
Und dann ist man fertig. Super. Das ist ein
deutlich komplexeres Beispiel, wo man auch,
wo es deutlich anspruchsvoller ist, überhaupt auf die Konstruktion zu kommen.
Wir machen die nächsten zwei Male,
machen wir auch noch ein paar mehr von den Konstruktionen
Was wir auf jeden Fall nächstes Mal noch machen werden,
also ich lasse den Foliensatz mal so und schnell den online,
den könnt ihr euch die letzten Folie noch angucken,
aber da fangen wir dann nächstes Mal wieder an.
Was wir halt machen wollen nächstes Mal, ist, wir wollen zeigen,
wenn ich so eine Reduktion hier angegeben habe und ich kann zeigen,
dass L2NP ist, dann ist auch L1NP.
Dann habe ich quasi jetzt ein Verfahren, um L1 plötzlich auch schnell zu entscheiden.
Vielleicht konnte ich bisher eins nicht schnell entscheiden,
aber ich kann vielleicht eine Reduktion angeben und wenn mir jetzt was einfällt,
um L2 schnell zu entscheiden, also in dem Beispiel von eben,
wenn ich klicke jetzt schnell lösen kann,
dann kann ich plötzlich auch Erfüllbarkeit schnell lösen,
weil ich dann drei CNF-Erfüllbarkeit schnell lösen,
weil ich dann diese Probleminstanz,
diese Formel in so ein Klickenproblem umwandeln kann,
dann löse ich das Klickenproblem und dann bin ich fertig
Und darauf aufbauen, werden wir nächstes Mal NP Vollständigkeit einführen. Und genau,
das werden wir dann hier mit der Hilfe der Reduktion,
werden wir dann NP Vollständigkeit einführen und uns noch dann mehrere von diesen Reduktionen angucken,
damit ihr dafür ein bisschen besseres Gefühl kriegt.
Ja, genau, das machen wir
nächste Woche noch und dann sind wir auch durch.
Also nächste Woche machen wir noch ein P-Vollständigkeit und dann sind wir fertig.
Und auf dem aktuellen Aufgabenzettel solltet ihr genau die Sachen machen,
die wir heute gemacht haben, für zwei Probleme in NP-Algorithmus entwickeln,
einmal eine Abschlusseigenschaft zeigen und drei Reduktionen, glaube ich, angeben.
Eine etwas einfachere und zwei, wo man ein bisschen
basteln muss
Fragen? Eins, zwei, drei, vier.
Dann viel Spaß in den Übungsgruppen und
wir sehen uns
nächste Woche