Files
aak/lernmaterial/fundament3.tex
2026-07-20 22:34:19 +02:00

1235 lines
50 KiB
TeX

\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}