2016-06-24 3 views
0

Я пытаюсь создать дискретное моделирование событий заторов на одной полосе. Дорожка разделена на 10 сегментов, которые являются «шириной» каждого проходящего автомобиля. Эти сегменты занимают всего 1 единицу времени. У меня в настоящее время есть автомобили, проходящие с такой же скоростью, но я изменю его, чтобы позволить медленным движущимся автомобилям занять больше времени и создать пробки на дорогах. Каждый сегмент дороги является ресурсом, который подчиняется функции request(), если он используется в настоящее время.AttributeError и синтаксис для моделирования трафика Simpy

Я делаю это с simpy в python. Имейте в виду, что у меня почти нет опыта работы с python. Вот мой код:

import simpy 
import numpy 

inter_ArrivalTime = 2 
car_Speed = 1 
c = 1 

simpy.seg1 = simpy.Resource(env, 1) 
simpy.seg2 = simpy.Resource(env, 1) 
simpy.seg3 = simpy.Resource(env, 1) 
simpy.seg4 = simpy.Resource(env, 1) 
simpy.seg5 = simpy.Resource(env, 1) 
simpy.seg6 = simpy.Resource(env, 1) 
simpy.seg7 = simpy.Resource(env, 1) 
simpy.seg8 = simpy.Resource(env, 1) 
simpy.seg9 = simpy.Resource(env, 1) 
simpy.seg10 = simpy.Resource(env, 1) 

SIM_LOG = [] 

class Street(object): 

    def __init__(self, env, carSpeed): 
     self.env = env 
     self.carSpeed = carSpeed 

    def seg1(self, car): 
     yield self.env.timeout(car_Speed) 
    def seg2(self, car): 
     yield self.env.timeout(car_Speed) 
    def seg3(self, car): 
     yield self.env.timeout(car_Speed) 
    def seg4(self, car): 
     yield self.env.timeout(car_Speed) 
    def seg5(self, car): 
     yield self.env.timeout(car_Speed) 
    def seg6(self, car): 
     yield self.env.timeout(car_Speed) 
    def seg7(self, car): 
     yield self.env.timeout(car_Speed) 
    def seg8(self, car): 
     yield self.env.timeout(car_Speed) 
    def seg9(self, car): 
     yield self.env.timeout(car_Speed) 
    def seg10(self, car): 
     yield self.env.timeout(car_Speed) 

def car(env, name, Street): 
    with Street.seg1.request() as req: 
     yield req 
     print("%s enters road at %.2f" % (name, env.now)) 
     SIM_LOG.append([name, "enters road", env.now]) 
     yield env.process(Street.seg1(name)) 
    with Street.seg2.request() as req: 
     yield req 
     SIM_LOG.append([name, "segment 2", env.now]) 
     yield env.process(Street.seg2(name))  
    with Street.seg3.request() as req: 
     yield req 
     SIM_LOG.append([name, "segment 3", env.now]) 
     yield env.process(Street.seg3(name)) 
    with Street.seg4.request() as req: 
     yield req 
     SIM_LOG.append([name, "segment 4", env.now]) 
     yield env.process(Street.seg4(name)) 
    with Street.seg5.request() as req: 
     yield req 
     SIM_LOG.append([name, "segment 5", env.now]) 
     yield env.process(Street.seg5(name)) 
    with Street.seg6.request() as req: 
     yield req 
     SIM_LOG.append([name, "segment 6", env.now]) 
     yield env.process(Street.seg6(name)) 
    with Street.seg7.request() as req: 
     yield req 
     SIM_LOG.append([name, "segment 7", env.now]) 
     yield env.process(Street.seg7(name)) 
    with Street.seg8.request() as req: 
     yield req 
     SIM_LOG.append([name, "segment 8", env.now]) 
     yield env.process(Street.seg8(name)) 
    with Street.seg9.request() as req: 
     yield req 
     SIM_LOG.append([name, "segment 9", env.now]) 
     yield env.process(Street.seg9(name)) 
    with Street.seg10.request() as req: 
     yield req 
     print("%s left the road at %.2f" % (name, env.now)) 
     SIM_LOG.append([name, "segment 10", env.now]) 
     yield env.process(Street.seg10(name)) 

def setup(env, carSpeed, interArrivalTime, c): 
    street = Street(env, carSpeed) 
    yield env.timeout(interArrivalTime) 

    c += 1 
    env.process(car(env, c, street)) 

#random.seed(30) 

env = simpy.Environment() 
env.process(setup(env, car_Speed, inter_ArrivalTime, c)) 

env.run(until=60) 

Бег это дает мне следующую ошибку:

AttributeError: 'function' object has no attribute 'request' 

У меня 2 вопроса: 1) Что является причиной этой ошибки? Устранить эту причину заставит мой код работать? 2) Есть ли более оптимальный способ написания такого моделирования с помощью simpy? - особенно сегменты дороги, которые много переписывают один и тот же код снова и снова.

+0

Полная стопка была бы полезна. –

ответ

0
  1. Street.seg1 функция seg1, что вы определили в классе Strett, а не ресурс, который был определен выше (Почему вы даже, что ваши экземпляры ресурсов в Simpy-пространстве имен ??).

  2. Да, есть лучшие способы.

Я думаю, вы должны игрушка вокруг с примерами, приведенными в документации Simpy первый и получить немного больше знакомы с обеими, Python и Simpy, прежде чем продолжить фактическое моделирование.

Смежные вопросы