Versuch einer Verkehrssimulation

Du hast eine Idee für ein Projekt?
Timberjack
User
Beiträge: 7
Registriert: Dienstag 1. Juli 2014, 16:34

Hallo BlackJack, vielen Dank für deine Antwort. Darüber habe ich mir bereits ein paar Gedanken gemacht. Und zwar sollte letztlich eine Simulation zum Laufen gebracht werden, welche ebenfalls Geschwindigkeits-Dichte-Diagramme bzw. Verkehrsfluss-Dichte-Diagramme ausgibt. Ich dachte ich benutze ein Gitter mit äquidistanten Gitterabstand und entweder das Feld ist besetzt (ein Auto ist darauf) oder nicht. Die Auswahl könnte ja auch zufällig erfolgen, man also dem Programm mit einer bestimmten Wahrscheinlichkeit die Wahl lässt, ob dieses Feld nun besetzt ist oder nicht. Zum Thema Auto wäre ich zunächst von identischen Autos ausgegangen, welche sich lediglich in der Geschwindigkeit unterscheiden. Also ein Typ schnelles Auto, welches sich nach einem kürzeren Zeitabstand um ein Feld nach "vorn" bewegt verglichen mit einem "langsameren" Typ Auto. Aus diesem Grund hätte ich mir erstmal einen festen Straßenabschnitt (z.B. 100 Gitterpunkte) herausgesucht und mir eine Verkehrsdichte definiert, welche wiederum zufällig die einzelnen Felder belegt. Aus den unterschiedlichen Zeitabständen würde man sicherlich auf die Geschwindigkeit schließen können und könnte somit die Diagramme erstellen. Klappt dieser Gedankengang? Später könnte man sicherlich die Verkehrsdichte variabel gestalten.?
BlackJack

@Timberjack: Also das mit der Verkehrsdichte habe ich nicht verstanden wie(so) die die einzelnen Felder zufällig belegt. Ich hätte jetzt gedacht die ergibt sich daraus wieviele Fahrzeuge sich auf dem Abschnitt befinden. Und das ergibt sich ja letztendlich aus dem Simulationsablauf.

Was repräsentiert denn ein einzelner Gitterpunkt? Also ganz konkret wie viele Meter Strasse.
Timberjack
User
Beiträge: 7
Registriert: Dienstag 1. Juli 2014, 16:34

...ja ok, so langsam beginne ich mich zu verzetteln. Also die Verkehrsdichte bezieht sich natürlich auf die Fahrzeuge auf dem Streckenabschnitt. Ein besetzter Gitterpunkt wäre dann bei mir ein angenommenes Fahrzeug. Da ich die Strecke in äquidistante Abschnitte teilen würde, entspräche z.B. also ein Gitterpunkt 10m bei insgesamt 100 Gittermetern. Natürlich ist ein Standard-PKW keine 10m lang, aber ich dachte auch eher, dass es erstmal wichtiger ist zu sagen dass sich an der Stelle ein PKW befindet und dieser sich nach einem bestimmten Zeitintervall weiterbewegt. Ich würde also erstmal davon ausgehen, dass nur ein Auto auf ein Gitterfeld passt.
BlackJack

@Timberjack: Aus der Länge eines Gitterpunktes im Verhältnis zur Standardauto-Länge ergibt sich dann ja wie weit andere Fahrzeuge auffahren können, wenn ein langsameres Auto vor einem eigentlich schnelleren fährt. Ich fragte nur, damit das nicht *zu* unrealistisch wird. :-)
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Timberjack hat geschrieben:also ein Gitterpunkt 10m bei insgesamt 100 Gittermetern.
"Gittermeter"? Ich denke Du meinst Gitterpunkte und Du willst 1km simulieren.
Timberjack hat geschrieben:Natürlich ist ein Standard-PKW keine 10m lang, aber ich dachte auch eher, dass es erstmal wichtiger ist zu sagen dass sich an der Stelle ein PKW befindet und dieser sich nach einem bestimmten Zeitintervall weiterbewegt.
Wenn Du auf ca. 6-7m runtergehst, dann kannst Du auch einen Stau simulieren.

Du brauchst wahrscheinlich auch eine Art von Gruppierung der Gitterpunkte. Denn jeder PKW braucht in Abhängigkeit seiner Geschwindigkeit mehr oder weniger freie Gitterpunkte vor seinem eigenen Gitterpunkt. Und ein LKW nimmt sowieso mehrere Gitterpunkte ein.

Bei jedem Auto würde ich als Zustand nicht einfach nur die Geschwindigkeit speichern, sondern auch die Beschleunigung und die Wunschgeschwindigkeit. Wenn Du die Strecke diskretisiert hast, dann musst Du auch die Geschwindigkeit diskretisieren in Gitterpunkte pro Zeitintervall.

Am schwierigsten stelle ich mir den Spurwechsel und das Überholen vor.
a fool with a tool is still a fool, www.magben.de, YouTube
Timberjack
User
Beiträge: 7
Registriert: Dienstag 1. Juli 2014, 16:34

ok das klingt alles ziemlich einleuchtend. Dies macht die Sache nun für mich nicht unbedingt einfacher, im Gegenteil. Denn ich frage mich nur, wie ich das ganze umsetzen sollte?

@MagBen: Wie gruppiere ich mir die Gitterpunkte? Ich hatte mir schon überlegt, dass ein Auto (besetzer Gitterpunkt) vor dem Vorrücken auf einen neuen Gitterpunkt erstmal kontrollieren sollte, ob dieser nicht besetzt ist. Um die Simulation erstmal zum Laufen zu bringen und die Fahrzeuge überschaubar zu halten, dachte ich zunächst an identische Autos. LKW, PKW mit Anhänger, Boote und Flugzeuge sowie Spurwechsel und Überholen hätte ich später versucht hinzuzufügen. Oder sollte ich das von Beginn an berücksichtigen?
BlackJack

Was das komplizierte angeht: Man muss immer im Auge behalten wie genau man die Wirklichkeit abbilden möchte. Wenn von ”oben” ein zellulärer Automat als mögliche Lösung vorgeschlagen wurde, dann wären das mit Abstand vor dem Auto variiert mit Geschwindigkeit und irgendwelchen komplizierteren Überholmaneuvern als der Wagen wechselt halt nicht nur einen Gitterpunkt in Längsrichtung, sondern auch noch einen quer, vielleicht nice to have, aber nicht wirklich nötig. Das hängt auch sicher ein wenig davon ab ob das eine Hausaufgabe mit 2 Wochen Zeit ist, wo man am Ende ein bisschen Code und ein paar Diagramme abgibt, und der Tutor da mal kurz drüber schaut, oder eher so etwas wie ein Seminar wo das ganze Semester genutzt werden kann, das Ergebnis vorgestellt und schriftlich ausgearbeitet werden muss.
Timberjack
User
Beiträge: 7
Registriert: Dienstag 1. Juli 2014, 16:34

mh verstehe. Grundsätzlich ist mir die methodische Umsetzung des Problems freigestellt. Den Zellulären Automaten hätte ich erstmal vorgezogen, da ich mir diesen selbst erstmal am Besten erklären kann. Leider habe ich kein ganzes Semester für diese Arbeit Zeit, eher ein paar Wochen.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Hier ein Skizze, die Zeigt wie man mit Numpy Numerik machen kann.
Beachte das fehlen der Schleifen!

Code: Alles auswählen

#numerik wird mit Fortran, C++ oder Numpy gemacht
import numpy as N

#Strasse
#Einspurig, 1000 Elemente
#mit Index belegt: Auto, mit -1: frei
#aktueller Zustand
s1 = N.empty((1000,), dtype=N.int32)

#naechster Zeitschritt
s2 = N.empty((1000,), dtype=N.int32)

#Anfangszustand: 5 Autos (mehr moechte ich nicht tippen)
#Hier sind die Autos (location)
loc = N.array([0, 80, 95, 300, 400])

#Geschwindigkeiten (velocity)
v = N.array([10, 12, 5, 11, 7])

#Wir fuellen die Strasse
# alles leer
s1[:] = -1

#jetzt kommen die Autos
autos = N.arange(5, dtype=N.int32)
s1[loc] = autos

#naechster Zeitschritt
loc += v
s2[:] = -1
s2[loc] = autos

#swap s1, s2
s1,s2 = s2,s1

#Was hier fehlt:
#Ueberpruefung auf Sicherheitsabstand
#Konstanten 1 und 10. haengen davon ab,
#wie lang eine Strassenzelle ist und ein Zeitschritt
def sicherheitsabstand(v):
    return int(1+v**2/10.)

print "Weg frei fuer Auto 1:", not N.any( s1[ loc[1]+1 : loc[1]+sicherheitsabstand(v[1]) ]!=-1)
print "Weg frei fuer Auto 3:", not N.any( s1[ loc[3]+1 : loc[3]+sicherheitsabstand(v[3]) ]!=-1)
a fool with a tool is still a fool, www.magben.de, YouTube
Timberjack
User
Beiträge: 7
Registriert: Dienstag 1. Juli 2014, 16:34

@MagBen: vielen Dank. Inzwischen habe ich auch ein wenig gebastelt und ein ähnliches herausgefunden. Dabei sind dann die Autos auf einer Strecke zufällig verteilt und fahren 10 Zeitschritte vorwärts

Code: Alles auswählen

import scipy as sc
import numpy as np
import pylab

# Dichte = Fahrzeuge pro Strecke (Streckenlaenge = 100m)
# Streckenlaenge
Streckenlaenge = 100

#Dichte = np.random.randn(1000)	   # wenn man von 10% Dichte auf der Gesamtstrecke ausgeht
Dichte = 0.1

# Totalanzahl an Autos
Fahrzeuganzahl = Dichte * Streckenlaenge

#Straße mit 100 Punkten
Track = np.zeros(Streckenlaenge)

# auf einer Strecke der Laenge sitzen an diesen Positionen Fahrzeuge
Fahrzeugposition = np.sort(np.ceil(np.random.rand(Fahrzeuganzahl)*Streckenlaenge))

print 'Anzahl der Fahrzeuge: ', Fahrzeuganzahl
print 'Fahrzeugpositionen: ', Fahrzeugposition

# Geschwindigkeitsprofil
# vorgegebene Durchschnittsgeschwindigkeit v = 10
mittlereGeschwindigkeit = 10
# jetzt der Vektor fuer alle Geschwindigkeiten (Gaußverteilt)
Anfangsgeschwindigkeit = np.ceil(np.random.randn(Fahrzeuganzahl) + mittlereGeschwindigkeit)

print 'Anfangsgeschwindigkeiten aller Fahrzeuge: ', Anfangsgeschwindigkeit

Orbit = []

#Ueberholen ist zugelassen, Fahrzeugposition und Geschwindigkeiten nach 10 Zeitschritten
Zeitschritte = 10
for i in range(Zeitschritte):
    Fahrzeugposition += Anfangsgeschwindigkeit
    Orbit.append(Fahrzeugposition*1.0)

print 'Anfangsgeschwindigkeit: ', Anfangsgeschwindigkeit
print 'Fahrzeugposition: ', Fahrzeugposition
print 'Fahrzeugposition nach 10 Durchläufen: ', Orbit
BlackJack

@MagBen: Nur das die Schleifen nicht wirklich fehlen, sondern irgendwo in den Numpy-Funktionen stecken. Das erscheint mir alles ein wenig umständlich wenn man die Positionen der Autos kennt in einer Schleife in |Sicherheitsabstand| Schritten Gitterpunkte zu überprüfen statt einfach den Abstand mit *einer* Rechenoperation auszurechnen. Das was Du gezeigt hast, kann man zum Beispiel auch so modellieren, dass man eine Spur durch eine nach Strechenposition sortierte Sequenz von Autos modelliert. Die kann man dann linear, paarweise durchgehen und ganz einfach die Entfernung zwischen beiden Fahrzeugen berechnen.
Antworten