Нужна помощь в моделировании системы поезда с SimPy - PullRequest
2 голосов
/ 28 февраля 2012

Мне нужна помощь в моделировании системы поездов (например, системы метро) в SimPy, проблема в том, что мой учитель "Simulation" хочет, чтобы я использовал Python + SimPy, и у меня нет понятия, как его использовать после Прочитав неделю о SimPy, мне удалось понять пример банка, это легко, но сейчас у меня все еще нет идеи, как смоделировать задачу, которую мне дал учитель ...

Проблема большая и обширная, но мне просто нужна небольшая помощь, а не весь проект, поэтому, если кто-то сможет помочь, я буду очень признателен.

Уменьшенная проблема, которая поможет мне начать, выглядит следующим образом:

представьте, что у вас есть 3 станции (A, B, C), разделенные некоторым расстоянием (скажем, 100 м), и у меня есть 2 поезда, один на A и один на C (поезд 1 идет от A до C, tran2 идет от C до А) где каждый поезд имеет максимальную скорость (скажем, 50 м / с для обоих) и ускорение (скажем, 5 м / с ^ 2 и -5 м / с ^ 2 для пробоя), и все, что им нужно сделать, - это остановиться на каждой станции в течение нескольких секунд (скажем, 24 секунды) и переходите к следующей станции, когда они достигают конца, они ждут и дополнительные 20 секунд (смена рельсов), а затем начинают все сначала.

На станции есть лимит пассажиров (их не нужно моделировать), единственное, что на каждой станции случайное количество пассажиров, и когда поезд прибывает, некоторые встают, а другие спускаются ...

Итак, в основном мне нужна маленькая модель поезда и станций с этими 3 станциями ... Если кто-нибудь может мне помочь, пожалуйста ...

Настоящая проблема состоит в 22 станциях, 2 дополнительных станциях для смены полос движения, случайном времени ожидания, 42 поездах с разной максимальной скоростью и пропускной способностью, разным количеством пассажиров, генерируемых в зависимости от станции и времени суток, и т. Д ... все Я могу справиться с этим позже, но с логикой моделирования железнодорожной станции я не могу понять ... Спасибо за вашу помощь!

1 Ответ

7 голосов
/ 29 февраля 2012

Я ни в коем случае не эксперт в SimPy, но вам стоит начать:

"""
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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...