diff --git a/school/di-ma/20181120_1-hamilton.dot b/school/di-ma/20181120_1-hamilton.dot new file mode 100644 index 0000000..06c4b55 --- /dev/null +++ b/school/di-ma/20181120_1-hamilton.dot @@ -0,0 +1,25 @@ +graph g { + node [ shape="point" ]; + + { + rank="same"; + 1; + 2; + } + { + rank="same"; + 3; + } + { + rank="same"; + 4; + 5; + } + + 1 -- 2; + 1 -- 3; + 2 -- 3; + 1 -- 4; + 4 -- 5; + 5 -- 1; +} diff --git a/school/di-ma/20181120_1-hamiltonkreise.md b/school/di-ma/20181120_1-hamiltonkreise.md new file mode 100644 index 0000000..29182da --- /dev/null +++ b/school/di-ma/20181120_1-hamiltonkreise.md @@ -0,0 +1,137 @@ +--- +title: Hamiltonkreise +date: 2018-11-20 +--- + +**Idee**: + +* Handelsresenden (traveling salesman) +* Städte $\widehat{=}$ Knoten +* Flugverbindungen $\widehat{=}$ Kanten + +![Beispiel Graph](20181120_1-hamilton.png) + +Handelsreisende möchte alle Städt genau einmal besuchen und wieder am +Ausgangspunkt enden. Das heißt, er sucht einen Kreis im Graphen, in dem jeder +Konten vorkommt. Finden eines solchen Kreises: Traveling Salesman Problem +(TSP). + +# Definition (Hamiltonkreis) + +Sei $G=(V,E)$ zusammenhängender Graph. + +i) Ein Hamiltonkreis in $G$ ist ein Kreis, in dem jeder Knoten vorkommt, d.h. +$K = (v_1, ..., v_s)$ mit + a) K ist Kreis + a) $\{ v_i | i \in \{1,..., s\} \} = V$ + +i) Ein Graph, der einen Hamiltonkreis enthält, heißt **hamiltonisch**. + + +**Beispiel**: + +i) $K_n$ vollständiger Graph mit $n$ Knoten, d.h. $K_n = \{ \{1,...,n\}, +\binom{V}{2} \}$ ist hamiltonisch, da $k = \{1,2,...,n\}$ ein Hamiltonkreis. + +i) $Q_n$ sind hamilton. Beweis per Induktion und Verbinden der zwei zu +$Q_{n-1}$ isomorphen Graphen. + + Betrachte $Q_{n+1}$. Per Induktionsvoraussetzung gibt es in $Q_n$ einen + Hamiltonkreis $K = (v_1, ..., v_{2^n})$ + + Konstruiere daraus $K' = (\binom{v_1}{0}, \binom{v_2}{0}, ..., + \binom{v_{2^n}}{0}, \binom{v_{2^n}}{1}, \binom{v_{2^n - 1}}{1}, ... + \binom{v_1}{1})$ als Hamiltonkreis in $Q_{n+1}$ + + +**Frage**: Wie findet man im allgemeinen einen Hamiltonkreis für einen +gegebenen Graphen? Oder wie entscheidet man, ob ein gegebener Graph +hamiltonisch ist? + + +# Algorithmus (Hamiltonisch) + +**Eingabe**: $G=(V,E)$ mit $V = \{1, ..., n\}$ + +i) Für alle Permutationen $\pi: \{ 1, ..., n\} \rightarrow \{1,...,n\}$ + a) teste, ob $(\pi(1),\pi(2),...,\pi(n))$ ein Hamiltonkreis ist + a) falls ja, STOP +i) Ausgabe: "nicht hamiltonisch" + + +**Korrektheit**: klar. Algorithmus testet alle möglichen Hamiltonkreise. + +**Laufzeit**: Anzahl der Permutationen, d.h. $O(n!)$ exponentiell in $n$. + + +Der Algorithmus ist schon für relativ kleine $n$ ($n \approx 20$) nicht mehr +praktisch durchführbar. + +*Vermutung*: Es gibt keinen wesentlich besseren (d.h. polynomielle Laufzeit) +Algorithmus. + +Aber es gibt Fälle, in denen es einfach(er) ist. Insbesondere dann, wenn es + +i) sehr wenige Kanten gibt +i) sehr viele Kanten gibt + + +**zum ii) Fall**: + +# Satz + +Sei $G=(V,E)$ ein zusammenhängender Graph mit der Eigenschaft, dass $deg(x) + +deg(y) \geq |V|, \forall x \neq y, \{x,y\} \notin E$ + +Dann ist $G$ hamiltonisch. + + +# Beweis + +(per Widerspruch) + +Wir nehmen an, der Satz ist falsch. Dann gibt es ein Gegenbeispiel. Sei +$G=(V,E)$ ein solches Gegenbeispiel mit maximaler Anzahl an Kanten (bei +gegebenen $V$). Da $G$ nicht der vollständige Graph sein kann, gibt es $x,y \in +V$ mit $\{x,y\} \notin E$. Da $G$ maximal war, gibt es in $G'=\{V,E \cup +\{x,y\}\}$ einen Hamiltonkreis $k = (x=v_1,v_2,...,v_n=y)$ (die Kante +$\{x,y\}$ muss in $k$ genutzt werden). + +Hier könnte ein Bild entstehen. + +Betrachte 2 Mengen: + +* $S = \{ v_i | \{x,v_{i+1}\} \in E \}$ +* $T = \{ v_i | \{y, v_i\} \in E \} = \Gamma(y)$ + +Es gilt: + +i) $y \notin S \cup T$, denn $y \notin T$, da keine Schleifen und $y \notin S$ +per Definition +i) $|S| + |T| = |\Gamma(x)| + |\Gamma(y)| = deg(x) + deg(y) \geq |V|$ damit +folgt $S \cap T \neq \emptyset$, da $|V| > |S \cup T| = |S| + |T| - |S\cap T| +\geq |V| - |S \cap T|$ + + $\Rightarrow |S \cap T| > 0$ + + +Sei $v_i \in S \cap T$, dann ist $k' = +(x=v_1,...,v_i,y=v_n,v_{n-1},...,v_{i-1})$ ein Hamiltonkreis in $G$. + +Widerspruch dazu, dass $G$ Gegenbeispiel. + +$$ +\tag*{$\Box$} +$$ + + +Der Beweis liefert auch einen Algorithmus, um für solche Graphen effizient +Hamiltonkreise zu finden. +**Idee**: Gegeben $G=(V,E)$. Starte mit beliebigen Hamiltonkreis +$k=(v_1,...v_n)$ wobei nicht alle Kanten in $E$ liegen (kein Hamiltonkreis in +$G$). + +Entferne nach der Konstruktion im Beweis Kanten aus $k$, die nicht in $E$ +liegen, und ersetze diese durch Kanten in $G$. + +**Laufzeit**: $O(n)$ Iterationen. diff --git a/school/di-ma/index.md b/school/di-ma/index.md index c3c5d00..16d4ef2 100644 --- a/school/di-ma/index.md +++ b/school/di-ma/index.md @@ -23,3 +23,4 @@ subtitle: > - [2018-11-14 Datenstruktur Stack](20181114_2-stack) - [2018-11-14 Tiefensuche](20181114_3-tiefensuche) - [2018-11-14 Wurzelbäume](20181114_4-wurzelbaeume) +- [2018-11-20 Hamiltonkreise](20181120_1-hamiltonkreise)