Besoin d'aide pour modéliser un système de train avec simpy
-
13-11-2019 - |
Question
J'ai besoin d'aide pour modéliser un système de train (comme un système de métro) à Simpy, le problème est que mon professeur de "simulation" veut que je utilise Python + Simpy et je n'ai pas d'indice comment l'utiliser, après un Semaine Lecture sur Simpy J'ai réussi à comprendre l'exemple de la Banque, c'est facile, mais maintenant je n'ai toujours pas une idée sur la façon de modéliser le problème que le professeur m'a donné ...
Le problème est grand et étendu, mais j'ai juste besoin d'une petite aide, pas tout le projet fait, alors, si quelqu'un peut aider, je vais vraiment apprécier.
Le problème réduit qui va m'aider à démarrer est comme celui-ci:
Imaginez que vous avez 3 stations (A, B, C) séparées par une certaine distance (disons 100m) et j'ai 2 trains, un sur a et un sur c (train1 allant de A à C, Tran2 passant de C à A) où chaque train a une vitesse maximale (disons 50m / s pour les deux) et l'accélération (disons 5m / s ^ 2 et -5m / s ^ 2 pour la rupture) et tout ce qu'ils ont à faire est de s'arrêter sur chaque station Pendant quelques secondes (disons 24s) et continuez à la prochaine station, lorsqu'ils atteignent la fin, ils attendent et extra 20 secondes (change de rails), puis recommencez.
La station a une limite de passagers (ils n'ont pas besoin d'être simulés) La seule chose est que chaque station a un nombre aléatoire de passagers et lorsque le train arrive certains et que d'autres descendent ...
Alors, fondamentalement, j'ai besoin d'un petit modèle du train et des stations avec ces 3 stations ... Si quelqu'un peut m'aider s'il vous plaît ...
Le problème réel a 22 stations, 2 stations supplémentaires pour changer de voie, une durée aléatoire à attendre, 42 trains avec une vitesse et une capacité maximales différentes, un nombre différent de passagers générés en fonction de la station et de l'heure de la journée, etc. Ce genre de choses que je peux gérer plus tard, mais la logique de modélisation du système de train-gare, je ne peux pas sembler comprendre ... Merci pour votre aide!
La solution
Je ne suis en aucun cas un expert avec Simpy, mais cela devrait vous aider à démarrer:
"""
Simulation of a train network
"""
from SimPy.Simulation import *
from math import sqrt
from random import randint
from itertools import cycle
def timeTo(A, maxV, d):
"""
Given a trapezoidal velocity envelope defined by
A constant acceleration, m/s/s
maxV maximumum velocity, m/s
return time in seconds required to travel
d distance, m
"""
tA = float(maxV)/A # time to accelerate to maxV
dA = A*tA*tA # distance traveled during acceleration from 0 to maxV and back to 0
if (d < dA): # train never reaches full speed?
return sqrt(4.0*d/A) # time needed to accelerate to half-way point then decelerate to destination
else:
return 2*tA + (d-dA)/maxV # time to accelerate to maxV plus travel at maxV plus decelerate to destination
class Train(Process):
def __init__(self, name, sim, accel=1.0, maxV=50.0, passengers=0, maxPassengers=400):
super(Train, self).__init__(name, sim)
self.accel = accel
self.maxV = maxV
self.p = passengers
self.maxP = maxPassengers
def roll(self, route):
here = route.next() # starting location
for dest in route:
# travel to next station
print "{:.1f}s: {} leaving {} for {}".format(self.sim.now(), self.name, here, dest)
yield hold, self, timeTo(self.accel, self.maxV, here.distanceTo[dest])
# arrive at next station
here = dest
print "{:.1f}s: {} at {}".format(self.sim.now(), self.name, here)
yield hold, self, here.arrive(self)
def getOff(self, num):
if self.p >= num:
print " {} passengers got off".format(num)
self.p -= num
else:
num = self.p
print " train is empty - only {} passengers got off".format(num)
self.p = 0
def getOn(self, num):
if (self.maxP is None) or (self.p + num <= self.maxP):
print " {} passengers got on".format(num)
self.p += num
else:
num = self.maxp - self.p
print " train is full - only {} passengers got on".format(num)
self.p = self.maxp
class TrackNode(object):
def __init__(self, name, delay=5.0):
self.name = name
self.delay = delay
self.distanceTo = {}
def arrive(self, train):
pass
def __str__(self):
return self.name
class Station(TrackNode):
def arrive(self, train):
train.getOff(randint(1,15))
train.getOn(randint(1,15))
return self.delay
class Switch(TrackNode):
def arrive(self, train):
print(" switching tracks")
return self.delay
class SampleRailroad(Simulation):
def run(self, maxTime=100.0):
self.initialize()
# create places
x = Switch("switch x", 20.0)
A = Station("Station A", 24.0)
B = Station("Station B", 27.0)
C = Station("Station C", 25.0)
y = Switch("switch y", 18.0)
# distances between places
x.distanceTo[A] = 50.0
A.distanceTo[B] = 5000.0
B.distanceTo[C] = 2000.0
C.distanceTo[y] = 80.0
y.distanceTo[C] = 80.0
C.distanceTo[B] = 2000.0
B.distanceTo[A] = 5000.0
A.distanceTo[x] = 50.0
# set up first train
sf = Train("Santa Fe 219", self)
self.activate(sf, sf.roll(cycle([A,B,C,y,C,B,A,x])), at=0.0)
# set up second train
cn = Train("Canadian National 41", self, maxPassengers=200)
self.activate(cn, cn.roll(cycle([C,B,A,x,A,B,C,y])), at=5.0)
# start simulating!
self.simulate(until=maxTime)
def main():
rr = SampleRailroad()
rr.run(800.0)
if __name__=="__main__":
main()