Willkommen zur A&D-Vorlesung. Bevor es losgeht,
wir haben ein Termin festgelegt für eine Klausurvorbereitungs-Tutorium.
Das wird stattfinden am 6. Februar 9.15 Uhr bis,
also den Hörsaal habe ich bis maximal 12 Uhr.
Ich wüsste nicht bis 12 Uhr machen,
wir gucken mal, wie viel Zeit wir brauchen.
Raum wäre Hörsaal C am Martin Luther Kingplatz,
also in der Chemie. Das habe ich gerade erfahren,
dass der Termin insofern ein klein bisschen ungünstig ist,
weil einige zu dem Zeitpunkt
eine Klausur schreiben
Und ich würde jetzt versuchen, für nachmittags noch
einen Raum zu kriegen, als Alternative zu dem Termin.
Ich hoffe, dass nicht nachmittags irgendwelche anderen eine Klausur schreiben von ihnen.
Wenn ich es schaffe, das ist momentan ein bisschen schwierig
oder es ist in dieser Zeitspanne ein bisschen schwierig,
weil dann so viele Klausuren stattfinden schon und dann sind die großen Hörserien auch immer belegt.
Also insofern weiß ich das noch nicht. Wenn ich das hinkriege,
dann würde ich das dann im gleichen Tag am Nachmittag dann gegebenenfalls machen.
Dann verschiebe ich das nochmal, dann kriegen sie nochmal eine E-Mail.
Zu dem Tutorium, das Ganze wird so ablaufen,
ich werde ihn irgendwann nächste Woche wahrscheinlich mal Musteraufgaben geben,
die so in der Klausur vorkommen könnten.
Es sind meistens Aufgaben von der alten Klausur und in
dem Tutorium werden wir die der Reihe nach durchgehen,
werden das so ein bisschen besprechen.
Sie können Fragen stellen, ich versuche das dann nochmal zu
erklären und begehen die Sachen dann ja so gemeinsam durch.
Sie können auch Fragen zu anderen Sachen stellen,
die ihnen vielleicht jetzt noch in den Sinn kommen,
wenn sie das Ganze vorbereiten.
Ich möchte Sie nur darauf hinweisen,
interpretieren Sie dieses Datum nicht,
als Ihr persönliches Startdatum,
um sich auf die Klausur vorzubereiten
Also nach dem Motto, ich gucke mal,
was am 6.2. passiert und danach kann ich dann ja lernen.
Also wenn sie davon, wenn sie was mitnehmen wollen,
dann sollten sie schon einigermaßen vorbereitet kommen. Ja,
weil sonst haben sie einfach keine konkreten Fragen und sonst verstehen sie vielleicht
einen Punkt gerade dann auch nicht oder eine Aufgabe nicht,
weil sie sich das noch nicht wieder angeschaut haben.
Also kommen sie gut vorbereitet. Schon zu diesem Tutorium.
Gut, das war es dazu und dann können wir,
glaube ich,
weitermachen im Stoff
So, wir gucken uns von jetzt an bis zum Ende der Vorlesung.
Es sind ja auch nicht mehr so viele Veranstaltungen, vier Vorlesungen noch.
Methoden an zum Lösen, schwieriger Probleme. Ja,
und Probleme sind dann schwer per se erstmal für uns,
wenn sie NP schwer sind.
Das heißt, wenn wir davon ausgehen können, dass wir
kein polynomielles Verfahren finden können, um das Problem zu lösen.
Aus meiner Perspektive ist das eines der wichtigsten Kapitel in dieser Veranstaltung,
weil man in der Praxis einfach ganz häufig diese Situation hat,
dass man solche Probleme hat,
die man eben nicht mal eben auf ein kürzeste Wegeproblem abbilden kann,
um das dann eben zu lösen.
Sondern Probleme hat, die schwierig zu lösen sind und wo
man wahrscheinlich einfach kein einfaches polynomielles Verfahren entwickeln kann.
Es ist auf der anderen Seite aber auch so,
dass leider der Korman dieses Gebiet nicht so in den Vordergrund
rückt und wir werden im Laufe dieses Kapitels den Kormen dann langsam verlassen.
Also umso wichtiger, dass sie dann hier gut zuhören.
Es gibt Materialien dabei, wo ich hier noch nicht mal
eine Buchquelle sagen kann. Kann sein, dass es irgendwo steht.
Kann auch sein, dass nicht. Also da müssen sich
dann so ein bisschen mehr auf die Folien konzentrieren.
So, wir werden drei Teilkapitel betrachten
Zunächst mal schauen wir uns Approximationsalgorithmen an. Das finden Sie
auch noch alles im Kommen. Das machen wir heute. Approximationsalgorithmen sind Verfahren,
wo wir das Problem mit einer akzeptablen Laufzeit lösen,
aber es nicht mehr genau lösen, sondern wir werden einen Fehler haben,
also beim Optimierungsproblem werden wir nicht mehr garantieren können,
dass wir das Optimale, die optimale Antwort bekommen.
Aber, und das ist das Besondere an Approximationsverfahren,
wir können einen gewissen Fehler garantieren.
Also wir können eine maximalen Fehler garantieren, also eine Fehlerschranke angeben.
Das ist immer dann akzeptabel, wenn man Probleme hat,
wo man sagt, okay,
wir brauchen eine
sehr gute Lösung
Wir können auch damit leben, dass wir vielleicht nur die Zweitbeste gefunden haben.
Wir haben nur eine gewisse Menge Zeit zur Verfügung,
aber wir wollen wissen, dass wir nicht eine beliebig schlechte Lösung gefunden haben.
Also sie sollte schon einen gewissen Qualitätsansprüchen genügen.
Dafür werden wir heute Beispiele sehen für solche Approximationsalgorithmen.
Wir werden aber auch schon sehen, dass die wieder nicht gerade
einfach sind zu entwickeln. Die sind sehr schwierig zu finden.
Den größeren Teil werden wir uns dann mit exaktem Verfahren auseinandersetzen,
die dann natürlich als logische Konsequenz haben,
dass sie im ungünstigsten Fall exponentielle Laufzeit benötigen,
aber exoponentielle Laufzeit ist nicht immer exponentielle Laufzeit ist nicht immer das Gleiche.
Ja, das kann immer noch ein Riesenunterschied sein,
wie viel Zeit wir physikalisch investieren müssen, um ein Problem zu lösen.
Und am Ende gucken wir uns dann die Welt der Heuristiken an, die riesengroß ist.
Und da kann man dann auch ganz viele Vorlesungen drüber halten,
aber wo es mir eigentlich nur darum geht,
dass sie wissen, dass es diese Ecke eben auch gibt,
um Probleme zu lösen.
Heuristische Verfahren unterscheiden sich von den anderen beiden,
dass sie so tendenziell eine gute Lösung liefern werden.
Ja, sie optimieren, sie geben eine gute Lösung.
Sie bekommen aber
keine Gütegarantie
Da kommt eine Lösung raus und aufgrund der Art und Weise,
wie der Algorithmus rechnet, wissen Sie, er tendiert dazu,
gute Lösungen zu erzeugen, aber Sie können nicht sagen,
wie weit Sie von einem Optimum entfernt sind.
Okay, so, wir beginnen mit den Approximationsalgorithmen.
Hier zunächst nochmal die drei Kategorien und jetzt etwas anders angeordnet,
weil, naja, die exakten Verfahren sind natürlich erstmal das,
was man eigentlich am liebsten hätte.
Man würde am liebsten eine exakte Lösung finden,
wäre also das höchste Ziel,
so ein Verfahren zu erreichen
Das Verfahren, was wir dann hätten, wäre eben ein Algorithmus,
der vermutlich in exponentieller Lauf seid, das Problem P löst.
Vermutlich, weil wir davon ausgehen, dass P ungleich NP ist.
Und das machen wir immer dann, wenn eine exakte Lösung wichtig ist,
wenn die Rechenzeit zur Lösung dieses Problems zur Verfügung steht,
ist ja auch immer ein Aspekt.
Und oder wenn die Eingabegrößen hinreichend klein sind,
das kann nämlich auch sein, zum Beispiel,
dass sie immer nur mit relativ kleinen Eingaben arbeiten,
ein schönes Beispiel ist zum Beispiel,
also wir gucken uns sehr viel so Fragestellungen in der Chemie an.
In der Chemie brauchen wir ganz häufig Subkraftisomophie. Also müssen wir erkennen,
ob ein Graf, ein Teil eines anderen Grafen ist.
Es ist ein endlich schweres Problem. Da könnte man sagen,
oh, da brauchen wir irgendeine Neuristik. Brauchen wir aber nicht,
weil die Subgrafen, die wir da betrachten,
haben häufig nur sechs, zehn, 15 Atome, also 15 Knoten.
Und dann ist das so klein, dass sie das immer noch,
obwohl der Algorithmus exponente Laufzeit hat im Okalkül,
könnte ich das immer noch in der Regel zehn,
20, 50 Millisekunden lösen.
Das heißt, wenn die Eingaben klein sind, können wir natürlich
exakte Verfahren nehmen. Ja, hier mit der Rechenkapazität,
ist natürlich auch immer so eine Frage. Es hängt natürlich
auch zusammen mit den Eingabegrößen. Und es hängt auch damit zusammen,
wie viel Zeit sie zur Verfügung haben, ein Ergebnis zu berechnen.
Habe ich auch ein Beispiel aus der Praxis,
das war noch vor meiner Zeit, in der Wir-Informatik,
da haben wir so Verschnittoptimierung gemacht.
Also wir wollten dann so Objekte platzieren, um möglichst wenig Verschnitt zu haben.
Das machen sie zum Beispiel, wenn sie Jeans hosen produzieren,
dann müssen sie,
kriegen sie den Stoffballen und müssen dann die Jeanshosen-Teile irgendwie auf
diesen Stoffballen so oder auf die Stoffbahn so platzieren,
dass sie
möglichst wenig verschnitt haben
Wenn sie das für Jeanshosen machen, dann können sie sagen,
okay, wir haben eine Kollektion, das machen wir ein Jahr lang,
da können wir ruhig mal eine Woche rechnen,
um ein optimales Schnittbild zu kriegen.
Dann können wir dann das ganze Jahr lang über Stoff sparen,
wenn wir also ein ganz tolles Schnittbild haben.
Schnittbilder berechnen ist super schwierig. So, okay,
das kann man da machen. So,
jetzt ändern sie die Branche, die Branche nicht wirklich,
sie sind nach wie vor in der Modeindustrie, aber jetzt produzieren sie Lederhosen.
Ja, sind ja auch ganz schick. Bei Lederhosen haben
sie keine Stoffbahn, sondern sie haben Lederstücke, ja,
Kuhhaut, so, wenn sie so wollen.
Da sieht jede Kuhhaut anders aus. Ja,
da können sie nicht sagen, okay, für die Kollektion
rechne ich einmal so ein Schnittbild aus und es verwende ich ein Jahr.
Da kommt so eine Kuhhaut und da müssen sie möglichst viele
Teile für diese Lederhose da rausschneiden. Das heißt,
sie müssen ad hoc in dem Augenblick, wo sie diese Kuhhaut haben,
entscheiden, wie platzieren sie die Objekte auf der Unterlage.
Eigentlich genau das gleiche Problem, was wir haben.
Es ist wieder das gleiche Verständnis. Sie haben sogar die gleichen Teile,
wenn sie aber schon ausgehen, dass die Hosen ungefähr gleich aussehen.
Und trotzdem können sie in dem einen Problem,
bei dem einen Problem können sie sagen,
ich mache das exakt, ich investiere da eine Woche,
laufe zu einem anderen, brauchen sie ein schnelles,
heuristisches Verfahren,
weil sie einfach
zu langsam sind
Ist übrigens ein ganz interessantes Problem,
wo bis heute Computerverfahren nicht in der Lage sind,
ist so schnell und so gut zu machen wie der Mensch.
Also Leute, da gibt es Menschen,
die machen das den ganzen Tag, die haben die Schablone und legen,
dass sie da irgendwie da drauf und schieben das und so.
Und die sind so gut, dass man das nach wie vor,
also naja, man ist schon dicht dran,
aber schafft das eigentlich noch nicht so gut zu machen.
Gut, okay, das sind also exakte Verfahren,
Approximationsalgorithmen, zu denen habe ich gerade schon was gesagt.
Die werden wir uns anschauen, die werdet man immer dann
an, wenn wir polynomäre Laufzeit haben wollen
Wenn wir einen Fehler akzeptieren können, aber eine Fehlerschranke haben wollen.
Und das können wir dann machen, wenn wir halt
so keine Optionen haben, das exakt zu machen.
Und wenn wir die Fehlerabschätzung benötigen. Sowas kann zum Beispiel
wichtig sein bei Risikoabschätzungen, wenn sie Ergebnisse weiter analysieren wollen,
wollen sie vielleicht so eine Qualitätsgarantie haben.
Naja, und teuristische Verfahren ist das, was übrig bleibt,
wenn eins und zwei beide nicht akzeptabel sind.
Und für viele Probleme ist eins nicht akzeptabel, weil es
zu lange dauert. Und zwei ist zu schwierig,
sondern Algorithmus finden sie nicht. Und dann landet man automatisch
bei den heuristischen Verfahren
Okay, so, wir approximieren. Jetzt mal müssen wir
sagen, was jetzt so eine Approximation bedeutet.
Dafür definieren wir ein Approximationsfaktor. Also erstmal gehen wir davon aus,
wir haben jetzt ein Optimierungsproblem und wir haben positive Kosten.
Also wir haben keine negativen Zahlen, da muss man es
einfach nur ein bisschen anders definieren.
Wir gehen mal davon aus, alles positiv.
Und wir definieren ein Approximationsfaktor und der heißt Roh von N,
weil falls der Algorithmus A für eine Eingabe der Größe N die Eigenschaft hat,
dass die Lösung, die er erzeugt, das ist C,
also die von A Hundelösungen geteilt durch die Größe der optimalen Lösungen.
Das ist sehr zäh Stern. Immer kleiner, gleich Ruf
von Ennis. Und hier ist das Maximum von C
durch C Stern und C Stern geteilt durch C,
damit sie quasi beide Fälle abfangen, also minimum mit Minimierung,
die Maximierung ist der einzige Unterschied.
Der einzige Grund, warum man das macht. Okay,
so, das heißt, wir haben so eine Schranke, Roh von Andy da.
Die Schranke darf noch von der Eingabegröße abhängen. Und wir wollen jetzt,
wir sagen jetzt, okay, unser Algorithmus,
der approximiert unsere Lösung mit diesem Faktor Roh von En.
Und die Lösung, die er findet,
ist also nur Roh von N mal schlechter als die
optimale Lösung
Okay, so ein Algorithmus, der heißt dann Roh von N-Approximationsalgorithmus.
Die Beispiele, die wir sehen,
die werden alle hier nicht mehr von N abhängen.
Also es kann natürlich sein, dass das mal von N abhängt.
Aber die einfachen Beispiele, die wir haben, da ist das unabhängig von N.
Und wenn das so ist, dann nennt man das auch
einfach Roh-Approximationsalgorithmus. Wir werden zum Beispiel ein Zwei-Approximationsalgorithmus sehen.
Das heißt dann also, die Lösung, die er erzeugt,
ist nur ein Faktor zwei schlechter als das Optimum.
Dementsprechend wäre ein Eins-Approximmationsalgorithmus wieder ein exakter Algorithmus.
Also das Kleinste, was möglich ist, ist eins.
Je näher sie da drankommen an die Eins,
umso näher sind sie an der optimalen Lösung
Es könnte man sich ja vorstellen, dass man Probleme hat oder
Algorithmen hat, wo man die Genauigkeit noch einstellen kann.
Wie so ein zusätzlicher Freiheitsgrad, so ein zusätzlicher Parameter,
den man dem Algorithmus übergeben kann. Dann übergibt man also
das Problem und dann diesen Einstellparameter, Äpselon heißt er hier.
Und den können wir jetzt verstellen und können dann die Genauigkeit einstellen.
Das wäre natürlich super. Das ist eigentlich das Optimum,
was man haben kann. Wenn man so ein NP-schweres Problem lösen muss,
weil man hat dann die Wahl,
dann kann man je nach Anwendung entscheiden,
akzeptiere ich einen großen Fehler oder einen kleineren Fehler.
Natürlich wird es zur Konsequenz haben,
je kleiner der Fehler ist, den ich akzeptiere,
umso länger wird vermutlich
die Laufzeit sein,
die der Algorithmus benötigt
Sonst wäre es irgendwie eigentlich unsinnig, wenn das nicht so wäre.
Also so ein Algorithmus, der also neben der Eingabe
auch so ein Y nimmt, der heißt Approximationsschema.
Wenn für jedes Y größer Null gilt,
dass A ein Eins plus Y Y Approximationsalgorithmus ist.
Ja, also dann heißt der so. Der Algorithmus wird
die Eigenschaft haben, dass je kleiner sie das Öpsilon wählen,
umso länger wird er benötigen, um das Problem zu lösen.
Wir bezeichnen ihn dann als Polynomzeit-Approximationsschema,
falls A für jedes konstante Öpsilon
einen polynomelle Laufzeit hat
Dann könnten sie sagen, okay, ist ja super,
dann können wir das ja auf 0,001 stellen und dann werden wir schon das Optimum finden.
Ja, aber polynomielle Laufzeit bedeutet ja,
kann ja immer noch sehr lang sein,
wenn jetzt zum Beispiel hier sowas wie eins durch Ypsilon im Exponenten steht.
Wenn sie sowas hätten wie N hoch eins durch Y,
dann wäre das natürlich polynomieell für jedes Y,
aber wenn Äpseln ein Tausendstel wäre, hätten sie einen Hoftausend.
Und dann wäre das natürlich auch extrem langsam.
Und so sind die Algorithmen in der Regel. Dieses Äpstelon,
das taucht bei der Laufzeitabschätzung meistens irgendwo im Exponenten auf.
Und solange das dann konstant ist, ist es ein Polynom
Und sobald das dann von N oder von irgendeinem Eingabeparameter abhängt,
ist es halt dann in der Regel exponentiell.
Aproximationsschemata werden wir hier nicht sehen in der Vorlesung.
Die sind sehr, sehr schwierig zu entwickeln, das hinzubekommen. Aber wir werden uns Beispiele für Approximationsalgorithmen anschauen. Wir beginnen mit einem Problem,
das habe ich in der letzten Vorlesung schon mal erwähnt,
das ist das Word-Tex-Cover-Problem, habe ich Ihnen erzählt,
die Anwendung oder eine von vielen Anwendungen wäre jetzt,
also sie haben irgendwie ein Netzwerk von,
keine Ahnung, Straßenkanälen und sie müssen diese Kanäle,
die müssen sie überwachen und um sie zu überwachen,
müssen sie vielleicht an verschiedenen Stellen so Punkte haben,
wo sie Aufwand betreiben müssen, was weiß ich,
größere Einstiegsluken.
Da gehen sie dann rein, können da unten hin,
können dann in diese Kanäle reingucken. Und an anderen Stellen
reicht dann vielleicht so eine ganz kleine Luke oder gar keine Luke.
Und damit das jetzt für sie praktikabel ist,
müssen sie quasi in jeden der Kanäle reingucken können.
Und das Problem lässt sich abbilden auf einen sogenannten Vertex-Cover.
Unser Ziel ist jetzt, jetzt definieren wir es abstrakt,
wir haben einen Graf gegeben mit Knoten und Kanten und wir suchen eine Teilmenge der Knoten,
zum Beispiel zum Beispiel diese Schwarzen hier, die die Eigenschaft hat,
dass jede Kante, die in dem Graf kommt,
zu mindestens einem schwarzen Knoten benachbart ist.
Ja, das ist das Ziel. Ja,
man kann auch sich vorstellen,
sie hätten Flure mit Überwachungskameras und dann wissen sie,
an welchen Ecken von den Fluren sie dann ihre Kameras aufstellen können,
damit sie mit den Kameras in alle Flure reingucken können oder sowas.
Das ist ein typisches Cover-Problem, also wo sie irgendetwas überdecken müssen mit einer Teilmenge.
Und natürlich möchten sie so wenig Knoten wie möglich auswählen.
Es gibt noch andere verwandte Probleme, das Allgemeinste,
das Problem heißt Setcover, da geht es darum,
sie haben ein Teilmengensystem und sie wollen alle Elemente einer Grundmenge überdecken.
Es kam auch in der Liste, glaube ich,
vor, die ich am Ende der letzten Vorlesung gezeigt habe.
Das ist also ein spezielles für Graphen. Das ist wieder eins von diesen Problemen,
was auf den ersten Blick ziemlich einfach aussieht, wo ich denke,
wow, okay, da muss man ja so ein paar Knoten auswählen.
Aber was tatsächlich endlich schwer ist, ein sehr schwieriges Optimierungsproblem.
Wir betrachten hier das Optimierungsproblem jetzt,
also wir versuchen die minimale Anzahl von Knoten zu finden,
um dann entsprechend alle hier Knoten oder alle Kanten zu überdecken.
Hier sehen Sie ein Beispiel mit vier in diesem Graphen 1,
2, 3, 4, wenn Sie diese vier schwarzen Knoten auswählen,
dann können Sie alle Kanten betrachten und Sie sehen jede Kante,
ist zumindest einem schwarzen Knoten benachbart.
Können Sie mal gucken, ob es eine Lösung mit drei gibt,
aber ich denke mal, das gibt es hier nicht.
Okay, das ist also das Optimierungsproblem, was wir lösen wollen.
Jetzt müssen wir erst mal zeigen, dass es schwer ist,
so der erste Schritt. Also vielleicht ist es ja ganz
einfach und wir fangen hier an, irgendwelche Approximationsverfahren zu entwickeln.
Also wir müssen erst mal zeigen, dass es schwer ist.
Also wir gucken wir gucken uns Vertex-Cover an.
Jetzt betrachten wir das Entscheidungsproblem, weil nur für das Entscheidungsproblem
können wir zeigen, ob es NP vollständig ist.
Und das sieht dann so aus, wir haben einen Graf
und wir haben einen K und der Graf G.
Und wir sagen, dass dieses Eingabetupel hier das gehört zu Vertex-Cover.
Genau dann, wenn der Graf G,
der hier gegeben ist, eine Knotenüberdeckung der Größe K hat.
Wenn es also hier eine Teilmenge der Knoten gibt,
die darf maximal K groß sein und wenn sie die auswählen,
dann ist es zu jeder Kante einer der beiden Knoten gehört
dann zu dieser ausgewählten Menge.
Okay,
dieses Problem ist NPV ständig
Beweis, erster Schritt, wir zeigen, es gehört erstmal in die Klasse NP.
Das ist bei diesen Problemen wohl absolut offensichtlich. Ich habe sie nochmal aufgeschrieben,
wir brauchen so ein Zertifikat und müssen dann zeigen,
dass wir in polinomieller Laufzeit prüfen können, dass das richtig ist.
Gut, das Zertifikat ist nichts weiter als die Knotenmenge, die diese Knotenüberdeckung bildet.
Also eine Teilmenge der Knoten, die gegeben sind.
Das ist offensichtlich polinomiell in der Größe, der Eingabe des Problems.
Das ist einfach nur so ein paar Nummern von diesen Knoten.
Und dann kann ich ich in O von V plus E-Zeit prüfen.
Also erstmal, ob die Menge K groß ist,
so ja eine Knotenüberdeckung der Größe K sein.
Und zweitens, ob es überhaupt eine Knotenüberdeckung ist.
Weil das Einzige, was ich machen muss,
das haben sie wahrscheinlich im Auge schon gemacht,
sie gucken sich alle Kanten an und für jede Kante gucken sich die beiden Knoten an und gucken,
ob einer der beiden Knoten ausgewählt wurde.
Und wenn sie eine Kante finden, wo es nicht so ist,
dann sagen sie nein, sonst sagen sie ja.
Das wäre also hier Teil 1 und der wesentlich schwierigere Teil ist jetzt natürlich zu zeigen,
dass das Problem auch tatsächlich NP vollständig ist.
Dazu brauchen wir eine Reduktion. Die Reduktion,
die wir machen, ist von dem Klickproblem aus,
also wir zeigen, dass das Vertics,
dass das Klickproblem nicht schwerer ist als Vertics Cover
Okay, so, wie kann man das jetzt machen?
Das ist ehrlich gesagt jetzt ein ziemlich geschickter Trick,
der zeigt, dass Word Ex Cover und das Klick-Problem eigentlich
sehr ähnlich sind, wenn man den Trick erstmal kennt.
Was wir tun, ist, wir nehmen unseren Eingabegrafen vom
Klick-Problem und wir bauen dann einen sogenannten Komplimentgrafen.
Komplimentgraf ist nichts weiter als der Graf,
wo sie die gleichen Knoten haben und überall,
wo eine Kante war, nehmen sie die Kante weg und überall,
wo keine Kante war,
ziehen sie in die Kante hinein
Es ist der Komplimentgraf. Einfach alle kannten austauschen.
Und wir können jetzt sehen, dass Klicken etwas mit diesem
Word-Ex-Cover zu tun haben, wenn wir diese Komplimentgrafen betrachten.
Jetzt erst mal ein Beispiel, wie das aussieht.
Also wir haben hier so einen einfachen Graf,
der hat sechs Knoten und eine ganze Reihe von Kanten und sie
sehen, dieser Graf hat zum Beispiel eine Vier-Klick.
Das sind die hellgrauen Knoten hier. Die bilden eine Vier-Klick,
jeder Knoten ist mit jedem anderen verbunden.
Und jetzt bilden wir den Komplimentgraf,
den sehen Sie auf der rechten Seite,
wieder die sechs Knoten und wir machen da eine Kante hin,
wo in dem ursprünglichen Graf
keine Kante war
Haben wir diesen, diesen resultierenden Graf. Und jetzt kann man schon überdecken,
drüber nachdenken, was der hier für eine Überdeckung hat.
Und jetzt können wir hier draufschauen. Man sieht,
der hat eine Zweierüberdeckung, eine Zwei-Überdeckung, also zwei Knoten,
diese hellgrauen Knoten, die überdecken das. Tatsächlich. Und der Verdacht,
der sich hier auftut, ist, dass immer,
wenn sie hier eine K-League haben auf dieser Seite,
dann müssten hier eigentlich die anderen Knoten, also die,
die nicht zur Clique hören, die Eigenschaft haben,
dass sie eine Überdeckung sind.
Ja,
auf der rechten Seite
Ja, weil sie wissen ja, die Knoten,
die sie hier nicht betrachten, die gehörten ja zu einer Klick
und in dem ursprünglichen Graf waren die alle miteinander verbunden.
Das heißt, hier gibt es gar keine Kanten mehr zwischen denen. So,
das ist genau die Idee hinter dieser Reduktion und man muss jetzt nur zeigen,
dass es funktioniert, wenn man diese Erkenntnis gewonnen hat,
dass die beiden Probleme so zusammenhängen,
dann ist der Rest nur noch Technik,
das ist ganz einfach aufzuschreiben.
Unsere Reduktionsfunktion, die bildet jetzt einen Grafen und eine
natürliche Zahl auf einen Grafen und eine natürliche Zahl ab.
Das eine ist die Eingabe,
das ist die Eingabe von Klick und das ist die Eingabe
von Vertics Cover
Also noch ein bisschen formalisiert. Und was macht ihr jetzt
? Die macht Folgendes. Sie nimmt den Grafen, bildet
den Komplimentgrafen, G-Punkt. Und aus dem K macht sie
einen Betrag von V-K. Also wenn die ursprüngliche Frage war,
das ist der Graf, gibt es hier drin eine K-K-League,
dann wandeln wir das um und sagen, das ist der Komplimentgraf.
Gibt es da drin eine V-K-Knotenüberdeckung? Das ist die Transformation
, die wir machen. Und die Behauptung ist,
dass das eigentlich das Gleiche ist. Das heißt,
immer dann, wenn es hier eine K-K-League gibt,
dann gibt es hier eine V-K-Knotenüberdeckung.
Wenn es hier keine K-K-League gibt, gibt es ja
auch keine Formel des K-Knotenüberdeckung
So, erster Teil, wir müssen zeigen,
dass unsere Reduktionsfunktion im Polynumier derzeit berechenbar ist.
Das heißt, wir müssen zeigen, wie wir das ausrechnen.
Das ist aber ganz einfach hier. Wir brauchen O von
V-Quadrat Zeit. Hier ist mein Lösungsvorschlag für einen Algorithmus.
Ich schreibe schon gar keinen Pseudocode mehr Hinweis, also trivial ist.
Wir konvertieren die Adjazenzlisten in eine Art Jazenzmatrix,
führen das in Matrix. Da stehen dann einzelne Nullen drin,
dann wandeln wir alle einzelne Nullen und alle Nullen in Einsen,
dadurch drehen wir alle Kanten um und wenn sie wollen,
können sie dann die Adjazenzmatrix wieder in Art der Zenslisten überführen und dann haben sie entsprechend einen Graf,
der komplementiert wurde.
Das gilt in quadratischer Zeit bezüglich der Anzahl der Knoten.
So groß ist ja die Addizenz-Matrix. Gut, so,
wir können das also in polynomieller Zeit berechnen.
Jetzt müssen wir noch zeigen, dass das Resultat immer übereinstimmt.
Ist also der zweite Teil des Beweises. Wir gehen mal
davon aus, dass der Eingabe GrafG eine K-Kleague hat.
Dann wäre GK-Element-Krieg. Der hat jetzt also eine K-Kleague.
Und dann folgern wir oder dann wollen wir zeigen,
dass dann der Kompliment Graf eine V-K-Knotenüberdeckung hat
So, wie machen wir das? Wie zeigen wir das? Also angenommen,
V-Strich sei jetzt die K-Cleague, also der hat ja eine,
also suchen wir uns die Knoten da raus.
Das ist jetzt die Krieg. Und wir betrachten alle anderen Knoten,
das ist die Menge V-Strich. Also die Menge V,
die wir aller Knoten minus, die sie zu der Krieg gehören.
Und die betrachten wir in dem Kompliment Graf. Das Erste,
was wir sehen, diese Knotenmenge vor Strich Strich,
die hat genau Betrag von V-K viele Knoten,
weil insgesamt sind es Betrag von V. Viele.
Die Krieg hatte kaviele Knoten, das heißt,
dann bleiben Betrag von V-K
viele Knoten
Übrig. So, wir nehmen uns eine beliebige Kante in
dem Kompliment Graf heraus, dann wissen wir,
diese Kante gibt es nicht in dem ursprünglichen Grafen.
Ja, weil Komplimentkraft, wenn ja alle Kanten umgedreht,
also wenn eine Kante da ist, ist weg,
wenn sie da, wenn sie nicht da war, ist sie jetzt da.
Okay, also die ist in dem Komplimentkraft drin,
dadurch ist die Kante nicht in dem ursprünglichen Grafen drin,
wenn die Kante nicht in dem ursprünglichen Grafen ist,
dann können nicht V und Weg gleichzeitig zu Klick gehört haben,
weil in der Klicks sind ja alle Knoten miteinander verbunden.
Das heißt, entweder V ist nicht Element, V-Strich,
V-Strich war unser Klick oder W ist nicht Element,
vor Strich
Alle Knoten sind entweder in Vorstrich oder in der Menge V-Strich
, weil wir die Knoten aufgeteilt haben.
Die einen ganz so klickt, die anderen gehören nicht dazu.
Also ist einer dieser beiden Knoten Teilmenge Teil der Menge V-Strich,
und vorstrich ist gerade die Knoten, die wir ausgewählt haben,
für die Knotenüberdeckung.
Also offensichtlich wird die Kante E dann überdeckt. Okay,
so, mal angenommen, wir haben jetzt den umgekehrten Fall,
wir haben diesen Grafen, Für den Grafen gibt es jetzt ein Vertex-Cover.
Entschuldigung, eine Knotenüberdeckung. Ja, ist das Gleiche essen
in Englisch. Also eine Knotenüberdeckung, der größte Betrag von
V-K. Jetzt machen wir echt das Gleiche, nur umgedreht.
Wir nehmen V-Strich, das ist die Knotenüberdeckung,
da wissen wir, die ist Betrag von V-K groß.
Jetzt betrachten wir die Menge V-Strich, das sind wieder die anderen.
Also Knotenmenge V, ohne die, die zu der Knotenüberdeckung gehören.
Das sind offensichtlich jetzt K-Fiele,
weil die Knotenüberdeckung war ja Betrag von V-K und naja,
die Gesamtmenge ist V,
bleiben also K-Knoten
Übrig. Und jetzt betrachten wir eine bliebige Kante,
VW, die quasi jetzt aus dieser Menge,
also die zwei Knoten verbindet, aus der Menge V-Strich.
Und, nee, Entschuldigung, wir nehmen ein beliebiges Parkknoten aus der Menge V-Strich
und wir wollen zeigen, dass es da eine Kante gibt.
So, dieses Knoten war VW, also E,
kann Nicht-Element-E-Strich-E-Punkt sein, denn wenn das da drin wäre,
dann wäre diese Kante E ja nicht überdeckt, ja,
weil die Knoten vor Strich Strich sind ja die,
die nicht zur Knotenüberdeckung gehören.
Und dann hätten wir eine Kante gefunden, die sowohl V als auch W
nicht in der Knotenüberdeckung ist und dann wäre das nicht korrekt.
Also kann die Kante da nicht vorkommen. Und deswegen gibt es
diese Kante in der ursprünglichen Menge, weil es ja invertiert.
Und deswegen sind alle Knoten in der Menge V-Strich paarweise miteinander verbunden.
Und deswegen ist das eine Krieg. Also das wird Ex-Cover-Problem und das Kriegproblem,
wenn man das erst mal so gesehen haben,
sind eigentlich fast das Gleiche.
Das ist fast identisch, das Problem.
Man muss halt nur diese Transition im Kopf
da machen
Okay, gut. Also, wir haben schon mal gesehen
, es ist schwer. Wir brauchen also einen Approximationsalgorithmus.
Manchmal ist es auch eine Erleichterung, wenn man das dann feststellt,
weil so ein Approximationsverfahren ist man nicht gezwungen,
das Problem optimal zu lösen.
So, das heißt, wir machen ein einfaches Approximationsthema.
Hier ist mein Vorschlag. C ist die Menge,
wo die Überdeckung drin ist. Das ist am Anfang
eine leere Menge. E-Strich, sei mal die Kantenmenge.
Und wir merken uns in E-Strich immer alle Kanten,
die wir noch nicht überdeckt haben mit irgendeinem Knoten
So, dann haben wir eine Wildschleife,
die läuft so lange, bis diese Menge E-Strich leer ist.
Dann haben wir alle überdeckt. Wir wählen jetzt aus
dieser Menge E-Strich eine beliebige Kante aus, UV,
also die geht jetzt zwischen Knoten-UV.
Und dann nehmen wir diese beiden Knoten-U und V in die Menge hinein.
Und dann dürfen wir diese Menge E-Strich verkleinern. Wir dürfen nämlich
alle Kanten herauswerfen aus den Adjazenzlisten des Knotens U und des Knotens Vs.
Also wir nehmen E-Strich und subtrahieren,
die kannten UW mit W aus der Adjazenzliste von
Und wir subtrahieren auch,
die kannten WV mit W in der Addizenzliste von V. Also alle,
die da irgendwie noch zu diesem Knoten-U und V benachbart sind,
die streichen wir alle da raus,
weil die haben wir ja jetzt überdeckt.
Und dann bleiben einfach noch ein paar übrig. Und irgendwann ist
diese Menge leer, das Return ist leider falsch eingerückt.
Das ist natürlich hier außerhalb der Wild-Schleife. Das ist beim Umfangrantieren
der Algorithmen ist mir das noch mal ein paar Mal passiert.
Also es ist hier, und dann geben wir das C
zurück.
Das ist von der Strategie her eine Greedy-Strategie. Greedy-Strategien haben wir
schon gesehen. Dann lernen sie sich an minimalen Spannbaum,
Greedy-Strategie, eine Kante nach der anderen nehmen.
Der Unterschied zwischen Spannbaum und Word-Ex-Cover ist allerdings beim minimalen Spannbaum,
konnten wir nachweisen, dass die Strategie immer diese eine spezielle leichte Kante auszuwählen,
zu einer optimalen Lösung führt.
Hier können wir das nicht. Also das ist zwar auch
eine Greedy-Strategie, aber sie führt nicht notwendigerweise zur optimalen Lösung.
Was wir sofort sehen, ist, dass C irgendwie ein
Vertex-Cover, eine Knotenüberdeckung ist. Also die Knoten,
die da ausgewählt sind, die überdecken tatsächlich die Menge aller Kanten.
Das wissen wir. Wir wissen nur nicht, wie gut es ist.
Und wir sehen auch sofort, dass der Algorithmus effizient ist.
Also wenn sie es ungeschickt machen, haben sie irgendwie so quadratische Laufzeit.
Wenn sie ein bisschen geschickt hier Mengenoperationen implementieren,
dann kriegen sie es sogar ein O von E hin.
Es interessiert uns aber jetzt gar nicht weiter.
Also es ist auf alle Fälle sehr schnell,
dieses Verfahren, egal wie sie es genau implementieren.
Ich zeige ihm mal eben gerade ein Beispiel.
Gehen gleich nochmal zurück. Hier ist das Beispiel. Wir haben
sieben Knoten. Sie sehen hier so ein paar Kanten.
Und unser Algorithmus, der läuft jetzt los. Er sucht sich
eine beliebige Kante aus. Zum Beispiel die. Ja,
dann nimmt er die Knoten B und C in den Cover
auf und löscht die gestrichelten Kanten.
Weil die hat er jetzt durch die Knoten B und C
ja schon überdeckt. Dann sucht er sich die nächste Kante,
zum Beispiel diese hier und nimmt die beiden Knoten in die
Menge auf und löscht diese, diese und diese Kante,
weil die sind ja durch E&F schon überdeckt.
Es hat ja
immer noch
eine Kante
Nimmt er die auch noch in die Menge auf.
Also die Knoten D und G sind dann auch noch in
der Menge. Und dann sind alle Kanten überdeckt,
die grau unterlegten, sind die,
die der Algorithmus ausgewählt hat und die gestrichelten sind die Kanten,
die er nicht weiter betrachten musste, weil er einen Knoten ausgewählt hatte,
der die Kante schon überdeckt hat.
So, was haben wir rausgefunden? Wir haben gesagt,
super, unser Ergot hat eine Lösung gefunden.
Mit diesen sechs Knoten Können wir den Grafen überdecken?
Ja. Das ist offensichtlich nicht optimal, ja,
und rechts sehen Sie eine optimale Lösung für das Problem.
Also es reichen drei Knoten. Also B,
E und D, die drei Knoten können alle Kanten überdecken.
Also jede Kante in dem Grafen ist so ein dieser drei
Knoten benachbart. Okay. Sieht nicht so geschickt aus,
das Verfahren, aber immerhin, es liefert ein Resultat.
Hätten Sie das so gemacht
Weitere. Ja, das wäre eine Möglichkeit. Dann können
wir uns nachher noch optimieren. Man könnte jetzt sagen,
also ich nehme hier, den brauche ich vielleicht nicht und
dann könnte ich den wieder entsprechend löschen.
Genau, das hätte ich auch gemacht. Also wenn ich
das gemacht hätte, hätte ich gesagt,
ich nehme als allererstes einen Knoten mit einem hohen Knotengrad,
also den D hier, weil damit decke ich ja unheimlich viele Kanten ab.
Das wäre jetzt mal eine Strategie. Und das andere,
was ich auch ehrlich gesagt total unlogisch finde,
Also wenn ich mir so eine Kante aussuche,
warum soll ich ausgerechnet dann beide Knoten aufnehmen?
Also diese eine Kante kann ich ja überdecken,
indem ich schon einen der beiden Knoten auswähle.
Also die Strategie sieht ein bisschen, ja,
ein bisschen komisch aus, aber sie liefert das richtige Resultat erstmal.
Und ein anderer Algorithmus wäre der jetzt hier.
Das ist so eine Mischung aus unserer beiden Ideen hier.
Ich nenne den jetzt Vertex Cover 2. Sie nehmen, haben den V-Strich,
das sind alle Knoten und den E-Strich sind alle Kanten.
Und die Mengen werden wir jetzt entsprechend,
also die Menge E-Strich werden wir
jetzt entsprechend verkleinern
Was wir tun, ist, wir sagen, okay,
also E-Strich ist am Anfang,
also solange der E-Strich nicht die leere Menge ist,
genau das Gleiche wie vorher auch.
Wir wählen einen guten V aus der Menge V-Strich heraus mit maximalem Knotengrad
in unserem Grafen-V-Strich-E-Strich. Das ist der Graf von den Knotenumkanten,
die noch übrig sind, die nicht abgedeckt sind. So,
und dann nehme ich den Knoten V in die Menge auf,
ja, diesen einen Knoten und dann streiche ich aus der Menge E-Strich,
alle kannten heraus, die Adjazent sind zu diesem einen Knoten.
Auch hier, das müsste ein bisschen eingerückt sein,
dann wäre das ein bisschen schicker,
es ist noch hier der Satz,
die Gree-In-G gleich und so weiter
Das werde ich nochmal richtig schieben, bevor ich hier in
die finalen Folien dann gebe. Okay, so,
das können wir machen. V-Strich steht hier nicht drin.
V-Strich ist explizit hier gegeben. V-Strich sind immer die Knoten,
die man noch hat in der Menge E-Strich, aus dem man dann auswählen kann.
Ja, und das ist in vielerlei Hinsicht relativ geschickt.
Also ich wähle tatsächlich nicht nur einen mit einem hohen Knotengrad,
sondern ich wähle einen mit einem hohen Knotengrad unter denen,
also unter den verbleibenden Kanten, also unter den Kanten,
die ich noch abdecken muss.
Könnte ich auch machen. Ist eine zweite Strategie
und erscheint zumindest erstmal besser
Gut, auch das ist eine Greedy-Strategie.
Wir wählen hier immer einen Knoten aus. Auch hier haben
wir am Ende einen garantiert als mal ein Word Excover.
Wir wissen noch nicht, wie gut er ist.
Und die Laufzeit ist wahrscheinlich auch in der Größenordnung O von E,
wenn man es geschickt implementiert, auf alle Fälle geringer als E-Quadrat.
Gut, jetzt wollen wir, ach so,
ich zeige Ihnen nochmal, was daraus käme.
Bei dem Beispiel, das habe ich jetzt über dieses Bild
drüber gemalt. Also als erstes würde ich den Knoten D
auswählen und ich würde dann diese Kanten alle streichen.
Und was dann dann übrig bleiben würde, das sind die rot unterlegten Kanten.
Unter denen hätte ich hier jetzt Würde ich jetzt einen Knoten wählen mit maximalem Knotengrad,
zum Beispiel den Knoten E und damit würde ich dann wieder diese gekannten löschen.
Dann bleiben noch die beiden übrig und dann würde ich als
nächstes dann den Knoten B wählen und wäre dann fertig.
Würde ich diese beiden Kanten rausnehmen, hätte dann
drei Knoten gefunden und das wäre auch die optimale Lösung.
Es könnte erstmal der Verdacht entstehen, hey,
das Verfahren liefert uns immer eine optimale Lösung.
Nein, das tut es nicht. Selbst in diesem Beispiel hätte es schief gehen können,
wenn wir nämlich am Anfang Wenn wir nämlich an diesem Schritt C ausgewählt hätten,
also in diesem Schritt C ausgewählt hätten,
wäre ja auch gegangen, hat auch Knotengrad 2,
hätten wir C ausgewählt und dann hätten wir danach noch zwei Knoten nehmen müssen.
Also ein hier unten und ein hier oben,
dann hätten wir vier gehabt.
Also auch diese Strategie liefert uns nicht garantiert, eine optimale Lösung.
Aber offensichtlich wohl eine scheinbar bessere in diesem Beispiel.
So, wir wollen zeigen, dass unser Verfahren eine Optimalitätsgarantie hat.
Das machen wir mit unserem ersten Algorithmus
Also, unser Theoriem sagt,
der Algorithmus Approxy mit Word Decks Cover ist ein Zwei-Approximationsalgorithmus.
Also den, den ich Ihnen zuerst gezeigt habe,
der immer eine Kante auswählt und die beiden benachbarten Knoten.
Und mit Polynomiala Laufzeit, also Polynomiala lauft es,
polynomiale Laufzeit, haben wir schon gesehen.
Und wir müssen noch zeigen, dass der Fehler,
den der Algorithmus macht, maximal einen Faktor 2 beträgt.
Okay, also das haben wir gesehen. So,
wir zeigen, dass Betrag von C,
C ist die erzeugte Lösung, geteilt durch Betrag von C-Stern.
Das ist die minimale Lösung, Knotenüberdeckung, ist kleiner gleich zwei.
Damit wäre ja das im schlimmsten Fall zweimal so groß wie
die optimale Lösung. Okay, wie können wir das zeigen?
Wir gucken uns mal die Menge der Kanten an,
die an einer speziellen Stelle im Algorithmus ausgewählt wird.
Es gibt nur eine Stelle, wo was ausgewählt wird.
Hier sind die zwei Sternchen. Hier wählen wir ja immer eine Kante aus. Diese Kantenmenge,
die betrachten wir und wir werden sehen,
die ist genau der Schlüssel, um zu zeigen,
wie aufwendig, also wie genau das Verfahren ist,
also wie groß der Fehler sein kann
Also alle Mengen, die wir alle kannten,
die wir auswählen, die bezeichnen wir als Kanten der Menge A.
Die können wir auch in dem Bild sehen. Das sind nämlich
diese grau unterlegten. Also diese drei grau unterlegten Kanten,
die hatten wir ausgewählt. Die gehören zur Menge A. Gut
, das ist also eine Menge A. Dann sehen wir die
Kanten in der Menge A, haben keinen gemeinsamen Knoten.
Das kann nicht sein. Also das sehen wir ja in dem Beispiel,
diese haben keinen gemeinsamen Knoten, weil der Algorithmus ja so vorgeht,
wenn er eine Kante auswählt,
dann löscht er ja alle benachbarten Kanten aus weg.
Also die haben immer keinen gemeinsamen Knoten
Um diese Kanten in A zu überdecken,
brauche ich mindestens Betrag von A viele Knoten. Ja,
weil wenn die keinen Knoten gemeinsam haben und ich muss diese grau unterlegten Kanten überdecken,
dann muss ich ja für jede Kante auch einen Knoten auswählen.
Das heißt, ich brauche mindestens Betrag von A viele Knoten.
Folglich, also und A ist eine Teilmenge der Kantenmenge in
dem Grafen und folglich ist die optimale Lösung,
die wir finden können,
größergleich Betrag von
Also wir wissen nicht genau, wie viele es sind,
aber wir wissen, wir haben eine Schranke gefunden für das Optimum.
Das Optimum, wir minimieren ja, es wird immer kleiner.
Je besser der Algorithmus ist, wird es kleiner.
Aber wir wissen, es wird auf keinen Fall
kleiner als diese Menge A, die wir auswählen.
So, was passiert jetzt? Jetzt haben wir eine Beziehung zwischen A,
also dieser Menge der ausgewählten Kannen und der optimalen Lösung.
Wir haben aber auch eine Beziehung zwischen der Menge A und
der Knoten, die wir ausgewählt haben.
Denn in jedem Schleifendurchlauf wird A um eine Kante vergrößert.
Wir wählen immer eine Karte aus und C wird um zwei Knoten vergrößert.
Wir wählen nämlich beide Knoten aus, die zu der Kante benachbart sind.
Folglich ist die Lösung, die wir erzeugen,
zweimal Betrag von A. Wenn nochmal den Algorithmus anschauen,
also in jedem Schleifendurchlauf wählen wir eine Kante aus und C wird um zwei Knoten vergrößert.
Gut, und damit haben wir das Resultat schon bewiesen,
denn Betrag von C ist dann zweimal Betrag von A und Betrag von A,
ist aber kleiner gleich Betrag von C Stern und dann steht hier,
wenn sie das umformen,
das Betrag von C durch Betrag von C Stenkleiner
gleich 2 ist
Ein Zwei-Approximationsalgorithmus hört sich erstmal toll an,
aber sie sehen mal, wie katastrophal der schon ist.
Faktor 2 heißt er, sie können ja schon um 100
Prozent daneben liegen. Die Lösung ist ein Faktor 2,
ist also doppelt so groß im Kostenwert wie denen,
das, was sie vielleicht erreichen könnten.
Also es ist noch nicht mal ein richtig gutes Verfahren,
selbst mit einer relativ kleinen Zahl an dieser Stelle.
Ja, okay, es ist eine Approximation 2-Algorithmus.
Jetzt wäre eigentlich der nächste Schritt, dass man mal guckt,
was ist denn mit Vertex Cover 2,
also unserem zweiten Verfahren
Das werden wir nicht mehr tun. Ich kann Ihnen
aber sagen, dass Sie diese Laufzeitschranke nicht beweisen werden.
Denn Vertex Cover 2, so geschickt er aussieht, ist kein 2-Approximationsalgorithmus.
Dieser Algorithmus, da können Sie Eingaben konstruieren,
mit dem Sie den Algorithmus austricksen, sodass er Knotenmengen auswählt,
die größer sind in der Menge als ein Faktor 2 von der optimalen Lösung weg.
Also, das werden wir nicht weiter hier anschauen.
Ich wollte Ihnen nur an dieser Stelle,
Sie finden über diesen Vertex Cover 2 im Kormen auch nichts.
Ich habe den hier dazugenommen, um ihn einfach mal zu demonstrieren,
dass die naheliegende euristisch bessere Lösung nicht automatisch die ist,
von der sie auch nachweisen können,
dass sie besser ist
Das heißt nicht, dass dieser Algorithmus in der Praxis,
wenn sie ihn auf 20 Millionen Graphen benutzen, nicht immer besser ist.
Klar, der kann immer besser sein, aber sie können es ihm nicht nachweisen.
Okay, so, wie hat das jetzt alles funktioniert?
Das einfache Beispiel für ein Approximationsalgorithmus. Wir haben also
einen Algorithmus angegeben und haben dann erstmal die Laufzeit gezeigt,
okay, und dann mussten wir zeigen,
wie gut ist die Lösung, die produziert wird.
Und wir müssen eine Beziehung herstellen zwischen der Lösung,
die erzeugt wird und die Lösung, die unser Algorithmus generiert.
Entschuldigung, das ist das Gleiche.
Also wir müssen eine Beziehung herstellen zwischen der Lösung,
die der Algorithmus erzeugt und der optimalen Lösung,
eine mathematische Beziehung,
um zu zeigen,
wie gut
das Verfahren ist
Das ist natürlich nicht so einfach,
weil wir kennen ja die optimale Lösung nicht.
Ja, wir können nicht einfach sagen, okay,
bei dem Grafen kommt das raus, das wäre die optimale Lösung.
Können wir gucken, wie weit ist das davon entfernt?
Wir müssen ja irgendwie allgemein sagen, wie gut die Lösung wird.
Das Verfahren funktioniert dann also so,
dass wir bei einem Minimierungsproblem immer eine untere Schranke suchen.
Wir fragen uns, wie gut kann die optimale Lösung im besten Fall werden?
Und das versuchen wir abzuschätzen. Und dieser untere Schrank setzen
wir in Beziehung zu dem Resultat, was berechnet wurde.
Das haben wir hier getan, ja. Und so funktionieren
die Beweise eigentlich immer. Ja, wir überlegen uns,
was ist, wie gesagt, diese Schranke?
Und dann können wir diese Schranke in Beziehung setzen zu
dem Ergebnis,
was erzeugt wird
Okay, wir werden jetzt noch ein zweites Beispiel sehen,
wie man diese Technik anwenden kann, um ein Approximationsalgorithmus zu entwerfen.
Verbesserungsmöglichkeiten gibt es natürlich viele, also die Frage ist jetzt,
können wir diesen Algorithmus vielleicht auch ergänzen,
um ein paar Strategien, um ihn besser zu machen?
Klar können wir, also wenn wir die Kante A auswählen,
dann war, dann stand da in dem Algorithmus,
ich gehe nochmal schnell zurück,
stand hier Arbitrary,
also irgendeine Kante wählen wir aus
Sowas ist immer ganz schön in Algorithmen. Da fragt man sich immer,
warum macht man das? Das ist eigentlich sehr gut,
wenn sie einen Algorithmus aufschreiben, Dinge,
die sie nicht festlegen müssen, auch tatsächlich nicht festzulegen in dem Pseudo-Code.
Weil jetzt haben sie gezeigt, dass egal welche Kante sie auswählen,
sie immer diesen Faktor 2 in der Genauigkeit bekommen.
Und das bedeutet, sie können sich jetzt noch eine Strategie
überlegen, welche Kanten sie auswählen.
Deswegen ist das gut, die Sachen offen zu lassen.
Jetzt können sie überlegen, vielleicht nehme ich ja Kanten,
die Knoten verbinden mit einem hohen Grad.
Das war ja unsere Strategie auch für das andere Verfahren.
Das könnten sie jetzt machen, weil ihr Beweis gilt dann
Das Einzige, was sie nicht entfernen können, ist die Tatsache,
dass sie hier immer die beiden benachbarten, die beiden Knoten reinnehmen.
Weil das war ein ganz entscheidender Aspekt für den Beweis der Genauigkeitsschranke.
Also sie können überlegen, welche Kante nehmen sie zu dem Algorithmus hinzu.
Also es ist die zweite Botschaft hinter diesem Verfahren,
wenn sie sowas entwickeln, überlegen sie sich zunächst wirklich,
welche Sachen sind noch frei,
welche Sachen kann ich später vielleicht noch entscheiden und lassen die erstmal offen.
Und dann können sie das nachher
an der Stelle
noch optimieren
So, wir gucken uns ein zweites Beispiel an.
Wiederum ein Beispiel mit hoher praktischer Relevanz, das Traveling Sales-Person-Problem.
Ja, das heißt TSP. Das Problem ist wie folgt. Wir haben,
das habe ich glaube ich auch schon mal erwähnt in der Vorlesung,
wir haben also eine Menge von Städten.
Sie können faktisch von jeder Stadt in jede andere Stadt fahren.
Das ist, sie sind eine gewisse Kilometeranzahl voneinander entfernt und
sie wollen eine Rundtour fahren, sie wollen alle Städte einmal besuchen.
So, und das wollen sie natürlich machen mit einer minimalen Streckenkilozahl,
also minimale Anzahl Kilometer, wollen sie alle Städte einmal anfahren.
Das ist das Traveling Sales-Person-Problem, also motiviert durch den Vorwerk-Staubsaugerverkäufer,
der von Stadt zu Stadt fährt und dann seine Staubsauger verkauft.
Gut, dieses Problem ist ein NP schweres Optimierungsproblem.
Das werden wir jetzt nicht beweisen, sondern wir werden uns
auf das Approximationsverfahren konzentrieren. Und wir werden versuchen,
also wir werden nicht das TSP-Problem im Allgemeinen nehmen,
sondern wir werden eine Variante des Problems nehmen.
Und zwar überlegen wir uns, wie können wir das Problem vielleicht ein bisschen vereinfachen
Und eine Möglichkeit ist zu vereinfachen, ist, mal darüber nachzudenken,
was für Eigenschaften gelten eigentlich zwischen Städten auf Landstraßen.
Und eine Eigenschaft, die garantiert gilt, ist die Dreiecksungleichung.
Das heißt, wenn wir drei Städte oder Knoten haben,
UV und R, dann gilt offensichtlich,
dass die Entfernung von U zu V plus die Entfernung von V zu R,
dass die größer gleich der Entfernung von U zu R direkt ist.
Also dann wäre es irgendwie unsinnig. Also unser Verständnis von Entfernung,
basieren auf Metriken und Metriken, die erfüllen alle diese Dreiecksungleichung hier.
Gut, das ist in dem ursprünglichen TSP-Problem nicht so definiert.
Da könnten sie auch Entfernungen haben, die nicht dieser Dreiecksungleichung entsprechen.
Und vielleicht ist es ja genau diese Dreiecksungleichung, dieses Problem
, vereinfacht. Das wäre ja für uns nicht schlecht,
weil in der Praxis haben wir und diese Dreiecksungleichung.
Also können wir ja versuchen, die zu benutzen. So,
wir versuchen also jetzt das Tryingled TSP-Problem zu lösen. Übrigens,
was ihr auch gleich noch mit abfällt bei dieser Betrachtung ist,
wenn sie nachgewiesen haben, dass das TSP-Problem ein irgendwie schweres Optimierungsproblem ist,
haben sie noch nicht gezeigt, das DSP-Problem mit der Dreiecksungleichung ein irgendwie schweres Problem ist.
Sobald sie das Problem einschränken, in der Art und Weise,
wie sie es modellieren können,
hat das gegebenenfalls natürlich Einfluss auf die Reduktion, die man verwendet hat.
Vielleicht haben sie bei der Reduktion des TSP-Problems genau eine Eigenschaft,
so reduziert, dass die Dreiecksungleichung nicht galt.
Und dann müssen sie nochmal zeigen,
dass natürlich auch dieses modifizierte Problem noch empirisch schwer ist.
Optimierungsproblem mit beschwerst. So, aber das ist so,
machen wir hier nicht, aber auch das Problem ist irgendwie schwer.
Und wir versuchen, einen Approximationsverfahren zu wählen.
So, das Approximationsverfahren funktioniert wie folgt. Wir benutzen einen
Spannbaum-Algorithmus. Wir nehmen also diese Städte auf der Landkarte.
Wir betrachten als Graf den vollständigen Graf. Wir können also
alle Städte liebig miteinander verbinden, weil wir können mit dem
Auto oder Lastwagen von jeder Stadt zu jeder anderen Stadt fahren.
Ja, und jetzt berechnen wir einen minimalen Spannbaum darin.
So, das ist der erste Schritt. Jetzt haben wir einen Baum,
das ist alles andere als eine Rundtour durch alle Städte und
wir können jetzt quasi diesen Baum als einen Anhaltspunkt nehmen,
um die Rundtour zu definieren,
was wir nämlich machen
Wir werden einfach den Baum traversieren, also da einmal
drumherum laufen und quasi die Städte in dieser Reihenfolge besuchen.
Das ist der Algorithmus, das ist unsere Idee,
ist hier aufgeschrieben, es ist wieder ein ganz kurzer Algorithmus,
wir benutzen einen Spannbaum-Algorithmus auf diesem Grafen VE, V sind alle Städte,
eh sind alle Paare und C ist die Kostenfunktion,
also die Abstände zwischen den Städten.
Dann suchen wir uns einen beliebigen Startknoten aus aus der Knotenmenge
und dann machen wir einen Baumdurchlauf, einen Pre-Order Traversal,
erinnere sich vielleicht noch dran,
haben wir mal gesehen irgendwo bei den Suchbäumen
Schön an diesem Kapitel ist, man kann auch so schön
auf die vielen alten anderen Sachen verweisen.
Ja, hier ist nochmal der Traversal-Algorithmus. Wie geht das?
Das ist rekusiv, wir geben den Knoten V aus,
das ist Pre-Order, erst den Knoten ausgeben, dann die Kinder.
Dann durchlaufen wir die Addiazenzliste, das ist jetzt die Addiazenzliste
des Baumes. Deswegen habe ich hier Tee hingeschrieben,
sich die von dem ursprünglichen Grafs, nur von dem Baum.
Und für alle Knoten, die nicht im Parent entsprechen,
weil den müssen wir nicht ausgeben, das sind alle Kinder,
hier rufen wir die Funktion rekusiv auf.
Und die würde dann alle Knoten nach und nach besuchen.
So, jetzt brauchen wir
ein Bild
Hier ist ein Beispiel. Also das sind meine Städte hier
. Zwei, vier, sechs, acht Städte.
Und die sind jetzt hier auf so einem Caro-Papier,
um anzudeuten, dass wir jetzt hier ein metrisches Abstandsmaß verwenden.
Also wir können jetzt den Abstand nehmen,
die sind jetzt zwei Einheiten voneinander entfernt und die auch.
Und das ist irgendwie sowas wie Wurzel 2. So,
und jetzt würden wir für diesen, diese Knotenmenge einen Spannbaum berechnen.
Wie gesagt, jeder Knoten ist mit jedem verbunden.
Das ist hier nicht eingemalt, dann könnte man nichts mehr sehen.
Und der Spannbaum, der da rauskommt,
wäre zum Beispiel dieser hier
Es gibt auch andere Spannen, weil wir hier rauskommen können,
aber das ist ein möglicher minimaler Spannbaum. Die könnt ihr jetzt,
könnt ihr zum Beispiel auch hier liegen, wäre dann auch ein minimaler Spannbaum.
Das kommt jetzt bei meinem Algorithmus hier raus. Und jetzt mache ich meinen Traversal,
ich laufe quasi den Baum ab,
da gehe ich also von A jetzt hier runter,
nach hier, dann hier wieder hoch,
dann zu dem und dann geht die Rekursion hier rein,
hier rein,
hier rein und dann hier rein und dann bin ich wieder bei A angekommen.
Das kann man sich ganz gut so vorstellen,
als wenn man hier außen drumherum läuft, ja,
so laufen sie hier außen drumherum.
Das entspricht quasi dieser Rekursion, die sie durchführen. Und immer dann,
wenn sie einen Knoten das erste Mal sehen, dann nehmen sie den mit auf die Route.
Also sie sagen, ich fange hier bei A an,
dann fahre ich zu B, dann fahre ich zu zäh,
Der Traversal-Algorithmus geht dann wieder zurück zu B, aber im B waren wir schon.
Also können wir den weglassen, dann sehen wir Haar,
dann fahren wir also von C zu H. B hatten wir schon,
A, hatten wir schon, dann fahren wir zu D,
dann fahren wir zu E, dann zu F,
E hatten wir schon, dann fahren wir zu G,
hatten wir schon, hatten wir schon,
fahren zurück zu A. Ja, das ist die Rundtour,
die da rauskommt.
Die ist hier dargestellt, ne? A, B,
C, das sieht noch so aus wie der Baum
und dann laufen wir H.D.E.FG und dann zurück zur A.
Auch das sieht schon wieder nicht so dolle aus, ne?
Aber es ist zumindest eine Rundtour und, ja,
wie gut die ist, ist jetzt schwer, muss man alles ausrechnen hier,
jetzt auch nicht, aber offensichtlich ist sie nicht optimal.
Also das hier wäre natürlich eine viel geschicktere Art und Weise,
das zu machen. Offensichtlich ist das eine kürzere Strecke,
aber wir kriegen eine Rundtour und es liefert eine Lösung und
wir müssen jetzt irgendwie versuchen herauszufinden, wie gut diese Lösung ist.
So, wie können wir das machen? Ja,
wir zeigen, dass unser Approximationsverfahren,
auch wenn es an dem Beispiel nicht so toll aussieht,
einen maximalen Fehler von zwei haben wird, also Approx,
TSP, Tour ist ein Polynom-Zeit,
zwei Approximationsalgorithmus für das Tryingle TSP-Prom Problem, ja.
Polynomzeit und zwei Approximationen, also Polynomzeit müssen wir zeigen.
Okay, das ist einfach, ne?
Also Schwannbaum berechnen. Normalerweise würde da jetzt M-Login stehen,
ja, M für die Anzahl der Kanten,
so steht das irgendwo weiter vorne im Skript.
Jetzt ist jeder Knoten mit jedem anderen verbunden,
sind N-Quadrat, halbe, größenordnungsmäßig viele Kanten.
Also ist das hier N-Quadrat-Login? So, dann haben wir
den Pre-Order-Durchlauf für Tee. Da besuchen wir jeden Knoten ja
einmal, ja,
also O von
Ach, das stimmt eigentlich nicht ganz, aber naja,
es ist auf alle Fälle weniger als ein Quadrat und dann haben wir eine Gesamtlaufzeit von UVN-Quadrat-Login.
So, dann zweiter Teil, jetzt müssen wir
die Genauigkeit des Verfahrens zeigen. Wir brauchen wieder,
also bei dem Vertics-Cover-Problem hatten wir diese Menge A,
von den Kanten, die wir ausgewählt haben und diese Menge A,
die stand in Beziehungen zu der optimalen Lösung.
Wir wussten, dass die optimale Lösung nicht besser sein kann.
Und sie stand aber auch in Beziehung zu der berechneten Lösung.
Deswegen konnten wir
die Genauigkeit abschätzen
Hier brauchen wir so was ähnliches. Wir brauchen wieder irgendeine Größe,
die in Bezug steht zur Optimallösung und die in Bezug steht zu der errechnenden Lösung.
Und der Schlüssel bei diesem Algorithmus ist tatsächlich dieser Spannbaum.
Wir gehen also davon aus, H ist die Lösung,
die der Algorithmus berechnet, ist also die Tour und H. Stern ist die optimale Lösung.
Wir müssen hier sowas zeigen, wie das Gewicht von H.
geteilt durch das Gewicht von Haarstern, also die Länge,
wenn sie so wollen, ist kleiner gleich zwei.
Das ist also maximal, also H ist maximal doppelt so
groß wie die optimale Lösung
So, der minimale Spannbaum stellt in dem Gewicht,
was er hat, eine untere Schranke für Haarstern statt.
Warum kann die Tour nicht länger sein,
als der nicht kürzer sein als der minimale Spannbaum?
Stand da gerade. Scheine ich euch schnell zurückgeblättert.
Warum kann der nicht, also warum kann das nicht
kürzer werden, als die Summe dieser Kanten hier?
Fliegt da für alles Gute aus. Bei allem einmal an Ja.
Ja, okay. Also ich finde es jetzt nicht so
ganz, also es ist noch nicht so ganz klar.
Also es gibt eine relativ einfache Begründung. Schauen Sie sich
mal die optimale Lösung an hier. Jetzt entfernen Sie mal
eine Kante hier raus. Dann haben Sie einen Spannbaum.
Also wenn Sie eine Kante rausnehmen hier, haben Sie einen Schwannbaum.
Ja, Sie haben ja alle Knoten miteinander verbunden.
Das sieht nicht aus wie ein Baum, ist so ein
bisschen degeneriert, ja, aber ist offensichtlich ein Baum.
Das heißt, der Spannbaum ist ja der minimale Spannbaum, den wir finden.
Und dieser Spannbaum aus der optimalen Tour mit einer gelöschten Kante
ist auf alle Fälle von der Länge her ja,
dann länger als der minimale Spannbaum.
Und deswegen kann die Rundtour, die wir haben,
nie kürzer sein als der minimale Spannbaum. Okay,
also das Gewicht eines minimalen Spannbaums, der heißt jetzt T-Stern,
das ist der, der ist ja optimal, der minimale Spannbaum.
Sternchen immer für die optimal. Stellt eine untere Schranke für
die Länge der optimalen Tour dar.
Warum? Durchlöschen einer Kante aus der Tour entsteht ein Baum,
ein Spannbaum, ja,
und die Größe der Tour ist eben die Größe des Spannbaums
plus diese eine Kante,
die wir wieder stammen
Und für die optimale Tour gilt dann also das W von Haarstern,
größer gleich W von Teestern sein muss.
Okay, also das ist offensichtlich nachvollziehbar. Das heißt,
der Spannbaum ist eine untere Schranke. Okay, und damit
haben wir eigentlich das Wichtigste gezeigt. Wir könnten jetzt mal sagen,
okay, wir betrachten jetzt mal die tatsächlichen,
den tatsächlichen Umlauf, den wir überrechnen.
Wir gehen also jetzt in A los, dann laufen wir runter zu B,
zu C und jetzt tun wir mal so,
als wenn wir tatsächlich wieder zurückgehen.
Wir gehen von C wieder zurück zu B,
dann gehen wir zu Haar, dann gehen wir wieder zu B,
zu A, zu D,
zu E,
zu F,
dann gehen wir wieder zu
Zu geh, wieder zu E, zu D, zu A.
Das ist hier oben aufgeschrieben. Das ist die Tour quasi,
wenn wir exakt diesem Baum nachlaufen würden. Das ist jetzt
noch nicht so eine Rundtour, wie wir sie gerne hätten,
weil wir wollen ja jede Stadt nur einmal in dieser Liste drin,
das ist noch nicht so ganz so optimal,
aber wir machen einfach Folgendes.
Wir streichen einfach alle Städte, wenn sie zum zweiten oder
dritten Mal vorkommen, streichen wir die einfach raus.
Und was passiert dann? Also gucken wir es mal für
B an. Also wir hatten jetzt A, B,
C. Jetzt würden wir von C über B wieder zu Haar
laufen und B hatten wir aber schon gesehen.
Das heißt, wir müssen nicht zu B laufen und statt
von C über B zu Haar zu laufen,
gehen wir direkt von C zu Haar
Betrachten das Tryingle-TSV-Problem. Das heißt, das TSP-Problem,
wo die Dreiecksumgleichung gilt, die brauchen wir genau jetzt an dieser Stelle,
weil die Strecke von Zehner H. ist nämlich garantiert kürzer als
die Strecke von C. über B nach H. Wegen der Dreiecksumgleichung.
So, das heißt,
wir können den Knoten B auch löschen und aus der Tour C,
eine Tour C-Strich machen, wo dann A,
B,
C das Löschen bekommt,
H und dann löschen wir immer alle doppelt vorkommenden und
dann haben wir unsere Liste C-Strich und die ist von
der Länge her kürzer als die ursprüngliche Tour
Wegen der Dreiecksumgleichung. Okay, und damit haben wir
eigentlich schon alles gezeigt, das müssen wir noch aufschreiben.
Wenn also C, der Zyklus ist,
der sich durch einmaliges Umlaufen von Tee ergibt.
Also hier laufen wir einmal rum, dann kommen die Städte noch doppelt vor.
C enthält jede Kante eh aus dem Spannbaum-Tee zweimal.
Also sie sehen für jede Kante,
wir laufen einmal da runter und irgendwann hier wieder rauf.
Das heißt, jede Kante des Spannbaums kommt zweimal in dieser
Sequenz vor. Das heißt, die Länge unseres Zyklus,
den wir beschreiben, ist gleich zweimal die Länge des Spannbaums
Den wir haben. So, jetzt müssen wir Knoten aus diesem Zyklus löschen,
weil wir ja jeden Knoten nur einmal haben wollen,
aber dieses Löschen führt immer nur zu einer Verkürzung wegen der Dreiecksumgleichung.
Jetzt habe ich ihn hier oben aufgeschrieben und gemalt. Das bedeutet,
die Route H, die wir erzeugen,
indem wir in C sukzessive diese Knoten rauslöschen,
die kann nicht größer sein als der ursprüngliche Zyklus,
also W von H, das ist das,
was der Algorithmus berechnet,
ist kleiner gleich W von C,
der ursprüngliche Zyklus und W von C,
das ist zweimal
das Gewicht des Spannbaums hier
Ja, und wir wissen, der Spannbaum hier,
das ist ja der minimale Spannbaum,
ist von seinem Gewicht her höchstens so groß wie die optimale Tour.
Das bedeutet, das ist kleiner gleich zweimal weh von Haarstern.
Und dann haben wir das Verhältnis zwischen den beiden hergestellt und haben gezeigt,
unser Algorithmus ist maximal ein Faktor zwei schlechter als das Optimum.
Es ist ein sehr schöner Algorithmus, es ist eine sehr,
ja, eine tolle Strategie. Und sie sehen,
der Schlüssel bei dieser Entwicklung der Approximationsalgorithmen sind tatsächlich die Schranken.
Also irgendetwas zu finden, von dem sie garantieren können über eine Schranke,
dass sie nicht schlechter sind als ein gewisser Faktor von dieser Schranke.
Das ist hier der Spannbaum. Bei der Knotenüberdeckung war es,
diese Anzahl der Kanten, diese Menge der Kanten, die wir ausgewählt haben.
Und über so etwas baut man Approximationsalgorithmen. Okay. Das
ist ein zweites Beispiel. Wenn die Beispiele hier bei Ihnen suggeriert haben,
das ist ja im Prinzip relativ einfach,
da möchte ich Sie darauf hinweisen, dass das zwei sehr,
sage ich mal, Lehre geeignete Beispiele sind, die sehr einfach sind.
In der Regel ist das Entwickeln von Approximationsalgorithmen schwierig.
Also tatsächlich auf so einen Zusammenhang zu kommen,
den wir hier sehen, überhaupt nicht einfach.
Also schon bei dem ist es nicht so einfach. Also wenn sie sich nochmal,
sind wir schwer, wenn man eine Lösung kennt,
sich wieder in die Lage reinzuversetzen, man würde sie nicht kennen,
aber wenn sie sich nochmal jetzt hineinversetzen und sie schauen sich dieses Problem an,
jetzt drauf zu kommen, na,
man fängt mal mit dem Spannbaum an.
Es ist für mich nicht so naheliegend, dieser Gedankengang.
Es ist also ein sehr, sehr schönes Verfahren um diesen Faktor 2 zu berichten.
So, und jetzt könnten wir sagen, okay,
jetzt haben wir hier diese Drecksungleichung gebraucht,
aber vielleicht gibt es ja auch einen Algorithmus,
der nicht diese Drecksungleichung braucht und trotzdem
einen Faktor
Hat, in der Approximation. Und abschließend will ich Ihnen zeigen,
dass Sie sogar die Approximierbarkeit oder die Nicht-Approximierbarkeit nachweisen können.
Denn bei der Approximierbarkeit kommen Sie ja vielleicht in
das gleiche Problem wie mit dem ursprünglichen Problem.
Also Sie haben ein Problem. Sie sagen,
ich kann es nicht lösen, es ist endlich schwer.
Ich brauche mindestens exponentielle Zeit. Das hatten wir ja schon.
Sagen Sie Ihrem Vorgesetzten, Ihrem Chef. Dann sagt Ihr Chef,
der hat ja auch Informatik studiert, dann machen Sie doch einen Approximationsalgorithmus.
Und dann stehen Sie wieder da und müssen nachweisen,
dass es ihn gibt oder dass es ihn nicht gibt.
Und das geht auch. Und es geht quasi exakt mit
der gleichen Technik. Und das möchte ich Ihnen noch zeigen
für das TSP-Problem. Also die Annahme wäre jetzt,
keine Ahnung, Sie kennen Dryingle TSP, das Verfahren,
haben Sie irgendwann mal gesehen, so wie hier.
Und jetzt sagen Sie, die Dreiecksumgleichung gilt nicht.
Jetzt fangen Sie an, sagen, ja,
da muss es irgendwie auch ein Approximationsalgorithmus geben.
So, und Sie können nachweisen, dass es den nicht gibt.
Wenn P ungleich NP ist, davon gehen wir ja immer aus,
bei der NP-Vollständigkeitstheorie gilt für jedes Roh größer als eins,
das für TSP kein Polynom-Zeitapproximationsalgorithmus mit Approximationsfaktor Roh existiert
Egal, wie groß sie diese Schranke wählen.
Selbst wenn sie sagen, ich akzeptiere einen Fehlerfaktor 10 oder 100.
Also es ist hundertmal schlechter als die ursprüngliche, ob das die optimale Lösung.
Wird es kein Polynomzeitalgorithmus geben, der diesen Approximationsfaktor erreicht?
Vorausgesetzt P ist ungleich NP. Die Sache ändert sich erst,
wenn der Faktor nicht mehr konstant ist.
Dann haben sie eine andere Situation. Solange der konstant ist,
können sie nachweisen, dass es den nicht gibt
Und der Trick ist hier, naja,
sie können natürlich ein Approximationsproblem, also das Problem hinter dem Approximationsalgorithmus,
ist ja auch ein Entscheidungsproblem, ja?
Die Frage ist dann einfach, ja,
ihr Algorithmus startet mit dem Graphen und die Frage ist,
existiert ein, eine, was weiß ich,
eine kürzeste Rundtour mit maximalen Fehlern romal der ursprünglichen Tour?
Ja, und dann können sie über das Approximationsproblem
ein Entscheidungsproblem formulieren
Und dann haben sie ein Entscheidungsproblem und dann können sie die NP Vollständigkeitstheorie verwenden,
um nachzuweisen, ob dieses als Entscheidungsproblem formulierte Fragestellung,
ob die NB vollständig ist oder nicht.
Das machen wir wie folgt. Wir gehen also davon aus,
wir haben einen Rohapproximationsalgorithmus A zur Lösung des NP vollständigen Problems.
Und nein, Entschuldigung, wir nehmen unseren,
ja wir haben diesen Algorithmus und den nehmen wir jetzt
zur Lösung eines anderen NP Vollständigen Problems
Wollte ich sagen, ja. Das Problem, was
wir nehmen, ist Hamilton Cycle. Das ist sehr,
sehr verwandt zum Spannbarenproblem. Da haben sie einen Graf.
Jetzt haben sie nicht mehr alle Kanten,
sondern nur einen Teil der Kanten und sie fragen,
ob überhaupt irgendeine Rundtour existiert, wo sie jeden Knoten nur einmal sehen.
Ja, das ist Hamilton Cycle. So,
wir gehen von einem ganzzahligen Fehlerfaktor aus.
So, und wir machen eine Reduktion. Wir sagen einfach,
wir haben die Eingabe von Hamilton Cycle,
also ein Grafen VE
Und wir fragen jetzt, gibt es da jetzt so eine Rundtour?
Wir dürfen natürlich nur die Kanten nehmen aus der Menge E.
Während bei TSP konnten wir ja von jedem Knoten zu heben,
das ist der Unterschied zwischen diesen beiden Problemen.
So, jetzt machen wir eine Eingabe für TSP und die machen wir befolgt.
Wir nehmen einfach die gleichen Knoten, wir machen eine neue Kantenmenge.
Jeder Knoten ist mit jedem verbunden, das muss so sein bei TSP.
Und wir haben dafür aber Gewichte. Und die Gewichte setzen wir so,
das Gewicht ist eins, wenn die Kante in dem ursprünglichen Grafen vorkommt.
Und wenn die Kante nicht vorkommt, dann machen wir die gar ganz teuer.
Und zwar, sie geben mir den Approximationsfaktor 1000 und ich sage Ihnen,
diese Kante kostet jetzt tausendmal die Anzahl der Knoten,
die überhaupt vorkommen, plus eins.
Ja, ich mache die Kanten, die also in dem ursprünglichen Rahmen nicht vorkommen,
die mache ich ganz teuer, ganz groß.
Ja, und setzt sie auf so eine enorm große Zahl. Ja,
und dann sieht man sofort,
dass sie mit dem Approximationsalgorithmus das NPV vollständige Problem lösen könnten,
ja, weil wenn die einen Hamilton Cycle hat,
also sie haben einen Zeigel,
dann gibt es natürlich in dem ursprünglichen Grafen auch eine Rundtour,
wo sie nur Kanten benutzen können,
die zu dem ursprünglichen Grafen gehören.
Das heißt, der hat eine Rundtour der Länge
Betrag von
In dem Markt gelaufen, da einfach nur über diese Kanten,
die in dem ursprünglichen Graf kommt. Wenn der keinen Hamilton Cycle hat,
also wenn sie keine Rundtour finden können in dem Grafen,
dann müssen sie ja irgendwann mal eine von diesen richtig teuren Kanten nehmen bei der Rundtour.
Um den Kreis irgendwie zu schließen, müssen sie den nehmen.
Und dann hat die Tour in dem Grafengestrich die Länge größer Romalbetrag von V,
weil allein schon diese eine Kante ja größer ist als Romalbetrag von V. So,
und wenn sie das TSP-Problem jetzt aber mit einem Fehlerfaktor roh lösen können,
dann können sie ja diesen Fall von diesem unterscheiden, weil wenn ihr Fehler,
wenn diese Lösung existiert und der Fehler ist maximal roh,
groß, dann dürfen sie diese Lösung nicht resultieren,
nicht bekommen.
Das heißt, der Approximationsalgorithmus löst in diesem Fall das NPV-Volständige Entscheidungsproblem Hamilton Cycle.
Und zwar in polynumieller Zeit, weil das soll ja ein polynumielles Approximations,
ein polynumieller Approximationsalgorithmus sein. Okay, das zeigt,
dass wir zwar für Triggle TSP ein Uproxym, ein Zwei-Approximationsalgorithmus finden konnten,
dass wir aber für das allgemeine TSP-Problem unter der Annahme PS Ungleich NP keinen polynomiellen, konstanten Approximationsalgorithmus finden können.
Geht nicht. Und wenn man jetzt noch ein bisschen drüber nachdenkt,
dann müsste man einen so in den Kopf schießen,
irgendwo muss ja hier wieder diese Dreiecksumgleichung eine Rolle spielen,
weil scheinbar, wenn die Dreiecksumgleichung gilt,
dann darf ja dieser Beweis nicht funktionieren,
sonst können sie ja unseren Algorithmus gar nicht geben.
Und in der Tat ist das auch so,
weil wenn sie diese Kanten nehmen, die so teuer sind,
ja, dann erfüllen die die Dreiecksungleichung nicht.
Diese Kante ist viel, viel länger als irgendwelche Pfade,
die die beiden Knoten miteinander verbinden. In dem ursprünglichen Grafen
. Das heißt, diese Konstruktion ist sogar so gebaut,
dass sie die Dreiecksungleichung explizit für all diese Kanten nicht erfüllt.
Und dadurch funktioniert der Beweis. Also insofern ist
die Dreiecksungleichung da ganz wichtig. Ja, gut,
soviel zum TSP-Problem, werden uns das TSP-Problem nochmal angucken,
etwas später bei den Heuristiken
Abschließende Kommentare zur Approximationsalgorithmen. Also, wir setzen sie ein
zur Lösung, endlich schwere Optimierungsprobleme, mit einer Gütegarantie.
Wenn wir also eine Gütegarantie haben wollen,
und zwar sollen sie dann in polynomärer Laufzeit laufen.
Also das endlich schwere Problem mit polynomärer Laufzeit lösen,
keine optimale Lösung, aber eine mit einem maximalen Fehler.
Wenn wir das entwickeln wollen, dann müssen wir
den Approximationsfaktor nachweisen, dass der Algorithmus den hat.
Dazu ist es notwendig, irgendeine Beziehung zu finden zwischen dem,
was der Algorithmus berechnet und der optimalen Lösung
Das kriegen wir nicht hin in der Regel,
aber wir können in den meisten Fällen eine Schranke finden,
wie gut unsere optimale Lösung bestenfalls werden kann.
Und dann können wir diese Schranke in Beziehung setzen zu der
berechneten Lösung und kriegen darüber eine Abschätzung der Güte des Verfahrens.
Wir haben schon an einem Beispiel gesehen, es gibt Probleme,
die wir nachweislich nicht mit einem konstanten Faktor approximieren können.
Ja, und da könnte man sagen, ja,
aber nur für die konstanten Faktoren,
aber wenn Sie mal drüber nachdenken, ja,
also wenn Sie sich so einen konstanten Faktor nicht hinkriegen,
ist es für die Praxis in der Regel irrelevant.
Ja, wenn Sie es nicht schaffen quasi, weiß ich nicht,
einen Faktor oder 100, ja, hundertmal schlechter als das Optimum.
Das ist irgendwie, ich kann mir kaum was vorstellen,
wo sowas noch relevant ist, so eine Lösung.
Oder so eine Schranke. Okay, also,
Nicht-Approximierbarkeit können wir durch Reduktion nachweisen. Und das andere,
was sie auch behalten sollten aus diesem Teil der Vorlesung,
ist, dass manchmal Randbedingungen das Problem enorm vereinfachen können.
Und dass man nicht sozusagen wenn man ein Problem sieht,
einfach sagen muss, oh ja,
das ist ja so, wie das Traveling Sales-Person-Problem,
oder es ist so wie ein Vertex-Cover-Problem,
und damit hat man das abgehakt, sondern dass man genau schauen muss,
welche Bedingungen gelten für diese speziellen Grafen in der Praxis.
Sowas wie eine Dreiecksungleichung kann das Problem einfach enorm vereinfachen.
Gut, so, die verbleibende Viertelstunde möchte ich noch nutzen,
um schon ein bisschen was über exakte Verfahren zu sagen.
Wir werden uns ein bisschen damit auseinandersetzen, wie wir die Probleme dann lösen können,
wenn wir darauf angewiesen sind, die richtige Lösung zu finden.
Ab jetzt betreten wir die Welt der exponentiellen Algorithmen,
ja, also die Verfahren, die wir sehen werden,
da wird es keinen einzigen geben, von denen wir nachweisen können,
dass da irgendwie Polino ihre Laufzeit hat,
weil sonst hätten wir ja P gleich NP nachgewiesen.
So, wie gehen wir vor? Also wie gehen wir vor,
um eine exakte Lösung für sein schwieriges Problem zu finden?
Also selbst wenn wir die exponentielle Laufzeit akzeptieren,
heißt es ja noch nicht, dass es trivial ist,
so einen Algorithmus zu finden.
Wir brauchen ja immer noch eine Strategie,
wie wir das machen können
Wenn man mal schaut, dann gibt es eigentlich bei fast allen Problemen,
die wir so kennen, wenn sie so einen kombinatorischen Touch haben,
die Tatsache, dass sie sich irgendwie aus Teilentscheidungen zusammensetzen.
Wenn sie zum Beispiel das Klickproblem anschauen,
dann ist es eigentlich eine Menge, also wenn sie Ennenknoten haben,
von N-Entscheidungen, wo sie für jeden Knoten sagen,
der gehört zur Klick oder der gehört nicht zur Klick.
Wenn sie das TSP-Problem betrachten, dann haben sie
auch solche punktuellen Entscheidungen, die sind ein bisschen anders.
Sie können nicht sagen, der gehört dazu oder der gehört
nicht dazu, weil sie besuchen ja alle Knoten.
Aber sie hatten so eine lokale Entscheidung, dass sie sagen,
wenn ich an dem Knoten V bin,
zu welchem Knoten soll ich als nächstes gehen?
Und da gibt es auch nur dann wieder Möglichkeiten
Ja, und so können sie die optimale Lösung immer aus
Teillösungen zusammensetzen. Und diese Tatsache, die nutzen wir,
um dann die exponentiellen Algorithmen zu entwerfen.
Okay, wenn wir so kombinatorische Probleme haben,
dann können wir alle möglichen Lösungen in der Regel aufzählen.
Ja, Klickproblem ist eigentlich nicht so schwer. Wir können sagen,
wir haben diese Menge der Knoten und für jeden Knoten können wir sagen,
du gehörst dazu, du gehörst nicht dazu.
Ja, wir könnten zum Beispiel einen Vektor mitnehmen mit Nullen
und Einsen, für jeden Knoten eine Stelle,
Und dann zählen wir da alle Binärzahlen auf, wenn sie so wollen.
Wir sagen, wir machen alle möglichen Muster von Nullen und Einsen.
Wir bilden also alle möglichen Teilemengen,
die wir bilden können, sind exponentiell viel,
aber klar, wir haben ja sowieso schon akzeptiert,
dass wir exponentielle Laufzeit haben.
Die könnten wir enormorieren, aufzählen und dann einfach gucken,
ob wir eine Krieg finden. Das ist exponentielle Laufzeit,
wenn wir sie sowieso haben, warum nicht so.
Das heißt, wir können durch Aufzählen des Löses des Lösungsraums
in der Regel solche Probleme lösen.
Das ist meistens teuer, aber gut,
das war jetzt klar in diesem Kapitel
Also ich würde mal sagen,
dass mindestens 95 Prozent wahrscheinlich sogar noch mehr aller Probleme,
die wir haben, in eine von zwei Kategorien fallen.
Entweder es sind Selektionsprobleme oder es sind Zuordnungsprobleme.
Ein Selektionsproblem ist, sie müssen irgendwie eine Menge auswählen,
aus einer größeren Menge, die eine Eigenschaft hat.
Das Kriegproblem ist ein Selektionsproblem, das Word-Decks-Cover-Problem ist ein Selektionsproblem.
Das Subsets-Hump-Problem ist ein Selektionsproblem. Sie wählen ein paar Zahlen aus,
die in der Summe einen speziellen Wert ausgeben sollen.
Alles Selektionsprobleme. Das ist die eine Kategorie und die
andere Kategorie sind zuordnungs- oder Reihenfolgeprobleme
Ja, ein bisschen selter, seltener, aber die gibt es auch,
als zum Beispiel das TSP-Problem ist so ein Reihenfolgeproblem.
Sie wissen, sie müssen alle Städte besuchen, nur die
Reihenfolge ist nicht klar. Die, die Assignment-Probleme sind Reihenfolgeprobleme,
wenn sie Objekte zu Slots zuordnen müssen mit minimalem Kosten oder sowas.
Alle Arten von diesem Zuordnungsproblem sind Reihenfolgeprobleme. Vielleicht erinnern sie
sich an so Probleme wie dieses Knappsack-Problem von unserem Dieb.
Ist ein Reihenfolgeproblem. Man muss entscheiden,
in welcher Reihenfolge wählt er die Objekte aus,
welche kommen in seinen Rucksack und welche nicht
Nee, Entschuldigung, das ist gerade ein Selektionsproblem.
Das war jetzt gerade falsch, okay, das ist ein Selektionsproblem.
Okay, gut, aber also in der Regel haben wir diese beiden Varianten.
Gut, so, Lösungseinsatz wäre erstmal, wir innummerieren.
Also wir innummerieren den Lösungsraum und deswegen brauchen wir als allererstes mal
Algorithmen zum E-Nummerieren. Ja, gute Algorithmen zum E-Nummerieren.
Wie innummerieren wir? Selektionen innummerieren wir, indem wir einfach
alle möglichen Teilmengen bilden, ja?
Okay, wie machen wir das? Wir haben eine gewisse
Grundmenge, also Klickprobleme,
wir haben alle Knoten
Ja. Und für jedes Element der Grundmenge reservieren wir einen Bit.
Ja, und dann haben wir einen langen Binärstring.
Der hat dann also Betrag von G,
viele Bits und B von I gleich Null bedeutet,
das IT-Element der Grundmenge ist in der Teilmenge nicht enthalten.
Und eins heißt, es ist in der Menge enthalten.
Okay, jetzt müssen wir die ja alle aufzählen.
Diese Bitvektoren. Und die Frage ist, wie können wir
das machen? Wir müssen also so einen Bitzähler irgendwie bauen.
Den finden sie noch im Kormen. Ich hoffe, dass
sie Kapitelnummer noch stimmt. Das habe ich jetzt nicht nochmal überprüft in dem Neuen,
aber ich nehme an, dass das noch ungefähr stimmt.
Da gibt es das Binary Increment. Das Binary Increment macht folgendes.
Sie haben also eine beliebige BNR-Zahl Und Binary Increment rechnet ihnen die nächstgrößere Binärzahl aus.
Das ist eigentlich ein ganz einfaches Problem. Sie nehmen einfach
die Zahl addieren eins, wenn sie so wollen.
Aber jetzt können Sie sich überlegen, was macht eigentlich der Computer,
wenn er eigentlich eins auf eine Binärzahl addiert?
So, so eine Increment-Funktion, die ist super praktisch,
weil wenn wir eine Increment-Funktion haben,
dann können wir in der Implementierung diesen Aufzählmechanismus komplett trennen von dem Problem.
Wir können dann einfach immer sagen, egal welches Selektionsproblem wir lösen,
gib mir jetzt mal die nächste Menge.
Und dann gibt er uns die nächste Menge und zählt die
sozusagen dabei auf
Okay, so, so ein Increment würde so funktionieren.
Für Binärzahlen, Is am Anfang null.
Und also B enthält schon eine Binärzahl,
die geht dann von null bis die Länge von B. Is am Anfang null,
solange I kleiner ist als die Länge.
Hier ist auch noch ein Fehler, das müsste B. längs heißen.
Und B von I ist gleich eins. Das kann ja
eins oder null sein, das Itebit hier.
Setzen wir das B von I auf null
und gehen zum nächstgrößeren Element.
Also I wird zu I
plus eins
Ja, und dann machen wir es so weiter.
Und wenn I kleiner ist als die Länge von B,
das ist auch noch falsch, B. längs,
dann wird das B von I auf 1 gesetzt.
So, ich zeige Ihnen mal eben Bild, wollen wir uns das angucken.
Hier, hier ist Binary Increment. Ja, das heißt,
Sie haben hier eine Zahl und das ist ungefähr so wie,
ja, diese alten mechanischen Tachozähler.
Immer wenn Sie neun haben, dann ist da so ein Häkchen
dran und dann zählen Sie die nächste Zahl auch noch mit.
Das ist hier bei den Einsen. Sie fangen hier hinten an. Hier haben Sie eine Eins,
wir haben Sie eine Eins, wir haben Sie eine Eins,
die gehen so lange, bis Sie die erste Null sehen,
während Sie hier lang laufen,
kippen Sie diese Bits alle nach Null um und die erste Null,
die Sie sehen,
wandeln Sie in eine Eins
Und beim nächsten Mal wetten sie sich schon die Freundin eine Null,
da würden sie also hier eine einzeln schreiben.
Beim nächsten Mal sind sie eins, dann würden die eine Null umwandeln.
Hier schreiben sie eine einzelnen. So funktioniert ein Binärinkrementzähler.
Das ist ein ganz einfaches Verfahren. Okay, und damit
können sie Selektionsprobleme im Prinzip lösen. So einfach würde man
es dann in der Regel dann doch nicht machen,
weil, naja,
da zählen sie ja wirklich alles auf und wahrscheinlich hat man gewisse Randbedingungen,
wo um die Aufzählung von vornherein zu beschränken.
Und wir werden uns in der nächsten Vorlesung ein Problem mal anschauen,
wo wir alle möglichen Tricks anwenden,
um den Aufzählprozess einfach zu verbessern
Ja. Okay, das ist für Binärzahlen schwieriger, ist es ehrlich gesagt bei den Reihenfolgeproblemen.
Ja, also wenn wir jetzt ein Reihenfolgeproblem haben,
dann müssen wir quasi für eine Zahlenfolge alle möglichen Permutationen ausrechnen.
Das ist ja beim TSP-Problem. Wir fangen an,
indem wir sagen, wir besuchen die Städte in der Reihenfolge 1,
2, 3, 4, 5, 6,
7 bis 10. Ja, und dann würden wir sagen,
okay, das nächste wäre jetzt zum Beispiel,
wir fangen den 1 zu 2 und dann zu 1 und
dann zu 3 oder so.
Wir müssen die irgendwie vertauschen. Und das bedeutet,
wir müssen alle Permutationen aufzählen. Okay,
also bei TSP wäre das Creditic Assignment wäre das also
der Fall
So, wie geht das? Wie können wir Permutationen aufzählen?
Das ist ein rekrusiver Algorithmus, der alle Permutationen hier aufzählt.
Der macht das wie folgt. Sie haben hier so
ein Zähler-I. Wenn das I gleich eins ist,
also I ist die Länge des Arrays von Zahlen,
was sie permutieren wollen. Wenn das eins ist,
dann haben sie nur eine Zahl, dann machen sie irgendwas.
Also dann haben sie eine Permutation gefunden und dann können sie
irgendwie einfach überprüfen, wie lang die Rundtour ist oder irgendwas.
So, anderenfalls sagen sie, okay,
ich zähle mal alle Permutationen auf, die,
bei der die letzte Ziffer gleich bleibt und die ersten I
minus eins ziffern,
sich ändern
Und dann haben sie eine Schleife und gehen von
der Position 1 bis zur Position i minus 1,
vertauschen das ETE-Element mit dem Jotten-Element und sehen dann wieder alle Permutationen der ersten i minus 1 Stellen auf.
Und dann tauschen sie das wieder zurück. Das ist ein
Verfahren, mit dem sie alle Permutationen aufzählen können.
Können sie es mal ausprobieren. So, das funktioniert,
dann kriegen sie alle Permutationen der Reihe nach raus.
Ist aber eigentlich nicht so schön,
weil wenn sie sich jetzt vorstellen,
sie wollen jetzt ein Problem lösen mit diesem Verfahren,
dann müssen sie irgendwo in dieses rekusive Konzept hier
ihren Algorithmus reinschreiben,
der dann zum Beispiel
das TSP-Problem löst
Also sie haben ja diese riesen Rekursion und irgendwo an den
Rekursionsenden rufen sie dann aus ihre Bewertungsfunktion auf oder so.
Das ist unschön. Viel schöner wäre es,
einen Algorithmus zu haben, der ausgehend von einer Zahlenfolge,
einfach die nächstgrößere Permutation ausrechnet.
Kann man machen. Es ist auch nicht so schwer.
Man muss ein bisschen überlegen, wie das funktioniert.
Ich zeige ihn, glaube ich, erst mal das Bild.
Das ist ein bisschen einfacher. Also das ist meine Zahlenfolge
hier. Ja, ich habe jetzt neuen Ziffern.
Meine Zahlenfolge ist 6-3-2,
7-9, 8-5-4-1.
Da könnten Sie
sich überlegen, TSP-Problem
Neun Städte. Ich beginne anstatt Nummer sechs, dann drei,
dann zwei, dann sieben und so weiter.
So ist also eine Permutation dieser Zahlenfolge. So,
wenn ich das jetzt mal als Zahlen interpretiere,
dann wäre ja das ja so was wie,
ach du meine Güte, 632 Millionen, 798.541.
Dann wäre es so eine große Zahl. So,
die Frage ist, was ist jetzt die nächstgrößere Permutation?
Also was ist die nächstgrößere Zahl, die sie hier aufbauen können?
Jetzt kann ich sagen, ich addiere da einfach eins,
weil sie dürfen ja jede Ziffer nur einmal benutzen.
Also insofern ist es nicht so ganz so easy wie hier
und funktioniert aber im Prinzip fast genauso.
Was sie machen ist, sie starten hier hinten
Und sie gucken sich die Folge an. Und solange die
Folge aufsteigend ist, das soll der Haken hier andeuten.
Solange die Zahlen größer werden, gehen sie immer weiter nach nach links.
Bis zu der ersten Zahl, die kleiner ist.
Das ist hier an der Position Sechser steht eine 7.
Da gehen sie, das ist kleiner geworden. So,
was sie jetzt machen ist, von dem Maximum in der
hinteren Folge gehen sie jetzt so lange wieder zurück.
Bis zur letzten Zahl, die noch größer ist als die Zahl,
die sie hier gefunden haben. Das wäre die Acht.
Das ist der Parameter T. in unserem Algorithmus,
oder die Variable T. Das ist die Position oder die Variable S in unserem Algorithmus.
Dann vertauschen sie, Die 8 mit der 7,
also die Zahl vor der Tee mit dem S,
dann steht hier die 8,
da die 7. Und dann sind sie aber noch nicht fertig,
dann müssen sie diese Folge nehmen und in der Reihenfolge umdrehen.
Ja, also sie würden die 8 vertauschen,
sind mit der 7, dann steht hier 8, 9,
hier würde ja die 7 stehen und die drehen sie alle um,
dann schreiben sie 1, 4, 5, 7,
9. Also die neue Folge ist dann 8, 1,
4, 5, 7,
9. Das ist die nächstgrößere Zahl vom Wert her,
vom Dezimalwert, die sie bilden können,
wenn alle Ziffern unterschiedlich sind
Vielleicht hat der ein oder andere von ihnen mal Lust,
ein so Doku-Lösungsalgorithmus zu schreiben, da braucht man das.
Ja, das geht viel geschickter, aber egal, so könnte man. Okay,
gut, so und beim nächsten Mal würden Sie hier anfangen,
da würden Sie sehen, 9, 7,
da fällt das sofort, da würden Sie beiden nur vertauschen.
Hätten Sie ja 4, 5, 9, 7.
Beim nächsten Mal würden Sie sehen, 7, 9,
dann haben Sie hier das Maximum, hier fällt das wieder ab,
die Folge 5. Sie nehmen die nächst größere Zahl,
die 7 tauschen die dahin,
drehen die Reihenfolge um und so weiter.
Damit kann man
Permutationen aufzählen
Das ist meiner Meinung nach ein sehr wichtiger Algorithmus, steht nicht im Kormen drin.
Und hier ist der Pseudo-Code dazu. Wie geht das?
Also wir haben das Array von 1 bis zur Länge der Zahlen.
Am Anfang stehen da die Zahlen von 1 bis zur Länge drin. TS1,
jetzt laufen wir als erstes von hinten nach vorne,
solange die Folge aufsteigend ist, also sagen wir,
PT plus 1 größer ist als PT, addieren wir eins drauf.
Und dann laufen wir von, dann gucken wir, ob wir,
naja, ob wir nicht am Ende des Arrays angekommen sind,
also dann hätten wir die größte Zahl gefunden.
Anderenfalls Beginnen wir mit S an der Zahl Tee und laufen wieder rückwärts,
S wird zu S minus eins, bis zu der ersten Zahl S,
die dann nicht mehr größer ist als Tee plus eins.
Wir vertauschen die beiden. Und diese Vorschleife vertauscht den hinteren
Teil der Sequenz. Und damit können sie die aufzählen.
So, damit können wir quasi zwei sehr elementare Dinge tun
und können im Prinzip sowohl selektions- als auch Reihenfolgeprobleme lösen.
Allerdings wird die reine Anwendung dieser Innovationsverfahren in den allermeisten Fällen
viel zu langsam sein.
Unabhängig davon, ob was exponentiell und was nicht exponentiell ist
Und an einem Beispiel werden wir uns das in der
nächsten Vorlesung anschauen, wie viel das ausmachen kann,
diese Strategien wirklich geschickt zu nutzen.
Okay, das wäre es dann gewesen für heute