\documentclass[11pt]{article} \input{style_guide.tex} \title{\textbf{\Huge Komplexität verstehen}\\[0.5em] \large Das grafische Fundament zu \textit{Analyse von Algorithmen und Komplexität}\\[0.3em] \normalsize CAU Kiel -- Sommersemester 2026 \quad$\cdot$\quad Ausgabe 3} \author{} \date{} \begin{document} \maketitle \thispagestyle{empty} \begin{center}\itshape\large Alles, was du brauchst, um den Kurs zu \emph{verstehen} --\\ mit Bildern, Beispielen und Fragen zum Selbstprüfen. \end{center} \vfill \noindent\textbf{Wozu dieses Heft.} Es baut dein \emph{Fundament}: Begriffe, Regeln, Probleme und ihre Zusammenhänge. Danach kannst du den ganzen Stoff nachvollziehen -- und bist bereit, in Präsenz-, Haus- und Klausuraufgaben selbst zu rechnen. \medskip \noindent\textbf{So arbeitest du damit (wichtig!).} Am Ende jedes Kapitels stehen \textbf{Abruf-Fragen}. Beantworte sie \emph{schriftlich aus dem Kopf}, \emph{bevor} du im Lösungsanhang (Anhang~\ref{sec:loesungen}) nachsiehst. Dieses aktive Erinnern ist der eigentliche Lerneffekt -- nur Lesen reicht nicht. \medskip \noindent\textbf{Die Kästen und ihre Rollen.} \begin{center}\small \begin{tabular}{ll} \ding{72}~Intuition & die Idee in einfachen Worten\\ \ding{43}~Analogie & ein Bild aus dem Alltag\\ \ding{110}~Definition & die präzise Fassung\\ \ding{115}~Satz & ein Ergebnis mit Beweis\emph{idee}\\ \ding{108}~Beispiel & durchgerechnet, mit echten Zahlen\\ \ding{52}~Warum in NP? & Zertifikat und Prüfung des Problems\\ \ding{43}~Idee & die Konstruktion hinter einer Reduktion/einem Beweis\\ \ding{73}~Aha & die Pointe\\ \ding{55}~Stolperstein & der häufige Fehler\\ \ding{228}~Zusammenhang & wie es ins Ganze passt\\ \textbf{?}~Abruf & prüfe dich -- Lösung nur im Anhang\\ \end{tabular} \end{center} \vfill \newpage \tableofcontents \newpage % ################################################################## \section{Ein Problem, das sich wehrt} % ################################################################## \begin{ziel} Wir treffen ein Problem, das harmlos aussieht und trotzdem jeden Computer überfordert. Daran verstehst du, warum es eine Theorie der \glqq schweren\grqq{} Probleme gibt. \end{ziel} \subsection{Cliquen in einem Graphen} Ein \emph{Graph} besteht aus \emph{Knoten} (Punkte) und \emph{Kanten} (Verbindungen). Eine \emph{Clique} ist eine Gruppe von Knoten, in der \emph{jeder mit jedem} verbunden ist. Das \emph{Cliquenproblem} fragt: Gibt es eine Clique aus mindestens $k$ Knoten? \begin{bsp}{Clique mit dem Auge} \setlength{\unitlength}{1cm} \begin{center} \begin{picture}(4,2.7)(-0.5,-0.4) \put(0,1){\circle*{0.13}}\put(-0.45,1){\small $1$} \put(1,2){\circle*{0.13}}\put(0.95,2.2){\small $2$} \put(2,1){\circle*{0.13}}\put(2.2,1.05){\small $3$} \put(1.4,0){\circle*{0.13}}\put(1.3,-0.42){\small $4$} \put(3,0.5){\circle*{0.13}}\put(3.2,0.4){\small $5$} \put(0,1){\line(1,1){1}} \put(0,1){\line(1,0){2}} \put(1,2){\line(1,-1){1}} \put(2,1){\line(-3,-5){0.6}} \put(2,1){\line(2,-1){1}} \end{picture} \end{center} $\{1,2,3\}$ bildet ein Dreieck -- eine Clique der Größe 3. $\{2,3,4\}$ ist keine: zwischen 2 und 4 fehlt die Kante. Eine 4er-Clique gibt es hier nicht. \end{bsp} \subsection{Warum der naive Weg explodiert} Wie sucht ein Computer eine $k$-Clique? Naiv: \emph{alle} Knotengruppen der Größe $k$ durchprobieren. Bei $n$ Knoten und $k = n/2$ sind das mindestens $2^{n/2}$ Gruppen. \begin{bsp}{Der Graben zwischen $n^3$ und $2^{n/2}$} \setlength{\unitlength}{1cm} \begin{center} \begin{picture}(8,4.4)(-0.6,-0.5) \put(0,0){\vector(1,0){7.5}} \put(7.2,-0.45){\small Eingabegröße $n$} \put(0,0){\vector(0,1){4}} \put(-0.55,3.8){\small Zeit} % polynomiell n^3 (flach ansteigend) \qbezier(0,0)(4,0.4)(7,1.7) \put(7.1,1.6){\small $n^3$ (polynomiell)} % exponentiell 2^(n/2) (schnell steil) \qbezier(0,0)(2.9,0.15)(3.7,4) \put(3.4,4.05){\small $2^{n/2}$ (exponentiell)} % "machbar"-Linie \multiput(0,3)(0.3,0){12}{\line(1,0){0.15}} \put(4.2,3.05){\small \itshape Grenze des Machbaren} \end{picture} \end{center} Die polynomielle Kurve bleibt lange flach. Die exponentielle schießt fast senkrecht nach oben und durchbricht früh jede Zeitgrenze. \end{bsp} \begin{bsp}{Dieselbe Kluft in Zahlen} \begin{center} \begin{tabular}{rrr} \toprule $n$ & $n^3$ & $2^{n/2}$\\ \midrule $20$ & $8\,000$ & rund $1\,000$\\ $40$ & $64\,000$ & rund $1$ Million\\ $100$ & $10^6$ & rund $10^{15}$ (über ein Monat bei $10^9$/s)\\ $200$ & $8\cdot10^6$ & rund $10^{30}$ (länger als das Universum alt ist)\\ \bottomrule \end{tabular} \end{center} \end{bsp} \begin{intuition} \emph{Exponentielles} Wachstum verdoppelt den Aufwand bei jedem zusätzlichen Element. Ein doppelt so schneller Computer bringt dir dann genau \emph{einen} Knoten mehr. Hardware kann exponentielles Wachstum niemals einholen. Genau das macht ein Problem \glqq praktisch unlösbar\grqq. \end{intuition} \begin{satz}{Der naive Clique-Algorithmus ist exponentiell} Für $k = |V|/2$ braucht er mindestens $2^{|V|/2}$ Schritte.\\ \emph{Beweisidee:} Es sind $\binom{n}{n/2} \ge 2^{n/2}$ Gruppen zu prüfen. \end{satz} \subsection{Die eigentliche Frage} Vielleicht ist der naive Weg nur dumm und es gibt einen cleveren Trick? Für die Clique kennt bis heute niemand einen -- aber niemand hat auch bewiesen, dass es keinen gibt. \begin{aha} Die Komplexitätstheorie fragt nicht \glqq Wie löse ich das schnell?\grqq, sondern \glqq Ist das \emph{überhaupt} schnell lösbar -- oder gehört es zu einer ganzen Familie von Problemen, die gemeinsam scheitern?\grqq{} Diese zweite Frage können wir beantworten, obwohl die erste offen ist. \end{aha} \begin{abruf} \textbf{A1.} Warum hilft ein 1000-mal schnellerer Computer beim naiven Clique-Algorithmus kaum?\\ \textbf{A2.} Was ist der Unterschied zwischen \glqq wir kennen keinen schnellen Algorithmus\grqq{} und \glqq es gibt keinen\grqq -- und welchen der beiden Fälle hat die Wissenschaft für die Clique bewiesen? \end{abruf} % ################################################################## \section{Was heißt \glqq schnell\grqq?} % ################################################################## \begin{ziel} Wir machen \glqq effizient\grqq{} präzise und lernen die Klasse $\Pclass$ kennen -- die Probleme, die wir schnell lösen können. \end{ziel} \subsection{Laufzeit misst man in der Eingabegröße} Ein Algorithmus ist schnell oder langsam stets \emph{relativ zur Eingabegröße} $n$. Wir betrachten den \emph{schlechtesten Fall}: die maximale Schrittzahl über alle Eingaben der Länge $n$. \begin{defn}{Klasse P} $\Pclass$ ist die Menge der Entscheidungsprobleme, die ein Algorithmus in \emph{polynomieller} Zeit $O(n^d)$ (mit fester Zahl $d$) löst. Kurz: die \emph{effizient lösbaren} Probleme. \end{defn} \begin{intuition} \glqq Polynomiell = effizient\grqq{} ist eine Konvention, aber eine robuste: Praktische polynomielle Algorithmen haben kleine Exponenten ($n$, $n^2$, $n^3$), und die Grenze bleibt stabil, egal welchen realistischen Rechner man annimmt. Der wahre Bruch verläuft zwischen polynomiell und exponentiell -- den hast du in Kapitel 1 grafisch gesehen. \end{intuition} Beispiele in $\Pclass$: Sortieren, kürzeste Wege, minimale Spannbäume, Matching. \subsection{Probleme als Ja/Nein-Fragen} Die Theorie betrachtet \emph{Entscheidungsprobleme} -- Fragen mit Antwort Ja oder Nein. Statt \glqq Wie groß ist die größte Clique?\grqq{} fragt man \glqq Gibt es eine Clique mit $\ge k$ Knoten?\grqq \begin{analogie} Wie \glqq Ist das Paket schwerer als 5\,kg?\grqq{} statt \glqq Wie schwer genau?\grqq. Beantwortest du die Ja/Nein-Frage für jede Schranke, kennst du am Ende auch den genauen Wert -- du tastest ihn ein. Deshalb ist die Entscheidungsvariante \glqq gleich schwer\grqq{} wie das Optimierungsproblem, aber leichter zu vergleichen. \end{analogie} Formal kodiert man jede Eingabe als \emph{Wort} über einem Alphabet; ein Problem wird zur Menge seiner Ja-Wörter (einer \emph{Sprache}). Merke dir schlicht: \emph{ein Problem = die Menge seiner Ja-Eingaben}. \begin{stolper} \textbf{Zahlen sind binär kodiert.} Eine Zahl $K$ hat Eingabelänge nur $O(\log K)$, ihr \emph{Wert} ist exponentiell größer. Ein Algorithmus, der bis $K$ zählt, ist deshalb \emph{nicht} polynomiell. Daran hängt später die Schwere von \problem{SubSet Sum} und der Begriff \glqq pseudopolynomiell\grqq. \end{stolper} \begin{abruf} \textbf{A3.} Ist ein Algorithmus mit Laufzeit $n^4$ \glqq effizient\grqq{} im Sinne der Theorie? Begründe.\\ \textbf{A4.} Warum ist \glqq zähle von 1 bis zur Eingabezahl $K$\grqq{} \emph{kein} polynomieller Algorithmus, obwohl er so einfach aussieht? \end{abruf} % ################################################################## \section{Prüfen ist leichter als Lösen} % ################################################################## \begin{ziel} Wir entdecken die zentrale Beobachtung der Theorie -- Prüfen ist oft viel leichter als Lösen -- und lernen daraus die Klasse $\NP$ sowie ein Rezept, mit dem du für \emph{jedes} Problem zeigst, dass es in $\NP$ liegt. \end{ziel} \subsection{Die Sudoku-Beobachtung} \begin{analogie} Ein schweres Sudoku zu \emph{lösen} dauert. Eine \emph{fertige} Lösung zu \emph{prüfen} geht in einer Minute: Zeilen, Spalten, Blöcke abhaken. Lösen ist schwer, Prüfen ist leicht. Diese Asymmetrie \emph{ist} $\NP$. \end{analogie} Die vorgelegte Lösung heißt \emph{Zertifikat}, der Prüf-Algorithmus \emph{Verifizierer}. \begin{defn}{Verifizierer, Zertifikat, NP} Ein \emph{Verifizierer} für ein Problem $L$ bekommt die Instanz $x$ und einen Vorschlag $c$ und erfüllt \[ x \in L \iff \text{es gibt ein } c \text{ mit } A(x,c) = 1. \] $c$ heißt \emph{Zertifikat}. $L \in \NP$, wenn es einen Verifizierer gibt, der für jede Ja-Instanz ein \emph{polynomiell langes} Zertifikat in \emph{polynomieller} Zeit prüft. \end{defn} \begin{intuition} $\NP$ = effizient \emph{überprüfbar}, nicht effizient \emph{lösbar}. Das Zertifikat ist die abgekürzte Antwort auf \glqq und woher weiß ich, dass das stimmt?\grqq. Für Nein-Instanzen überzeugt \emph{kein} Vorschlag den Verifizierer. \end{intuition} \subsection{Der NP-Dreischritt -- so zeigt man \glqq $\in \NP$\grqq} Für \emph{jedes} Problem läuft der NP-Nachweis nach demselben Muster. Diesen Dreischritt brauchst du im ganzen Kurs. \begin{idee}{Nachweis \glqq $L \in \NP$\grqq} \textbf{(1) Zertifikat:} Was ist die \glqq Lösung\grqq? (Teilmenge, Belegung, Permutation.) Angeben, dass sie polynomiell lang ist.\\ \textbf{(2) Verifizierer:} Ein Algorithmus, der \emph{alle} geforderten Eigenschaften prüft. Zwei Richtungen der Korrektheit: Ja-Instanz $\Rightarrow$ es gibt ein akzeptiertes Zertifikat; Nein-Instanz $\Rightarrow$ keines wird akzeptiert. Laufzeit polynomiell.\\ \textbf{(3) Alternativ als Raten (NDTM):} \glqq Rate die Lösung, prüfe sie.\grqq{} Die Rateschritte \emph{sind} das Zertifikat. \end{idee} \begin{bsp}{Der Dreischritt für Clique} \textbf{Zertifikat:} eine Knotenmenge $C$ (ein Bit pro Knoten, also polynomiell). \textbf{Verifizierer:} prüfe, ob alle Paare in $C$ verbunden sind ($O(|C|^2)$) und ob $|C| \ge k$ ($O(|V|)$). \textbf{Korrektheit:} Gibt es eine $k$-Clique, wird sie akzeptiert; gibt es keine, scheitert jeder Vorschlag. Laufzeit polynomiell -- also $\problem{Clique} \in \NP$. \end{bsp} \begin{intuition} Die zweite Sicht (\glqq Raten\grqq) ist eine \emph{nichtdeterministische} Maschine, die an jeder Verzweigung alle Wege gleichzeitig verfolgt. Sie akzeptiert, wenn \emph{ein} Weg zum Ziel führt. Für eine Nein-Instanz führt \emph{kein} Weg zum Ziel. \glqq Zertifikat bekommen\grqq{} und \glqq richtig raten\grqq{} sind zwei Namen für dieselbe Sache. \end{intuition} \subsection{P steckt in NP -- und die Millionenfrage} \begin{satz}{$\Pclass \subseteq \NP$} Jedes effizient lösbare Problem ist auch effizient überprüfbar.\\ \emph{Beweisidee:} Wer selbst lösen kann, ignoriert das Zertifikat und rechnet die Antwort direkt aus. \end{satz} Die offene Umkehrung lautet: Gilt $\Pclass = \NP$? Ist alles, was man schnell \emph{prüfen} kann, auch schnell \emph{lösbar}? \begin{aha} Ob $\Pclass = \NP$, weiß niemand -- eines der sieben Millennium-Probleme (1\,Mio.\ Dollar). Die meisten glauben $\Pclass \ne \NP$. \emph{Alles Folgende -- NP-Vollständigkeit, ETH, Approximation -- ist der Umgang mit dieser Unwissenheit.} \end{aha} \begin{abruf} \textbf{A5.} Nenne die drei Schritte des NP-Nachweises und wende sie auf \problem{Vertex Cover} an (Zertifikat? Prüfung? Laufzeit?).\\ \textbf{A6.} Warum ist \glqq $L$ hat einen polynomiellen Verifizierer\grqq{} nicht dasselbe wie \glqq $L$ ist in Polynomialzeit lösbar\grqq? \end{abruf} % ################################################################## \section{\glqq Mindestens so schwer wie\grqq{} -- Reduktionen} % ################################################################## \begin{ziel} Wir bauen das wichtigste Werkzeug der Theorie: die Reduktion. Mit ihr vergleichst du Probleme nach Schwierigkeit, ohne für eines einen Algorithmus zu kennen. \end{ziel} \subsection{Ein Problem mit einem anderen lösen} \begin{analogie} Du willst wissen, ob eine Strecke länger als 1 Meile ist, hast aber nur ein km-Lineal. Du rechnest \glqq $>1$ Meile\grqq{} um in \glqq $>1{,}609$\,km\grqq{} und misst. Die \emph{Umrechnung} ist billig, das \emph{Messen} erledigt das fremde Werkzeug. Genau das ist eine Reduktion. \end{analogie} \begin{defn}{Polynomielle Reduktion $A \redp B$} Eine Funktion $f$, die jede $A$-Eingabe $w$ in eine $B$-Eingabe $f(w)$ übersetzt, sodass \[ w \in A \iff f(w) \in B, \] und die in polynomieller Zeit berechenbar ist. Schreibweise $A \redp B$. \end{defn} Der Datenfluss einer Reduktion, wenn man $A$ über einen $B$-Löser lösen will: \begin{center} \setlength{\unitlength}{1cm} \begin{picture}(13,2)(0,-0.3) \put(0,0.2){\framebox(2.4,1){\shortstack{$A$-Instanz\\ $w$}}} \put(2.4,0.7){\vector(1,0){1.4}} \put(2.5,0.9){\small $f$ (billig)} \put(3.8,0.2){\framebox(2.6,1){\shortstack{$B$-Instanz\\ $f(w)$}}} \put(6.4,0.7){\vector(1,0){1.4}} \put(6.5,0.9){\small $B$-Löser} \put(7.8,0.2){\framebox(2.2,1){\shortstack{Ja /\\ Nein}}} \put(10.0,0.7){\vector(1,0){1.4}} \put(10.05,0.9){\small ist Antwort} \put(11.4,0.2){\framebox(1.4,1){für $w$}} \end{picture} \end{center} \begin{intuition} $A \redp B$ heißt: \glqq $B$ ist \emph{mindestens so schwer} wie $A$.\grqq{} Denn ein schneller $B$-Löser ergibt (über $f$) auch einen schnellen $A$-Löser. Die Schwierigkeit fließt \emph{entlang des Pfeils}: Ist $A$ schwer, muss $B$ es auch sein. \end{intuition} \subsection{Die Richtung -- der teuerste Fehler} \begin{stolper} Um zu zeigen, dass ein \emph{neues} Problem $Y$ schwer ist, reduzierst du ein \emph{bekannt schweres} $X$ \emph{auf} $Y$: also $X \redp Y$ (\glqq bekannt $\redp$ neu\grqq). Die Reduktion nimmt eine $X$-Instanz und baut eine $Y$-Instanz. \textbf{Nie umgekehrt.} $Y \redp X$ würde nur zeigen, dass $Y$ \emph{höchstens} so schwer wie $X$ ist -- das sagt über $Y$ nichts. \end{stolper} \begin{analogie} Willst du beweisen, dass ein neuer Boxer stark ist, schickst du den \emph{amtierenden Champion} gegen ihn -- nicht einen Anfänger. \glqq Bekannt stark $\redp$ neu.\grqq \end{analogie} \begin{satz}{Transitivität} $A \redp B$ und $B \redp C$ $\Rightarrow$ $A \redp C$.\\ \emph{Beweisidee:} Umformungen hintereinander schalten; die Zwischenausgabe ist polynomiell groß, also bleibt alles polynomiell. \end{satz} Deshalb kann eine ganze \emph{Kette} von Reduktionen die Schwere Glied für Glied weitertragen -- das nutzen wir gleich. \begin{abruf} \textbf{A7.} Du weißt: \problem{Clique} ist schwer. Du willst zeigen, dass \problem{Vertex Cover} schwer ist. In welche Richtung reduzierst du, und warum genau so?\\ \textbf{A8.} Was bedeutet $A \redp B$ für die relative Schwierigkeit von $A$ und $B$ -- in einem Satz? \end{abruf} % ################################################################## \section{Die härtesten Probleme: NP-vollständig} % ################################################################## \begin{ziel} Wir fassen die schwersten Probleme in $\NP$ mit einem Namen und sehen, warum \emph{ein} schneller Algorithmus für eines von ihnen die ganze Landschaft zum Einsturz brächte. \end{ziel} \begin{defn}{NP-schwer, NP-vollständig} \begin{itemize} \item $L_0$ ist \emph{NP-schwer}: \emph{jedes} $L \in \NP$ lässt sich auf $L_0$ reduzieren ($L \redp L_0$). \item $L_0$ ist \emph{NP-vollständig}: NP-schwer \textbf{und} selbst in $\NP$. \end{itemize} \end{defn} \begin{intuition} Zwei Schranken: \begin{itemize} \item \emph{NP-schwer} = \textbf{untere} Schranke (\glqq mindestens so schwer wie alles in $\NP$\grqq). \item \emph{$\in \NP$} = \textbf{obere} Schranke (\glqq nicht schwerer als $\NP$\grqq). \end{itemize} NP-vollständig = die schwersten Probleme \emph{innerhalb} von $\NP$. \end{intuition} \begin{stolper} NP-schwer heißt \emph{nicht} \glqq in $\NP$\grqq. Es gibt NP-schwere Probleme außerhalb von $\NP$ -- das Halteproblem (Kapitel~\ref{sec:halt}) ist nicht einmal lösbar und trotzdem NP-schwer. \end{stolper} \begin{satz}{Ein schneller Algorithmus für eins löst alle} Ist $L_0$ NP-vollständig, dann: $\Pclass = \NP \iff L_0 \in \Pclass$.\\ \emph{Beweisidee:} Läge $L_0$ in $\Pclass$, könnte man jedes $L \in \NP$ lösen: erst $L \redp L_0$ rechnen, dann den schnellen $L_0$-Löser. \end{satz} \begin{aha} Fände jemand für \emph{ein einziges} NP-vollständiges Problem einen polynomiellen Algorithmus, wären \emph{schlagartig alle} NP-Probleme effizient lösbar. Solange das niemandem gelingt, ist ein NP-Vollständigkeitsbeweis das stärkste Indiz für \glqq vermutlich kein effizienter Algorithmus\grqq. \end{aha} \subsection{Der Anker: Cook--Levin} \begin{satz}{Cook (1971), Levin (1973)} \problem{SAT} ist NP-vollständig -- das \emph{erste} solche Problem.\\ \emph{Beweisidee:} Man nimmt ein \emph{beliebiges} $L \in \NP$ mit seiner ratenden Maschine und gießt deren Rechnung in eine logische Formel. Variablen beschreiben \glqq Zustand zur Zeit $t$\grqq, \glqq Bandinhalt\grqq{} usw. Die Formel ist so gebaut, dass \emph{erfüllende Belegungen genau akzeptierenden Rechenwegen entsprechen}. Also: $L$-Ja-Instanz $\iff$ Formel erfüllbar. \end{satz} \begin{idee}{Vererbungskorollar -- das Arbeitspferd} Um ein neues Problem $Y$ als NP-vollständig zu zeigen, brauchst du nur zwei Dinge:\\ \textbf{(1)} eine Reduktion $X \redp Y$ von \emph{einem} bekannten NP-vollständigen $X$, und\\ \textbf{(2)} den Nachweis $Y \in \NP$ (NP-Dreischritt).\\ Dann ist $Y$ NP-vollständig -- denn $L \redp X \redp Y$ für alle $L \in \NP$. \end{idee} \subsection{Die Landkarte der Schwere} Alle Probleme des Kurses hängen an \emph{einer} Kette ab \problem{SAT}. Der Pfeil heißt \glqq wird reduziert auf\grqq{} (Schwere fließt nach unten). \begin{center} \setlength{\unitlength}{1cm} \begin{picture}(13,8.7)(0,-0.3) % Wurzel \put(5.1,7.7){\framebox(2.4,0.7){\textbf{\problem{SAT}}}} % Ebene 1 \put(6.3,7.7){\vector(-2,-1){2.6}} % zu 3-SAT \put(6.3,7.7){\vector(0,-1){1.3}} % zu Clique \put(6.3,7.7){\vector(2,-1){2.6}} % zu 3-DM \put(2.6,5.7){\framebox(2.0,0.7){\problem{3-SAT}}} \put(5.3,5.7){\framebox(2.0,0.7){\problem{$k$-Clique}}} \put(8.0,5.7){\framebox(2.0,0.7){\problem{3-DM}}} % Ebene 2 \put(3.6,5.7){\vector(0,-1){1.3}} \put(6.3,5.7){\vector(0,-1){1.3}} \put(9.0,5.7){\vector(0,-1){1.3}} \put(2.6,3.7){\framebox(2.0,0.7){\problem{$k$-Color}}} \put(5.1,3.7){\framebox(2.4,0.7){\problem{IS}, \problem{VC}}} \put(8.0,3.7){\framebox(2.0,0.7){\problem{3-EC}}} % Ebene 3 \put(3.6,3.7){\vector(0,-1){1.3}} \put(6.3,3.7){\vector(0,-1){1.3}} \put(9.0,3.7){\vector(0,-1){1.3}} \put(2.2,1.7){\framebox(2.8,0.7){$\problem{HK}\to\problem{TSP}$}} \put(5.1,1.7){\framebox(2.4,0.7){\problem{FVS}, $\Delta$-Cover}} \put(8.0,1.7){\framebox(2.0,0.7){\problem{SubSetSum}}} % Ebene 4 \put(9.0,1.7){\vector(0,-1){1.3}} \put(6.8,0.0){\framebox(3.6,0.7){\problem{Partition}, \problem{Knapsack}, $P\|\Cmax$}} \end{picture} \end{center} \begin{intuition} Beim Lesen des nächsten Kapitels immer fragen: \glqq Von welchem Nachbarn erbt dieses Problem seine Schwere?\grqq{} Die Probleme sind nicht einzeln schwer, sondern \emph{gemeinsam} -- verbunden durch diese Pfeile. \end{intuition} \begin{abruf} \textbf{A9.} Welche zwei Dinge musst du zeigen, um ein neues Problem als NP-vollständig zu beweisen? Welchen davon vergisst man leicht?\\ \textbf{A10.} Warum wäre $\Pclass = \NP$, wenn jemand \problem{SubSet Sum} in Polynomialzeit löste? \end{abruf} % ################################################################## \section{Der Problem-Zoo}\label{sec:zoo} % ################################################################## \begin{ziel} Wir gehen alle Probleme des Kurses durch. Zu jedem: was es fragt, \emph{warum es in $\NP$ liegt} (Zertifikat), \emph{woher} seine Schwere kommt und die \emph{Idee} der Reduktion -- oft als Bild. \end{ziel} \noindent So liest du jeden Eintrag: \textbf{Definition} (was gefragt ist) $\to$ \textbf{Warum in NP?} (Zertifikat) $\to$ \textbf{Idee} (woher die Schwere, wie die Reduktion baut). Alle diese Probleme sind NP-vollständig. \subsection{Logik: SAT und 3-SAT} \begin{defn}{SAT und 3-SAT} \problem{SAT}: Formel in konjunktiver Normalform (UND von Klauseln, jede Klausel ein ODER von Literalen $x_j$/$\neg x_j$) -- gibt es eine erfüllende Belegung?\\ \problem{3-SAT}: dasselbe mit höchstens 3 Literalen pro Klausel. \end{defn} \begin{zert} \textbf{Zertifikat:} die Belegung $\psi$ (ein Bit pro Variable). \textbf{Prüfung:} Formel unter $\psi$ auswerten -- linear in der Formellänge. \end{zert} \begin{idee}{$\problem{SAT} \redp \problem{3-SAT}$ -- lange Klauseln aufspalten} Ersetze eine lange Klausel per Hilfsvariablen durch eine \emph{Kette} von 3er-Klauseln, z.\,B. $(y_1 \vee \dots \vee y_n) \leadsto (y_1 \vee y_2 \vee x_1)\wedge(\neg x_1 \vee y_3 \vee x_2)\wedge\dots$ Ist ein $y_i$ wahr, lässt sich die $x$-Kette passend setzen; ist \emph{keines} wahr, erzwingt die Kette einen Widerspruch. Erfüllbarkeit bleibt gleich. \end{idee} \subsection{Graphen: das Dualitätsdreieck} Drei Probleme, die im Grunde eines sind -- aus drei Blickwinkeln. \begin{defn}{Clique, Independent Set (IS), Vertex Cover (VC)} Gegeben $G$ und $k$. \problem{Clique}: Gruppe, in der \emph{alle} paarweise verbunden sind, Größe $\ge k$? \problem{IS}: Gruppe, in der \emph{keine} zwei verbunden sind, Größe $\ge k$? \problem{VC}: Knotenmenge, die \emph{jede} Kante berührt, Größe $\le k$? \end{defn} \begin{zert} \textbf{Clique/IS:} Zertifikat ist die Gruppe; prüfe alle Paare ($O(|V|^2)$) und die Größe. \textbf{VC:} Zertifikat ist die Knotenmenge; prüfe für jede Kante, ob ein Endpunkt drin liegt ($O(|E|)$), und die Größe. \end{zert} \begin{aha} \textbf{Ein Bild, drei Rollen.} In $G$ mit $n$ Knoten: \[ C \text{ Clique in } G \iff C \text{ IS in } \bar G \iff V\setminus C \text{ VC in } \bar G. \] Links dieselbe Knotenmenge $\{1,2,3\}$ in $G$ (Clique) und rechts im Komplement $\bar G$ (Independent Set); der Rest $\{4\}$ ist dort ein Vertex Cover. \end{aha} \begin{bsp}{Das Dreieck sichtbar} \setlength{\unitlength}{1cm} \begin{center} \begin{picture}(11,2.8)(0,-0.4) % ---- G links ---- \put(0.6,2.2){\small $G$: $\{1,2,3\}$ ist Clique} \put(1,0){\circle*{0.13}}\put(0.7,-0.05){\small $1$} \put(1,1.6){\circle*{0.13}}\put(0.6,1.55){\small $2$} \put(2.4,0.8){\circle*{0.13}}\put(2.55,0.75){\small $3$} \put(3.6,0.8){\circle*{0.13}}\put(3.75,0.75){\small $4$} \put(1,0){\line(0,1){1.6}} % 1-2 \qbezier(1,0)(1.7,0.4)(2.4,0.8) % 1-3 \qbezier(1,1.6)(1.7,1.2)(2.4,0.8) % 2-3 % ---- Gbar rechts ---- \put(6.3,2.2){\small $\bar G$: $\{1,2,3\}$ IS, $\{4\}$ VC} \put(6.6,0){\circle*{0.13}}\put(6.3,-0.05){\small $1$} \put(6.6,1.6){\circle*{0.13}}\put(6.2,1.55){\small $2$} \put(8.0,0.8){\circle*{0.13}}\put(7.7,0.95){\small $3$} \put(9.4,0.8){\circle*{0.13}}\put(9.55,0.75){\small $4$} \qbezier(6.6,0)(8.0,0.4)(9.4,0.8) % 1-4 \qbezier(6.6,1.6)(8.0,1.2)(9.4,0.8) % 2-4 \put(8.0,0.8){\line(1,0){1.4}} % 3-4 \end{picture} \end{center} In $\bar G$ sind genau die früheren Nicht-Kanten vorhanden. $\{1,2,3\}$ hat dort keine innere Kante (IS), und Knoten 4 allein berührt alle Kanten (VC). \end{bsp} \begin{idee}{$\problem{SAT} \redp \problem{Clique}$ -- ein Knoten pro Literal} Baue für jedes Literalvorkommen einen Knoten $[i,j]$. Verbinde zwei Knoten genau dann, wenn sie aus \emph{verschiedenen} Klauseln stammen und sich \emph{nicht widersprechen}. Suche eine Clique der Größe $k = m$ (Anzahl Klauseln). Eine solche Clique wählt aus jeder Klausel ein widerspruchsfreies wahres Literal -- also eine erfüllende Belegung. \end{idee} \begin{bsp}{$\problem{SAT} \redp \problem{Clique}$ -- die Lösungs-Clique} $F = (x_1\vee x_2\vee x_3)\wedge(\neg x_1\vee\neg x_2)\wedge(x_1\vee\neg x_2\vee\neg x_3)$, $m=3$. Acht Knoten in drei Klausel-Spalten; fett die Clique $\{[1,1],[2,2],[3,1]\}$ ($x_1,\neg x_2,x_1$). \setlength{\unitlength}{1cm} \begin{center} \begin{picture}(10,3.4)(-0.5,-0.3) % Spalte 1 (x=0.5) \put(0.5,2.6){\circle*{0.16}}\put(-0.55,2.55){\small $[1,1]\,x_1$} \put(0.5,1.5){\circle{0.16}}\put(-0.05,1.4){\small $x_2$} \put(0.5,0.5){\circle{0.16}}\put(-0.05,0.4){\small $x_3$} \put(1.1,3.1){\small Klausel 1} % Spalte 2 (x=4.5) \put(4.5,2.6){\circle{0.16}}\put(4.7,2.55){\small $\neg x_1$} \put(4.5,1.5){\circle*{0.16}}\put(4.7,1.45){\small $[2,2]\,\neg x_2$} \put(4.0,3.1){\small Klausel 2} % Spalte 3 (x=8.5) \put(8.5,2.6){\circle*{0.16}}\put(7.2,2.55){\small $x_1\,[3,1]$} \put(8.5,1.5){\circle{0.16}}\put(8.7,1.45){\small $\neg x_2$} \put(8.5,0.5){\circle{0.16}}\put(8.7,0.4){\small $\neg x_3$} \put(7.6,3.1){\small Klausel 3} % Clique-Kanten (fett): [1,1]-[2,2], [2,2]-[3,1], [1,1]-[3,1] \linethickness{1.2pt} \put(0.5,2.6){\line(4,-1){4}} % [1,1]-[2,2] \put(4.5,1.5){\line(4,1){4}} % [2,2]-[3,1] \put(0.5,2.6){\line(1,0){8}} % [1,1]-[3,1] \end{picture} \end{center} Die drei fetten Kanten bilden das Dreieck (die 3-Clique). Sie liefert $x_1=\true,\ x_2=\false$ -- und das erfüllt $F$. \end{bsp} \begin{idee}{$\problem{Clique} \redp \problem{VC}$ und $\redp \problem{IS}$} Reine Umformung (das Dualitätsdreieck): für IS gib $(\bar G, k)$ aus, für VC gib $(\bar G, n-k)$ aus. Kein Gadget nötig. \end{idee} \subsection{Färbung, Hamiltonkreis, TSP} \begin{defn}{$k$-Color, Hamiltonkreis (HK), TSP} \problem{$k$-Color}: Knoten mit $k$ Farben färben, sodass keine Kante gleiche Enden hat?\\ \problem{HK}: Rundweg, der jeden Knoten genau einmal besucht?\\ \problem{TSP} (Entscheidung): Rundreise durch alle Städte mit Länge $\le L$? \end{defn} \begin{zert} \textbf{Color:} die Färbung $f$; prüfe jede Kante ($O(|E|)$). \textbf{HK:} die Knoten-Reihenfolge (Permutation); prüfe, ob jede Folgekante existiert und jeder Knoten einmal vorkommt. \textbf{TSP:} die Reihenfolge; addiere die Distanzen und vergleiche mit $L$. \end{zert} \begin{idee}{Woher ihre Schwere kommt} \problem{$k$-Color} erbt von \problem{3-SAT} (Gadget mit $n{+}1$ Farben, das jede Variable auf wahr/falsch zwingt). \problem{HK} erbt von der 3-Literal-Variante $\problem{3-SAT}'$ (A-Komponenten kodieren die Variablensetzung, B-Komponenten prüfen die Klauseln). \problem{TSP} erbt von \problem{HK}: echte Kanten Distanz 1, fehlende Kanten sehr groß, $L = |V|$ -- eine kurze Tour \emph{ist} ein Hamiltonkreis. \end{idee} \begin{idee}{$\problem{VC} \redp \problem{FVS}$ -- ungerichtet wird gerichtet} \problem{Feedback Vertex Set}: entferne $\le k$ Knoten, sodass ein \emph{gerichteter} Graph kreisfrei wird. Reduktion: mache aus jeder ungerichteten Kante \emph{zwei antiparallele Bögen} (einen 2-Kreis). Ein Knoten, der die Kante \glqq überdeckt\grqq{}, zerstört genau diesen Kreis. \setlength{\unitlength}{1cm} \begin{center} \begin{picture}(8,1.4)(0,-0.3) \put(0.6,0.4){\circle*{0.13}}\put(0.3,0.55){\small $u$} \put(2.6,0.4){\circle*{0.13}}\put(2.8,0.55){\small $v$} \put(0.6,0.4){\line(1,0){2}} \put(1.4,-0.15){\small ungerichtet} \put(4.0,0.7){\vector(1,0){2}} \put(6.0,0.1){\vector(-1,0){2}} \put(4.5,0.75){\circle*{0.13}}\put(4.2,0.9){\small $u$} \put(6.0,0.1){\circle*{0.001}} \put(6.05,0.55){\circle*{0.13}}\put(6.2,0.6){\small $v$} \put(4.3,-0.2){\small zwei antiparallele Bögen} \end{picture} \end{center} \end{idee} \subsection{Mengen und Zahlen} \begin{defn}{3-DM, 3-EC, SubSet Sum, Partition, Knapsack} \problem{3-DM}: drei gleich große Mengen, Tripel; wähle Tripel, die jedes Element genau einmal treffen. \problem{3-EC}: 3-elementige Mengen; wähle einige, die das Universum exakt (disjunkt) überdecken. \problem{SubSet Sum}: Zahlen und Ziel $K$; Teilmenge mit Summe genau $K$? \problem{Partition}: Teilmenge mit genau der halben Gesamtsumme? \problem{Knapsack}: Auswahl mit Gewicht $\le B$ und Profit $\ge P$? \end{defn} \begin{zert} Für alle: das Zertifikat ist die \emph{Auswahl} (Tripelmenge, Mengenauswahl, Teilmenge). Prüfung: Summen bzw. Überdeckungsbedingungen nachrechnen und Schranken vergleichen -- alles in $O(n)$ bis $O(n^2)$. \end{zert} \begin{idee}{$\problem{3-EC} \redp \problem{SubSet Sum}$ -- Mengen werden Ziffern} Schreibe jede 3-elementige Menge als Bitvektor über dem Universum und lies ihn als \emph{Zahl zur Basis $n+1$}. Beispiel $U=\{u_1,\dots,u_6\}$: \begin{center}\small \begin{tabular}{lcl} \toprule Menge & Bitvektor & Zahl (Basis $n{+}1$)\\ \midrule $\{u_1,u_5,u_6\}$ & $100011$ & $(n{+}1)^0+(n{+}1)^4+(n{+}1)^5$\\ Ziel $K$ & $111111$ & $\sum_{i=0}^{5}(n{+}1)^i$\\ \bottomrule \end{tabular} \end{center} Bei Basis $n+1$ und $\le n$ Summanden gibt es \emph{keinen Übertrag}. Die Zielsumme wird genau dann getroffen, wenn jede Stelle exakt einmal überdeckt ist -- eine exakte Überdeckung. \end{idee} \begin{idee}{$\problem{SubSet Sum} \redp \problem{Partition}$ -- zwei Zusatzzahlen} Aus $(c_1,\dots,c_n,K)$ mit $N=\sum c_j+1$ ergänze $c_{n+1}=N-K$ und $c_{n+2}=K+1$. Gesamtsumme $2N$, Hälfte $N$. Die beiden Zusatzzahlen summieren zu $N+1$, können also nie zusammen in \emph{eine} Hälfte -- eine Halbierung existiert genau dann, wenn eine Original-Teilmenge $K$ trifft. \end{idee} \begin{zushang} \problem{Knapsack} enthält \problem{SubSet Sum} als Spezialfall ($w_j=p_j$, $P=B$) -- deshalb auch schwer. Und \problem{Partition} reduziert weiter auf Scheduling (nächster Abschnitt). \end{zushang} \subsection{Scheduling: $P\|\Cmax$} \begin{defn}{$P\|\Cmax$} $n$ Jobs mit Laufzeiten $p_j$, $m$ identische Maschinen. Verteile sie so, dass die höchste Maschinenlast (der \emph{Makespan}) minimal wird. \end{defn} \begin{zert} \textbf{Zertifikat:} die Zuordnung Job $\to$ Maschine. \textbf{Prüfung:} pro Maschine die Last summieren, Maximum bilden, mit der Schranke vergleichen -- $O(n)$. \end{zert} \begin{idee}{$\problem{Partition} \redp P2\|\Cmax$} Nimm die Partition-Zahlen als Jobs, zwei Maschinen. Beide Maschinen exakt gleich auszulasten heißt, die Zahlen zu \emph{halbieren}. Also ist $P\|\Cmax$ schon für $m=2$ NP-vollständig. \end{idee} \begin{abruf} \textbf{A11.} Gib für \problem{Hamiltonkreis} das Zertifikat und die Prüfung an (NP-Dreischritt).\\ \textbf{A12.} Erkläre in eigenen Worten, warum bei $\problem{3-EC}\redp\problem{SubSet Sum}$ die Basis $n+1$ (und nicht z.\,B. Basis 2) gewählt wird.\\ \textbf{A13.} \problem{Vertex Cover} und \problem{Independent Set} hängen eng zusammen. Wie -- und wie überführt man das eine ins andere? \end{abruf} % ################################################################## \section{Wie schwer \emph{genau}? Die ETH} % ################################################################## \begin{ziel} NP-Vollständigkeit sagt nur \glqq vermutlich nicht polynomiell\grqq. Die Exponentialzeit-Hypothese (ETH) sagt schärfer: \emph{wie} exponentiell -- und liefert konkrete untere Schranken. \end{ziel} \subsection{Die Lücke, die NP-Vollständigkeit lässt} NP-Vollständigkeit unterscheidet nicht zwischen $2^n$ und $2^{\sqrt n}$ -- beide sind \glqq nicht polynomiell\grqq. Oft will man aber wissen: geht es wenigstens \emph{subexponentiell}? \begin{defn}{Klein-o und subexponentiell} $f(n)=o(g(n))$ heißt: $f$ wächst echt langsamer, $f(n)/g(n)\to 0$. Achtung: $\delta n$ ist \emph{nicht} $o(n)$. Ein \glqq $2^{o(n)}$-Algorithmus\grqq{} läuft subexponentiell (z.\,B. $2^{\sqrt n}$). \end{defn} \begin{bsp}{Drei Wachstumsklassen im Bild} \setlength{\unitlength}{1cm} \begin{center} \begin{picture}(9,4.2)(-0.5,-0.5) \put(0,0){\vector(1,0){8.5}} \put(8.2,-0.45){\small $n$} \put(0,0){\vector(0,1){3.8}} \put(-0.5,3.6){\small Zeit} % polynomiell \qbezier(0,0)(4.5,0.5)(8,1.4) \put(8.1,1.35){\small poly} % subexponentiell 2^sqrt(n) \qbezier(0,0)(3.5,0.6)(6.5,3.6) \put(6.0,3.6){\small $2^{o(n)}$ (subexp.)} % exponentiell 2^n \qbezier(0,0)(2.3,0.5)(3.0,3.7) \put(2.6,3.75){\small $2^{n}$} \end{picture} \end{center} Die ETH behauptet: Für \problem{3-SAT} gibt es \emph{keinen} Algorithmus der mittleren Sorte -- es bleibt echt exponentiell. \end{bsp} \begin{defn}{Exponentialzeit-Hypothese (ETH)} Es gibt ein $\delta > 0$, sodass \problem{3-SAT} mit $n$ Variablen \emph{nicht} in Zeit $2^{\delta n}\cdot\poly$ lösbar ist. Kurz: kein $2^{o(n)}$-Algorithmus für \problem{3-SAT}. \end{defn} Das ist eine \emph{Annahme}, stärker als $\Pclass\ne\NP$, aber breit geglaubt. \subsection{Wie man ETH-Schranken beweist} \begin{idee}{Kontraposition entlang einer Reduktion} Man überträgt die Härte wie bei der NP-Vollständigkeit -- nur zählt man die \emph{Größe} der konstruierten Instanz mit: \begin{center} \setlength{\unitlength}{1cm} \begin{picture}(12.5,1.3)(0,-0.2) \put(0,0.2){\framebox(4.4,0.8){\shortstack{\small angeblich: $2^{o(\cdot)}$-Alg.\\ \small für Zielproblem $Y$}}} \put(4.4,0.6){\vector(1,0){1.6}} \put(4.5,0.75){\small Reduktion} \put(6.0,0.2){\framebox(3.4,0.8){\shortstack{\small ergibt $2^{o(m)}$-Alg.\\ \small für \problem{3-SAT}}}} \put(9.4,0.6){\vector(1,0){1.2}} \put(10.6,0.2){\framebox(1.9,0.8){\shortstack{\small Widerspruch\\ \small zur ETH}}} \end{picture} \end{center} \end{idee} \begin{satz}{Sparsification-Lemma -- warum es nötig ist} Unter der ETH gibt es auch keinen $2^{o(m)}$-Algorithmus für \problem{3-SAT} ($m$ = Klauselzahl).\\ \emph{Warum:} Die ETH spricht über $n$ (Variablen). Reduktionen erzeugen ihre Größe oft aus $m$ (Klauseln). Da $m$ groß gegen $n$ sein kann, folgt eine $m$-Schranke \emph{nicht} direkt aus der ETH -- das Lemma schließt die Lücke. \end{satz} \begin{stolper} Hängt der Parameter deiner konstruierten Instanz an der Klauselzahl $m$, musst du das Sparsification-Lemma zitieren. Das ist der am leichtesten vergessene Schritt in ETH-Beweisen. \end{stolper} Unter der ETH bekommt man so $2^{o(n)}$-Schranken u.\,a. für \problem{3-Color}, \problem{Clique}, \problem{VC}, \problem{IS}, \problem{SubSet Sum} und \problem{Partition}. \begin{abruf} \textbf{A14.} Wenn die ETH falsch ist -- folgt dann $\Pclass=\NP$? Begründe.\\ \textbf{A15.} Wozu braucht man das Sparsification-Lemma, wo die ETH doch schon eine untere Schranke liefert? \end{abruf} % ################################################################## \section{Damit leben: gute Näherungen}\label{sec:approx} % ################################################################## \begin{ziel} Für schwere \emph{Optimierungsprobleme} berechnet man in Polynomialzeit \emph{beweisbar gute} Näherungen. Wir sehen den Gütebegriff und die wichtigsten Algorithmen -- viele davon grafisch. \end{ziel} \subsection{Was heißt \glqq gute Näherung\grqq?} \begin{defn}{Multiplikative Güte} Mit $\OPT(I)$ = optimaler Wert. Algorithmus $A$ hat \emph{Güte $\alpha$}, wenn für alle $I$: Minimierung: $A(I)\le\alpha\cdot\OPT(I)$;\quad Maximierung: $\OPT(I)\le\alpha\cdot A(I)$. \emph{Scharf}, wenn Instanzen den Faktor (fast) erreichen. \end{defn} \begin{defn}{PTAS, EPTAS, FPTAS} Familie $(A_\varepsilon)$ mit Güte $1+\varepsilon$ für jedes $\varepsilon$: \emph{PTAS} polynomiell in $n$ je festem $\varepsilon$ ($\varepsilon$ darf im Exponenten stehen); \emph{EPTAS} Laufzeit $f(1/\varepsilon)\cdot\poly(n)$; \emph{FPTAS} polynomiell in $n$ \emph{und} $1/\varepsilon$ (stärkste Form). \emph{Pseudopolynomiell} = polynomiell in den Zahlen\emph{werten} (nicht in der Länge!). \end{defn} \subsection{TSP: der Algorithmus Schritt für Schritt} \begin{satz}{Allgemeines TSP ist gar nicht approximierbar} Für beliebige Distanzen: keine beschränkte Güte möglich (außer $\Pclass=\NP$).\\ \emph{Beweisidee:} Reduziere \problem{HK} -- echte Kanten Distanz 1, fehlende riesig. Ein Algorithmus mit Güte $\alpha$ müsste die billige Tour erkennen und löste damit \problem{HK}. \end{satz} Ausweg: \emph{metrisches} TSP mit Dreiecksungleichung $d(i,j)\le d(i,k)+d(k,j)$. Dort funktioniert folgender Dreisprung. \begin{idee}{$\Delta$TSP$_1$ (Güte 2): Spannbaum $\to$ verdoppeln $\to$ Eulerkreis $\to$ abkürzen} Der \emph{minimale Spannbaum} ist billiger als die optimale Tour. Verdoppeln macht alle Grade gerade (Eulerkreis existiert). Abkürzen des Eulerkreises verlängert dank Dreiecksungleichung nicht. \end{idee} \begin{bsp}{$\Delta$TSP$_1$ durchgerechnet (Skript-Zahlen)} Städte $A,B,C,D,E$ mit $d(A,E)=1,\ d(B,C)=1,\ d(A,C)=2,\ d(C,D)=2$ (übrige 2/3). Links der \textbf{minimale Spannbaum} (fett, Gewicht $6$): \setlength{\unitlength}{1cm} \begin{center} \begin{picture}(6,3.4)(-0.3,-0.3) \put(0.5,2.2){\circle*{0.14}}\put(0.1,2.25){\small $A$} \put(0.5,0.3){\circle*{0.14}}\put(0.1,0.2){\small $B$} \put(2.6,1.3){\circle*{0.14}}\put(2.75,1.35){\small $C$} \put(4.6,1.3){\circle*{0.14}}\put(4.75,1.35){\small $D$} \put(2.6,3.0){\circle*{0.14}}\put(2.75,3.0){\small $E$} \linethickness{1.3pt} \qbezier(0.5,2.2)(1.55,2.6)(2.6,3.0) % A-E =1 \put(1.3,2.75){\small $1$} \qbezier(0.5,0.3)(1.55,0.8)(2.6,1.3) % B-C =1 \put(1.3,0.55){\small $1$} \qbezier(0.5,2.2)(1.55,1.75)(2.6,1.3) % A-C =2 \put(1.4,1.95){\small $2$} \put(2.6,1.3){\line(1,0){2.0}} % C-D =2 \put(3.5,1.4){\small $2$} \end{picture} \end{center} Ablauf: MST-Gewicht $6$ $\to$ verdoppeln (Gewicht $12$) $\to$ Eulerkreis $[C,A,E,A,C,B,C,D,C]$ $\to$ abkürzen zu Tour $[C,A,E,B,D,C]$ mit Länge $\mathbf{10}\le 2\cdot\OPT$ (optimale Tour hat Länge $8$). \end{bsp} \begin{idee}{$\Delta$TSP$_2$ (Christofides, Güte $1{,}5$): nur die schiefen Knoten reparieren} Statt \emph{alle} Kanten zu verdoppeln, verbindet Christofides nur die Knoten mit \emph{ungeradem} Grad im MST durch ein \emph{minimales perfektes Matching}. Das ist billiger (Matching $\le\OPT/2$) und liefert Güte $1{,}5$. \end{idee} \begin{bsp}{Christofides am selben Graphen} Ungerade Grade im MST: $X=\{B,C,D,E\}$. Matching-Kosten: $d(B,C)=1,\ d(D,E)=2,\ d(B,E)=2,\ d(C,D)=2,\ d(B,D)=3,\ d(C,E)=3$. Minimales perfektes Matching: $\{B\text{--}C,\ D\text{--}E\}$, Gewicht $3$. Ergebnis-Tour $[C,B,A,E,D,C]$ mit Länge $\mathbf{9}$ -- besser als $\Delta$TSP$_1$. \end{bsp} \begin{stolper} Das Matching läuft nur über die \emph{ungerad-gradigen} MST-Knoten, nicht über alle. Und ohne Dreiecksungleichung bricht das Abkürzen zusammen. \end{stolper} \subsection{Knapsack: warum Gier scheitert -- und wie man sie rettet} \begin{bsp}{Greedy kann beliebig schlecht sein} Zwei Gegenstände $(w,p)=(1,1)$ und $(B,B-1)$, Kapazität $B$. Greedy nimmt (nach Dichte) den kleinen -- Gewinn $1$. Optimal wäre der große -- Gewinn $B-1$. Das Verhältnis $B-1$ wächst unbeschränkt. \end{bsp} \begin{idee}{Modified Greedy (MGA): Güte 2} Rechne Greedy \emph{und} \glqq nur den profitabelsten Einzel-Gegenstand\grqq, gib das Bessere aus. Greedy verliert nur am einen nicht mehr passenden \glqq Split-Item\grqq{} -- dessen Profit fängt das Einzel-Item ab. Näher ans Optimum kommen \emph{Sahni} ($1+1/k$, ein PTAS) und das \emph{FPTAS} (Profite herunterskalieren, exakt per DP; $1+\varepsilon$ in $O(n^3/\varepsilon)$). \end{idee} \subsection{Scheduling: Regeln und Gantt-Bild} \begin{defn}{List Scheduling und LPT} \emph{List Scheduling:} jeden Job auf die momentan \emph{leerste} Maschine. \emph{LPT:} zuerst \emph{absteigend} sortieren, dann List Scheduling. \end{defn} \begin{bsp}{Warum die Reihenfolge zählt (Gantt, $m=2$)} Jobs der Größen $1,1,2$. Oben List Scheduling in dieser Reihenfolge (Makespan $3$), unten optimal / LPT (Makespan $2$). Balkenlänge = Zeit. \setlength{\unitlength}{1cm} \begin{center} \begin{picture}(9,4)(-1.3,-0.4) % Achse \put(0,-0.1){\vector(1,0){4}} \put(3.7,-0.5){\small Zeit} \multiput(0,-0.15)(1,0){4}{\line(0,1){0.1}} \put(-0.05,-0.5){\small 0}\put(0.95,-0.5){\small 1}\put(1.95,-0.5){\small 2}\put(2.95,-0.5){\small 3} % List Scheduling \put(-1.3,3.1){\small List Scheduling:} \put(-1.1,2.4){\small $M_1$} \put(0,2.2){\framebox(1,0.6){\small $1$}} \put(1,2.2){\framebox(2,0.6){\small $2$}} \put(-1.1,1.5){\small $M_2$} \put(0,1.3){\framebox(1,0.6){\small $1$}} % Optimal \put(-1.3,0.9){\small LPT / optimal:} \put(-1.1,0.3){\small $M_1$} \put(0,0.1){\framebox(2,0.6){\small $2$}} \put(-1.1,-0.0){\small } \end{picture} \end{center} List Scheduling stapelt die $2$ auf eine schon belegte Maschine (Makespan $3$). LPT legt die große $2$ zuerst und erreicht Makespan $2$. \end{bsp} \begin{satz}{Güten} List Scheduling: $2-\tfrac1m$; LPT: $\tfrac43-\tfrac1{3m}$ -- beide scharf.\\ \emph{Beweisidee:} zwei Universalschranken -- $\OPT\ge\frac1m\sum p_i$ (Durchschnittslast) und $\OPT\ge p_{\max}$ (größter Job). Der letzte Job auf der vollsten Maschine lag dort, als sie die leerste war. \end{satz} \subsection{MAX-3-SAT: Güte 2 mit zwei Belegungen} \begin{idee}{$\beta_0$ und $\beta_1$} Maximiere die Zahl erfüllter Klauseln. Werte nur \glqq alles falsch\grqq{} ($\beta_0$) und \glqq alles wahr\grqq{} ($\beta_1$) aus, nimm das Bessere. Jede Klausel hat ein positives \emph{oder} negatives Literal, wird also von einem der beiden erfüllt. Damit erfüllen beide zusammen $\ge m$ Klauseln, die bessere $\ge m/2\ge\OPT/2$. Güte 2. \end{idee} \begin{abruf} \textbf{A16.} Nenne die vier Schritte von $\Delta$TSP$_1$ und sage bei jedem, warum er die Güte-2-Schranke stützt.\\ \textbf{A17.} Warum ist Christofides besser als $\Delta$TSP$_1$, obwohl beide mit demselben minimalen Spannbaum starten?\\ \textbf{A18.} Konstruiere (Idee) eine Instanz, bei der List Scheduling die Schranke $2-\frac1m$ wirklich erreicht. \end{abruf} % ################################################################## \section{Jenseits von NP: das Halteproblem}\label{sec:halt} % ################################################################## \begin{ziel} Ein Blick über den Rand: ein Problem, das NP-schwer ist, aber \emph{nicht} in $\NP$ liegt -- weil es überhaupt nicht lösbar ist. Das zeigt, dass \glqq schwer\grqq{} und \glqq in NP\grqq{} wirklich zwei Achsen sind. \end{ziel} \begin{defn}{Halteproblem} Gegeben die Beschreibung eines Programms $M$ und einer Eingabe $w$: hält $M$ auf $w$ irgendwann, oder läuft es ewig? \end{defn} Das Halteproblem ist \emph{unentscheidbar} -- kein Algorithmus löst es, mit keiner Laufzeit. Trotzdem ist es NP-schwer. \begin{aha} Man reduziert \problem{SAT} darauf: Baue zu einer Formel $\varphi$ ein Programm $M_\varphi$, das \emph{alle} Belegungen durchprobiert und genau dann hält, wenn eine erfüllende existiert. Dann gilt $\varphi$ erfüllbar $\iff$ $M_\varphi$ hält. Der Clou: $M_\varphi$ läuft womöglich ewig -- aber die \emph{Konstruktion} aus $\varphi$ ist billig, und nur darauf kommt es bei einer Reduktion an. Also ist das Halteproblem mindestens so schwer wie \problem{SAT}, liegt aber nicht in $\NP$. \textbf{NP-schwer $\ne$ NP-vollständig.} \end{aha} % ################################################################## \section{Das große Ganze} % ################################################################## \begin{ziel} Wir ziehen die Fäden zusammen: eine Übersicht und ein Wahr/Falsch-Test zur Selbstkontrolle. \end{ziel} \subsection{Die Reise auf einen Blick} \begin{center}\small \begin{tabular}{p{3.3cm}p{10.3cm}} \toprule Station & Kernidee \\ \midrule $\Pclass$ & effizient \emph{lösbar} (polynomiell)\\ $\NP$ & effizient \emph{überprüfbar} (Zertifikat prüfen bzw.\ raten)\\ $\Pclass\subseteq\NP$ & Lösen ist mindestens so schwer wie Prüfen; Gleichheit offen\\ $A\redp B$ & \glqq $B$ mindestens so schwer wie $A$\grqq; Richtung: bekannt $\redp$ neu\\ NP-vollständig & die schwersten in $\NP$; \problem{SAT} ist der Anker (Cook--Levin)\\ Vererbungskorollar & neues Problem schwer: eine Reduktion $+$ Nachweis $\in\NP$\\ ETH & schärfer: konkrete $2^{o(\cdot)}$-Schranken (Kontraposition, Sparsification)\\ Approximation & schwere Optimierung: beweisbar gute Näherung mit Gütegarantie\\ \bottomrule \end{tabular} \end{center} \subsection{Wahr oder falsch? (Begründung zählt)} \begin{center}\small \begin{tabular}{p{7.3cm}cp{4.8cm}} \toprule Aussage & W/F & Begründung \\ \midrule Löst eine ratende Maschine ein Problem in Polyzeit, dann auch eine gewöhnliche. & F$^{*}$ & Das wäre $\Pclass=\NP$ -- unbekannt. \\ \addlinespace $A$ NP-schwer $\Rightarrow A\in\NP$. & F & Halteproblem: NP-schwer, nicht einmal lösbar. \\ \addlinespace $L\in\NP$ und $L\redp\problem{3-SAT}$ $\Rightarrow$ $L$ NP-vollständig. & F & Falsche Richtung -- \emph{auf} 3-SAT reduzieren zeigt keine Schwere. \\ \addlinespace $\problem{3-SAT}\redp L$ und $L\redp\problem{3-SAT}$ $\Rightarrow$ $L$ NP-vollständig. & W & Erstes gibt Schwere, zweites gibt $L\in\NP$. \\ \addlinespace ETH falsch $\Rightarrow \Pclass=\NP$. & F & $2^{o(n)}$ kann superpolynomiell bleiben. \\ \bottomrule \end{tabular} \end{center} {\footnotesize $^{*}$ nicht als wahr beweisbar; äquivalent zu $\Pclass=\NP$.} \begin{aha} Du hast das \emph{Warum} beisammen: Was Probleme schwer macht, wie Schwere von einem zum anderen fließt, wo die Grenzen liegen, was man bei schweren Optimierungsproblemen tut. Das ist das Fundament. \end{aha} \noindent\textbf{Der nächste Schritt (Schritt 3 und 4 deines Lernmodells).} Nimm die Präsenz-, Haus- und Klausuraufgaben. Führe dort selbst aus, was hier als Idee stand: Reduktionen \emph{vollständig} beweisen (beide Richtungen!), Güte-Schranken herleiten, Worst-Case-Instanzen bauen. Dieses Heft gab dir das Verständnis -- die Aufgaben geben dir das Können. % ################################################################## \appendix \renewcommand{\thesection}{\Alph{section}} \section{Lösungen zu den Abruf-Fragen}\label{sec:loesungen} % ################################################################## Erst selbst beantwortet? Dann hier vergleichen. \loes{A1.} Ein konstanter Faktor (1000$\approx 2^{10}$) verschiebt die exponentielle Kurve nur um eine \emph{additive} Konstante: du schaffst rund 20 Knoten mehr -- einmalig. Das Problem wächst weiter exponentiell, die Hardware nur einmal. \loes{A2.} \glqq Kennen keinen\grqq{} = niemand hat einen Algorithmus gefunden (Wissenslücke). \glqq Gibt keinen\grqq{} = bewiesene Nichtexistenz. Für die Clique gilt nur Ersteres -- ein Nichtexistenzbeweis fehlt ($\Pclass$-vs-$\NP$ offen). \loes{A3.} Ja. $n^4$ ist polynomiell (fester Exponent $d=4$), also in $\Pclass$ und im Sinne der Theorie effizient. \loes{A4.} Bis $K$ zu zählen kostet $K$ Schritte. $K$ ist aber exponentiell in seiner Eingabelänge $O(\log K)$. Die Laufzeit ist also exponentiell in der Eingabegröße. \loes{A5.} \textbf{Zertifikat:} eine Knotenmenge $C$. \textbf{Verifizierer:} prüfe, ob jede Kante einen Endpunkt in $C$ hat ($O(|E|)$) und ob $|C|\le k$; akzeptiere genau dann. \textbf{Korrektheit:} gibt es ein VC der Größe $\le k$, wird es akzeptiert, sonst keines. \textbf{Laufzeit} polynomiell. (NDTM: $C$ raten, dann prüfen.) \loes{A6.} Der Verifizierer bekommt das Zertifikat \emph{geschenkt} und prüft nur. Der Löser muss die Lösung selbst \emph{finden} -- und dafür können exponentiell viele Kandidaten in Frage kommen. Prüfen startet einen Schritt weiter als Lösen. \loes{A7.} $\problem{Clique}\redp\problem{Vertex Cover}$ -- vom bekannt schweren \problem{Clique} auf das neue \problem{VC}. So erbt \problem{VC} die Schwere. Die Gegenrichtung würde über \problem{VC} nichts aussagen. \loes{A8.} $A\redp B$ bedeutet: $B$ ist \emph{mindestens so schwer} wie $A$. \loes{A9.} (1) eine Reduktion von einem bekannten NP-vollständigen Problem auf $Y$; (2) der Nachweis $Y\in\NP$. Vergessen wird leicht (2) -- ohne ihn hat man nur NP-\emph{Schwere}, nicht Vollständigkeit. (Beim Reduktionsteil vergisst man gern die Rückrichtung der Korrektheit.) \loes{A10.} \problem{SubSet Sum} ist NP-vollständig. Läge \emph{ein} NP-vollständiges Problem in $\Pclass$, ließe sich jedes $L\in\NP$ via $L\redp\problem{SubSet Sum}$ effizient lösen -- also $\Pclass=\NP$. \loes{A11.} \textbf{Zertifikat:} eine Reihenfolge (Permutation) der Knoten. \textbf{Verifizierer:} prüfe, ob jeder Knoten genau einmal vorkommt und jede aufeinanderfolgende (und die schließende) Kante existiert -- $O(|V|+|E|)$. \textbf{NDTM:} Reihenfolge raten, dann prüfen. \loes{A12.} Bei Basis $n+1$ und höchstens $n$ Summanden gibt es \emph{keinen Übertrag}; jede Ziffer zählt für sich. Bei Basis 2 könnten Überträge falsche Teilsummen zufällig aufs Ziel bringen. Die große Basis macht \glqq Summe trifft Ziel\grqq{} äquivalent zu \glqq jede Stelle genau einmal überdeckt\grqq. \loes{A13.} $C$ ist Vertex Cover $\iff$ $V\setminus C$ ist Independent Set (im selben Graphen). Überführung: aus der VC-Instanz $(G,k)$ mach die IS-Instanz $(G,\,n-k)$. \loes{A14.} Nein. \glqq ETH falsch\grqq{} heißt nur: \problem{3-SAT} geht in $2^{o(n)}$ -- das kann noch superpolynomiell sein (z.\,B. $2^{\sqrt n}$). Umgekehrt gilt: $\Pclass=\NP$ würde die ETH widerlegen. \loes{A15.} Die ETH liefert eine Schranke in der Variablenzahl $n$. Viele Reduktionen erzeugen ihre Instanzgröße aus der Klauselzahl $m$, und $m$ kann $\gg n$ sein. Eine $2^{o(m)}$-Schranke folgt daher \emph{nicht} direkt aus der ETH -- das Sparsification-Lemma liefert sie. \loes{A16.} (1) Minimaler Spannbaum $T$: $w(T)\le\OPT$. (2) Kanten verdoppeln: Gesamtlänge $2w(T)\le 2\OPT$. (3) Eulerkreis: nutzt die geraden Grade, ändert die Länge nicht. (4) Abkürzen: verlängert wegen der Dreiecksungleichung nicht. Also $d(R)\le 2\OPT$. \loes{A17.} $\Delta$TSP$_1$ verdoppelt \emph{alle} MST-Kanten -- das kostet zusätzlich rund $w(T)\approx\OPT$. Christofides fügt stattdessen nur ein minimales perfektes Matching auf den ungerad-gradigen Knoten hinzu (Kosten $\le\OPT/2$). Deshalb $1{,}5\,\OPT$ statt $2\,\OPT$. \loes{A18.} $m(m-1)$ Jobs der Größe 1, danach \emph{ein} Job der Größe $m$ -- in dieser Reihenfolge. List Scheduling verteilt die Einsen gleichmäßig (je $m-1$) und legt den großen Job obendrauf: Makespan $2m-1$. Optimal ist $m$ (großer Job allein). Verhältnis $\frac{2m-1}{m}=2-\frac1m$. \end{document}