| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- \documentclass[a4paper,9pt]{scrartcl}
- \usepackage[ngerman]{babel}
- \usepackage[utf8]{inputenc}
- \usepackage{amssymb,amsmath}
- \usepackage{geometry}
- \usepackage{graphicx}
- \usepackage{hyperref}
- \usepackage{listings}
- \usepackage{color}
- \usepackage{slashbox}
- \definecolor{gray}{gray}{0.5}
- \lstset{
- language=Python, % the language of the code
- basicstyle=\footnotesize, % the size of the fonts that are used for the code
- keywordstyle=\color{blue},
- stringstyle=\color{red},
- commentstyle=\color{gray}\slshape,
- emph={class, pass, in, for, while, if, is, elif, else, not, and, or, def, print, exec, break, continue, return},
- emphstyle=\color{black}\bfseries,
- emph={[2]True, False, None, self},
- emph={[3]from, import, as},
- emphstyle=[3]\color{blue},
- morecomment=[s]{"""}{"""},
- rulesepcolor=\color{blue},
- otherkeywords={1, 2, 3, 4, 5, 6, 7, 8 ,9 , 0, -, =, +, [, ], (, ), \{, \}, :, *, !},
- numbers=left, % where to put the line-numbers
- numberstyle=\footnotesize, % the size of the fonts that are used for the line-numbers
- stepnumber=1, % the step between two line-numbers. If it's 1, each line
- % will be numbered
- numbersep=5pt, % how far the line-numbers are from the code
- showspaces=false, % show spaces adding particular underscores
- showstringspaces=false, % underline spaces within strings
- showtabs=false, % show tabs within strings adding particular underscores
- tabsize=2, % sets default tabsize to 2 spaces
- captionpos=b, % sets the caption-position to bottom
- breaklines=true, % sets automatic line breaking
- breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
- title=\lstname, % show the filename of files included with \lstinputlisting;
- % also try caption instead of title
- escapeinside={\%*}{*)}, % if you want to add a comment within your code
- morekeywords={*,...}, % if you want to add more keywords to the set
- literate=%
- {Ö}{{\"O}}1
- {Ä}{{\"A}}1
- {Ü}{{\"U}}1
- {ß}{{\ss}}2
- {ü}{{\"u}}1
- {ä}{{\"a}}1
- {ö}{{\"o}}1
- }
- \geometry{a4paper,left=18mm,right=18mm, top=1cm, bottom=2cm}
- \setcounter{secnumdepth}{2}
- \setcounter{tocdepth}{2}
- \shorthandon{"}
- \hypersetup{
- pdftitle={Handlungsreisender in Deutschland},
- pdfsubject={Aufgabe},
- pdfauthor={Martin Thoma},
- pdfkeywords={Aufgabe, Mathematik, Lösung}}
- \shorthandoff{"}
- \begin{document}
- \title{Handlungsreisender in Deutschland}
- \author{Martin Thoma}
- \setcounter{section}{1}
- \section*{Aufgabenstellung}
- Ein Handlungsreisender will seine Produkte in den zehn größten Städten
- Deutschlands verkaufen. Er startet in Berlin und will seine Reise dort
- beenden.
- Die zehn einwohnerreichsten Städte Deutschlands sind Berlin, Hamburg,
- München, Köln, Frankfurt am Main, Stuttgart, Düsseldorf, Dortmund, Essen
- und Bremen. \\
- Folgende Tabelle gibt die Entfernung zwischen den Städten für eine Autoreise
- wieder\footnote{Mit maps.google.com ermittelte Werte. Es wurde immer auf ganze Kilometer gerundet.}:
- \begin{tabular}[hc]{|l|c|c|c|c|c|c|c|c|c|c|}
- \hline
- \backslashbox{von}{nach} & \rotatebox{90}{Berlin} & \rotatebox{90}{Hamburg} & \rotatebox{90}{München} & \rotatebox{90}{Köln} & \rotatebox{90}{Frankfurt am Main} & \rotatebox{90}{Stuttgart} & \rotatebox{90}{Düsseldorf} & \rotatebox{90}{Dortmund} & \rotatebox{90}{Essen} & \rotatebox{90}{Bremen} \\
- \hline\hline
- Berlin & 0 & 288 & 585 & 575 & 547 & 633 & 559 & 494 & 531 & 392 \\
- Hamburg & 289 & 0 & 775 & 426 & 493 & 655 & 400 & 344 & 365 & 122 \\
- München & 589 & 775 & 0 & 577 & 398 & 220 & 612 & 604 & 634 & 748 \\
- Köln & 579 & 426 & 576 & 0 & 193 & 369 & 42 & 95 & 73 & 320 \\
- Frankfurt a. M. & 552 & 492 & 393 & 193 & 0 & 210 & 229 & 219 & 251 & 445 \\
- Stuttgart & 637 & 667 & 231 & 369 & 203 & 0 & 404 & 417 & 426 & 642 \\
- Düsseldorf& 563 & 408 & 611 & 38 & 228 & 404 & 0 & 71 & 37 & 302 \\
- Dortmund & 498 & 346 & 605 & 95 & 221 & 418 & 69 & 0 & 36 & 240 \\
- Essen & 536 & 374 & 634 & 74 & 252 & 427 & 35 & 37 & 0 & 267 \\
- Bremen & 397 & 123 & 748 & 315 & 441 & 638 & 289 & 233 & 254 & 0 \\
- \hline
- \end{tabular}\\
- \\
- Welche Route sollte er wählen?
- \subsection{Größenordnung des Problems}
- Es gibt $9! = 9 \cdot 8 \cdot 7 \cdot 6 \cdot 5 \cdot 4 \cdot 3 \cdot 2 \cdot 1 = 362.880$ mögliche Routen,
- da der Handlungsreisende in Berlin startet und 9 Möglichkeiten für die erste
- Stadt hat, 8 für die zweite, usw.\\
- Allgemein kann man sagen, dass bei $n$ Städten insgesamt $(n-1)!$ mögliche
- Routen bestehen, da die Wahl des Startpunktes egal ist. \\
- Falls das Problem symmetrisch wäre, also die Strecke von Berlin nach
- München genauso lang wie die von München nach Berlin wäre, könnte man die
- Anzahl der Routen auf $\frac{(n-1)!}{2}$ reduzieren. Allerdings ist das
- Problem offensichtlich asymmetrisch (siehe München $\rightarrow$ Berlin und
- München $\leftarrow$ Berlin)
- Die Tabelle \ref{tab:functionGrowth} macht deutlich, wie schnell so etwas
- wächst.
- \begin{table}[hc]
- \centering
- \begin{tabular}[hc]{|l|r|r|r|r|r|r|}
- \hline
- n & $1$ & $log(n)$ & $n \cdot log(n)$ & $n^2$ & $n^3$ & $n!$ \\
- \hline\hline
- 1 & 1 & 0 & 0 & 1 & 1 & 1 \\
- 2 & 1 & 0,30 & 0,60 & 4 & 8 & 2 \\
- 3 & 1 & 0,48 & 1,43 & 9 & 27 & 6 \\
- 4 & 1 & 0,60 & 2,41 & 16 & 64 & 24 \\
- 5 & 1 & 0,70 & 3,49 & 25 & 125 & 120 \\
- 6 & 1 & 0,78 & 4,67 & 36 & 216 & 720 \\
- 7 & 1 & 0,85 & 5,92 & 49 & 343 & 5.040 \\
- 8 & 1 & 0,90 & 8,13 & 64 & 512 & 40.320\\
- 9 & 1 & 0,95 & 8,59 & 81 & 729 & 362.880\\
- 10 & 1 & 1,00 & 10,00 & 100 & 1.000 & 3.628.800\\
- 20 & 1 & 1,30 & 26,02 & 400 & 8.000 & $2,42 \cdot 10^{18}$ \\
- \hline
- \end{tabular}
- \caption{Wachstum verschiedener Funktionen}
- \label{tab:functionGrowth}
- \end{table}
- \newpage
- \subsection{Intuitive Lösung}
- Wenn man die Städte so auf der Karte sieht sollte man einfach mal die Route
- suchen, von der man denkt sie wäre gut. \\
- \begin{center}
- %\includegraphics{Germany_location_map.png}
- \end{center}
- Ich habe mir folgende ausgesucht:\\
- \begin{center}
- %\includegraphics{Germany_location_map-intuitiv.png}
- \end{center}
- Das ist die Route Berlin $\rightarrow$ München $\rightarrow$ Stuttgart
- $\rightarrow$ Frankfurt a. M. $\rightarrow$ Köln $\rightarrow$ Düsseldorf
- $\rightarrow$ Essen $\rightarrow$ Dortmund $\rightarrow$ Bremen
- $\rightarrow$ Hamburg $\rightarrow$ Berlin.
- Diese Route ist 1969 km lang.
- \newpage
- \subsection{Optimale Lösung}
- \subsubsection{Alle Routen durchgehen}
- Die primitivste und langsamste Methode zum Finden der optimalen Lösung ist
- einfach alle möglichen Routen durch zu gehen. Dieser Algorithmus ist, was
- die Ausführungszeit angeht, in $\mathcal{O}(n!)$. Wie schnell diese wächst
- sollte mit Tabelle \ref{tab:functionGrowth} klar geworden sein.\\
- Dieser Ansatz ist also nur für sehr kleine Instanzen des Problems geeignet.\\
- \\
- Eine Auswertung aller Stecken hat folgende Ergebnisse geliefert: \\
- 1969 km bzw. die von mir intuitiv gefundene Strecke ist eine von 10 optimalen Lösungen.\\
- Die längste Route ist 4.913 km lang.\\
- Es gibt 3.628.800 Routen, jedoch nur 2.597 verschiedene Streckenlängen. Die
- durchschnittliche Streckenlänge beträgt 3.838 km und wurde rot eingezeichnet,
- die maximale 4.913 km.\\
- Die Verteilung der Streckenlängen sieht wie folgt aus:\\
- %\includegraphics{Kurve.png}
- \\
- Würde man eine maximale Abweichung von $5\%$ akzeptieren, wären nur $0,002\%$
- aller Routen akzeptabel. Durch eine zufällig gewählte Strecke wird man also
- kaum ein gutes Ergebnis erziehlen
- \subsection{Heuristiken}
- Eine Heuristik ist in diesem Zusammenhang ein vereinfachtes Verfahren, das
- keine optimale Lösung liefert, aber eine akzeptable Näherung daran. Dafür
- ist die Heuristik deutlich schneller.\\
- \subsubsection{Nächster Nachbar}
- Eine mögliche Heurisik ist das auswählen der Stadt, die am nächsten zur
- aktuellen Stadt liegt. Mit diesem Verfahren erhält man bei der gegebenen
- Städtekonstellation eine Route der Länge 2.162 km. Das sind 193 km oder
- $9,8\%$ mehr als die optimale Lösung benötigt.
- \subsubsection{Nächster Nachbar - Dynamisch Einfügen}
- Die Methode des nächsten Nachbars kann verbessert werden, indem der Nachbar
- nicht einfach am Ende in die Route eingefügt wird, sondern an die Stelle, an
- der die resultierende Route am kleinsten wäre. Damit erhält man bei der
- gegebenen Städtekonstellation eine optimale Route.
- \newpage
- \lstinputlisting[language=Python]{Handlungsreisender-in-Deutschland-Alle-Routen.py}
- \newpage
- \lstinputlisting[language=Python]{Handlungsreisender-in-Deutschland-analyse.py}
- \newpage
- \lstinputlisting[language=Python]{Handlungsreisender-in-Deutschland-Nearest-Neighbour.py}
- \newpage
- \lstinputlisting[language=Python]{Handlungsreisender-in-Deutschland-Nearest-Insertion.py}
- \end{document}
|