Handlungsreisender-in-Deutschland.tex 9.9 KB

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