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!

Était-ce utile?

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()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top