Benutzer-Werkzeuge

Webseiten-Werkzeuge


ss16:radwege

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ss16:radwege [2016/09/19 07:48]
mravin [Wegfinde-Algorithmen]
ss16:radwege [2016/09/28 12:50] (aktuell)
mravin [Zusammenfassung, Ausblick]
Zeile 1: Zeile 1:
 +===== BEMERKUNGEN ZUR VERBESSERUNG =====
 +
 +Die Darstellung gefällt mir gut, in diesem Fall finde ich 
 +es überzeugend,​ die Erzählung vom Projektverlauf nicht von
 +der Darstellung zu trennen. Die Darstellung der Dateiformat-
 +Entwicklung,​ der Wegfinde-Algorithmen und der Optimierung
 +sind durchweg erfreulich
 +
 +Zweierlei würde ich mir noch wünschen:
 +
 +  * Der Code selbst sollte von der Dokumentation aus zugänglich sein. Das kann entweder in einzelnen Seiten in ''<​code python> ​ </​code>''​ -tags erfolgen oder durch Verlinken auf ein (einigermaßen augeräumtes) gitlab/​github/​tubcloud Verzeichnis. Das letztere ​ hat den Vorteil, dass dort auch eure geputzten ​ Daten Platz finden würden, die ja auch für andere interessant wären. <​html><​br/></​html>​ Ach ja, es gäbe noch die  dritte Variante, eure Programm-Dateien zu zippen und das zip in der Wiki hochzuladen. In allen Fällen wäre es gut, wenn es ein kleines Inhaltsverzeichnis des Codes gibt, d.h. welche Programme es überhaupt gibt. mit eurer Erlaubnis auch ein gitlab-Verzeichnis anlegen.
 +
 +  * Ein kleines Fazit. ​
 +
 ====== Radwege ====== ====== Radwege ======
 ===== Gruppe ===== ===== Gruppe =====
Zeile 13: Zeile 27:
  
 ===== Erlangen und Bearbeiten der Verkehrsnetzdaten ===== ===== Erlangen und Bearbeiten der Verkehrsnetzdaten =====
-Der Grunddatensatz für das Berliner Verkehrsnetz ließ sich recht einfach von [[http://​www.openstreetmap.org/​|openstreetmap.org]] herunterladen. Leider belief sich der ausgewählte Bereich auf eine Dateiengröße von ~1.6 GB, was eine Weile braucht, um es in Python zu laden. Deshalb wurde der Datensatz in zwei Schritten verkleinert. Erst wurden durch das Kommandozeilen-tool Osmosis (ebenfalls von openstreetmap) alle Straßen und Standpunkte,​ die nicht mit dem Fahrrad befahrbar sind, (Autobahn, Flughafen, etc.) gelöscht. Beim zweiten Schritt wurden nicht brauchbare Meta-Informationen und unnötige Tags mit eigenen python-Skripten entfernt. Im Laufe dessen ergab es sich, ein eigenes Dateiformat zu erstellen um die Daten einfacher und schneller lesen/​schreiben zu können. ​Diese Datei hatte am Ende dann nur noch eine Größe von ~67 MB.\\+Der Grunddatensatz für das Berliner Verkehrsnetz ließ sich recht einfach von [[http://​www.openstreetmap.org/​|openstreetmap.org]] herunterladen. Leider belief sich der ausgewählte Bereich auf eine Dateiengröße von ~1.6 GB, was eine Weile braucht, um es in Python zu laden. Deshalb wurde der Datensatz in zwei Schritten verkleinert. Erst wurden durch das Kommandozeilen-tool Osmosis (ebenfalls von openstreetmap) alle Straßen und Standpunkte,​ die nicht mit dem Fahrrad befahrbar sind, (Autobahn, Flughafen, etc.) gelöscht. Beim zweiten Schritt wurden nicht brauchbare Meta-Informationen und unnötige Tags mit eigenen python-Skripten entfernt. Im Laufe dessen ergab es sich, ein eigenes Dateiformat zu erstellen um die Daten einfacher und schneller lesen/​schreiben zu können, da Python-eigene Funktionen, wie ''​pickle''​ zum Speichern unbrauchbar warenDie Datei im eigenen Dateiformat ​hatte am Ende dann nur noch eine Größe von ~67 MB.\\
 [[ss16:​radwege:​dateiformate|Dateiformat-Entwicklung]] [[ss16:​radwege:​dateiformate|Dateiformat-Entwicklung]]
 ===== Python Dateistruktur ===== ===== Python Dateistruktur =====
-Um mit den Daten einfach arbeiten zu können, wurden diese als Graph gespeichert. Dafür wurden 3 Objektklassen erstellt: die ''​Node''​-Klasse (Knoten), die ''​Edge''​-Klasse (Kante), und die ''​Graph''​-Klasse. Ein Graph besteht aus Knoten und Kanten, wobei Kanten die Verbindungen zwischen Knoten darstellen. Im Fall des Verkehrsnetzes wäre das dann z.B. eine Straße als Verbindung zwischen zwei Kreuzungen. Mit diesen drei Klassen konnten dann die Daten eingelesen und damit gearbeitet werden.+Um mit den Daten einfach arbeiten zu können, wurden diese als Graph gespeichert. Dafür wurden 3 Objektklassen erstellt: die ''​Node''​-Klasse (Knoten), die ''​Edge''​-Klasse (Kante), und die ''​Graph''​-Klasse. Ein Graph besteht aus Knoten und Kanten, wobei Kanten die Verbindungen zwischen Knoten darstellen. Im Fall des Verkehrsnetzes wäre das dann z.B. eine Straße als Verbindung zwischen zwei Kreuzungen. Mit diesen drei Klassen konnten dann die Daten eingelesen und damit gearbeitet werden.\\ 
 +[[ss16:​radwege:​dateistruktur|Dateistruktur-Dokumentation]]
  
 ===== Wegfinde-Algorithmen ===== ===== Wegfinde-Algorithmen =====
 Der [[https://​de.wikipedia.org/​wiki/​Dijkstra-Algorithmus|Dijkstra-Algorithmus]] ist möglicherweise der grundlegendste Algorithmus in der Graphentheorie. Er berechnet von einem Knoten aus über die Kanten die jeweils kürzeste Weglänge zu allen anderen (erreichbaren) Knoten aus. Dies macht er, indem die Nachbarn vom aktuellen Knoten anhand der Kantenentfernung in eine Liste einordnet (kürzeste=Vorne,​ längste=Hinten). Nachdem er alle Nachbarn in die Liste eingefügt hat, wird der erste Knoten der Liste als aktuelles Element herausgenommen und das ganze geschieht von vorne. Wenn ein Zielknoten gegeben ist, läuft der Algorithmus bis er den Zielknoten als Nachbarn findet, wenn nicht läuft er bis allen (erreichbaren) Knoten ihre Entfernung zugewiesen wurde. Der [[https://​de.wikipedia.org/​wiki/​Dijkstra-Algorithmus|Dijkstra-Algorithmus]] ist möglicherweise der grundlegendste Algorithmus in der Graphentheorie. Er berechnet von einem Knoten aus über die Kanten die jeweils kürzeste Weglänge zu allen anderen (erreichbaren) Knoten aus. Dies macht er, indem die Nachbarn vom aktuellen Knoten anhand der Kantenentfernung in eine Liste einordnet (kürzeste=Vorne,​ längste=Hinten). Nachdem er alle Nachbarn in die Liste eingefügt hat, wird der erste Knoten der Liste als aktuelles Element herausgenommen und das ganze geschieht von vorne. Wenn ein Zielknoten gegeben ist, läuft der Algorithmus bis er den Zielknoten als Nachbarn findet, wenn nicht läuft er bis allen (erreichbaren) Knoten ihre Entfernung zugewiesen wurde.
 //​(Code-Schnipsel vom Dijkstra-Algorithmus einfügen?​)//​ \\ //​(Code-Schnipsel vom Dijkstra-Algorithmus einfügen?​)//​ \\
 +Die erwähnte Liste der Knoten war schwierig zu realisieren. Zwischenzeitlich haben wir auch eine eigene ''​Schlange''​-Klasse entwickelt. Diese war jedoch im Vergleich zu der Python-eigenen ''​PriorityQueue''​ deutlich langsamer und so implementierten wir schlussendlich doch die vorgefertigte Variante als Liste für Dijkstra.
 +==== Der A*-Algorithmus ====
 Wie man sich vorstellen kann, muss der Algorithmus gegebenfalls sehr viele Knoten durchlaufen bis er das Ziel erreicht, was zu einer recht hohen Laufzeit führen kann. Wie man sich vorstellen kann, muss der Algorithmus gegebenfalls sehr viele Knoten durchlaufen bis er das Ziel erreicht, was zu einer recht hohen Laufzeit führen kann.
 Deswegen wurde der [[https://​de.wikipedia.org/​wiki/​A*-Algorithmus|A*-Algorithmus]] in betracht bezogen, der eine Erweiterung des Dijkstra-Algorithmus ist. Beim A* wird beim einordnen in die Liste noch die abgeschätzte Distanz von aktuellem Knoten zu Ziel mit einberechnet. In diesem Fall ist die abgeschätzte Distanz die Länge der Fluglinie zwischen Knoten und Ziel. Das heißt im Grunde, dass sich der A*-Algorithmus schneller in die Richtung des Ziels geht und somit eine schnellere Laufzeit hat.\\ \\ Deswegen wurde der [[https://​de.wikipedia.org/​wiki/​A*-Algorithmus|A*-Algorithmus]] in betracht bezogen, der eine Erweiterung des Dijkstra-Algorithmus ist. Beim A* wird beim einordnen in die Liste noch die abgeschätzte Distanz von aktuellem Knoten zu Ziel mit einberechnet. In diesem Fall ist die abgeschätzte Distanz die Länge der Fluglinie zwischen Knoten und Ziel. Das heißt im Grunde, dass sich der A*-Algorithmus schneller in die Richtung des Ziels geht und somit eine schnellere Laufzeit hat.\\ \\
Zeile 39: Zeile 56:
   * Dann wurden die Längen der Wege zwischen jedem der zuerst ausgewählten und jedem der später ausgewählten Knoten, sofern diese über das Netz verbunden waren, berechnet. ​   * Dann wurden die Längen der Wege zwischen jedem der zuerst ausgewählten und jedem der später ausgewählten Knoten, sofern diese über das Netz verbunden waren, berechnet. ​
   * Die Mittelung dieser Werte ergab dann eine Bewertung des Netzwerkes.   * Die Mittelung dieser Werte ergab dann eine Bewertung des Netzwerkes.
-  * ''​Anmerkung: Da der Dijkstra-Algorithmus nicht nur die Entfernung zweier Knoten, sondern auch ohne viel Mehraufwand von einem gemeinsamen Knoten ausgehend die Entfernung aller Knoten von diesem Knoten berechnen kann, ist die Laufzeit des Bewertungsverfahren hauptsächlich abhängig von der Anzahl der zuerst ausgewählten Knoten. Die Anzahl der später ausgewählten Knoten spielt eine eher untergeordnete Rolle.''​+  * //Anmerkung: Da der Dijkstra-Algorithmus nicht nur die Entfernung zweier Knoten, sondern auch ohne viel Mehraufwand von einem gemeinsamen Knoten ausgehend die Entfernung aller Knoten von diesem Knoten berechnen kann, ist die Laufzeit des Bewertungsverfahren hauptsächlich abhängig von der Anzahl der zuerst ausgewählten Knoten. Die Anzahl der später ausgewählten Knoten spielt eine eher untergeordnete Rolle.//
 Mithilfe dieses Bewertungssystems konnte nun eine mehrstufige Optimierung des Graphen vorgenommen werden. Diese sollte in Abhängigkeit eines vorgebenen maximalen Kostenbetrags einen möglichst guten Ausbau des Radwegenetzes bestimmen. Hierbei wurde wie folgt vorgegangen:​ Mithilfe dieses Bewertungssystems konnte nun eine mehrstufige Optimierung des Graphen vorgenommen werden. Diese sollte in Abhängigkeit eines vorgebenen maximalen Kostenbetrags einen möglichst guten Ausbau des Radwegenetzes bestimmen. Hierbei wurde wie folgt vorgegangen:​
   * Zunächst wurden nur die Wege zwischen den sehr wichtigen, zuerst ausgewählten,​ Knotenpunkten betrachtet. Bei diesen wurde bestimmt, welche Wegstecken am häufigsten auf kürzesten Wegen enthalten sind. Diese wurden für einen Ausbau in Betracht gezogen. Um zu bestimmen, welche dieser Wegstrecken tatsächlich ausgebaut werden sollten, wurden die Häufigkeiten der Verwendung in Relation zu den Kosten gesetzt um so eine wirtschaftliche Optimierung vorzunehmen. ​   * Zunächst wurden nur die Wege zwischen den sehr wichtigen, zuerst ausgewählten,​ Knotenpunkten betrachtet. Bei diesen wurde bestimmt, welche Wegstecken am häufigsten auf kürzesten Wegen enthalten sind. Diese wurden für einen Ausbau in Betracht gezogen. Um zu bestimmen, welche dieser Wegstrecken tatsächlich ausgebaut werden sollten, wurden die Häufigkeiten der Verwendung in Relation zu den Kosten gesetzt um so eine wirtschaftliche Optimierung vorzunehmen. ​
Zeile 47: Zeile 64:
   * In diesen Teilgraphen wurden wieder mehrfach die wichtigsten und wirschaftlichsten Wege bstimmt und ausgebaut. ​   * In diesen Teilgraphen wurden wieder mehrfach die wichtigsten und wirschaftlichsten Wege bstimmt und ausgebaut. ​
 Dieser Ausbau kann vollzogen werden solange noch genügend Geld hierfür vorhanden ist. Danach kann die Güte des Netzes erneut bewertet werden und so können benötigten Kosten eine zu erwartetende Zeitersparnis zugeordnet werden. ​ Dieser Ausbau kann vollzogen werden solange noch genügend Geld hierfür vorhanden ist. Danach kann die Güte des Netzes erneut bewertet werden und so können benötigten Kosten eine zu erwartetende Zeitersparnis zugeordnet werden. ​
 +Nach dem Ausbau kann das ausgebaute Netz mittels Maperitive veranschaulicht werden
  
 ===== Bestimmung der Kosten ===== ===== Bestimmung der Kosten =====
 Da die Kosten für einen Ausbau eines Fahrradweges je nach Quelle variieren, nahmen wir zunächst fiktive Daten für die Bestimmung der Einheitskosten für die verschiedenen Stufen des Ausbaus. Die Kosten für den Ausbau einer Teilstrecke ergaben sich dann als Produkt von Länge und Einheitskosten sowie eventuell einem "​Anfangssummanden",​ falls die Teilstrecke am Anfang oder Ende einer ausgebauten Strecke liegt. Dies verhindert das Zersplittern der ausgebauten Teile und sorgt für eher zusammenhängende ausgebaute Strecken, welche die Kosten reduzieren. ​ Da die Kosten für einen Ausbau eines Fahrradweges je nach Quelle variieren, nahmen wir zunächst fiktive Daten für die Bestimmung der Einheitskosten für die verschiedenen Stufen des Ausbaus. Die Kosten für den Ausbau einer Teilstrecke ergaben sich dann als Produkt von Länge und Einheitskosten sowie eventuell einem "​Anfangssummanden",​ falls die Teilstrecke am Anfang oder Ende einer ausgebauten Strecke liegt. Dies verhindert das Zersplittern der ausgebauten Teile und sorgt für eher zusammenhängende ausgebaute Strecken, welche die Kosten reduzieren. ​
 +
 +===== Zusammenfassung,​ Ausblick =====
 +Mit Fertigstellung des Projekts lässt sich nun ungefähr abschätzen,​ welche Verbesserung durch welchen ​ benötigten Kapitalbetrag erreicht werden kann. Die tatsächlich entstehenden Kosten hängen jedoch auch stark von den jeweiligen lokalen Gegebenheiten ab und somit sind die verwendeten Werte nur als Schätzwerte zu betrachten und das Ergebnis kann mit anderen vermuteten Kosten auch erheblich unterschiedlich ausfallen. Ebenso varriiert zum Teil auch der Grad des bisherigen Ausbaus von den Schätzungen. \\
 +Eine Verschnellerung des Optimierungsverfahrens könnte eine Planung für größere Netze ermöglichen,​ eventuelle spezielle geographische Gegebenheiten berücksichtigen und ein besseres Ergebnis erzielen. Denkbar wäre es auch, beispielsweise durch die Einbindung des öffentlichen Nahverkehrs ein realitätsnäheres Geschwindigkeitsoptimierungsproblem darzustellen. Auch durch Einbindung von Wartezeiten an Kreuzungen, sowie der (in Berlin eher vernachlässigbaren) Beeinflussung der Geschwindigkeit durch Steigungen oder Kurven kann eine wahrheitsgemäßere Einschätzung der Fahrtzeiten ermöglicht werden. ​
 +Nicht berücksichtigt wurde die Entwicklung des Netzes bei eventuellen Ausfällen einzelner oder mehrerer Teilabschnitte,​ wie sie beispielsweise durch Baustellen oder Großveranstaltungen entstehen könnten. Ebenso wurden eventuelle Kapazitätsproblematiken vernachlässigt. Eine Betrachtung dieser ist jedoch insbesondere dann empfehlenswert,​ wenn das Programm für andere Optimierungszwecke verwendet werden sollte. \\
 +
 +Aus theoretischer Sicht bleibt jedoch auch noch die Betrachtung des funktionalen Zusammenhangs zwischen Kosten und Nutzen interessant. Eine Untersuchung dessen könnte zukünftig Aufschluss darüber geben, welcher Investitionsbetrag das ideale Verhältnis herstellt. \\
 +
 +Ebenso bleibt zu betrachten, wieweit die gewählten Parameter und Verfahren (Kostenverhältnisse,​ Knoten zur Ermittlung der Qualität des Netzes, Bewertungs- und Optimierungsverfahren sowie einige absoluten Zahlen im Optimierungsprozess) das Ergebnis beeinflussen und unter welchen Bedingungen das aussagekräftigste Ergebnis zu erwarten ist. 
  
 ====Protokoll==== ====Protokoll====
ss16/radwege.1474264131.txt.gz · Zuletzt geändert: 2016/09/19 07:48 von mravin