2016-06-24 9 views
0

단일 차선에서 교통 정체의 개별 이벤트 시뮬레이션을 만들려고합니다. 차선은 통과하는 각 차량의 "너비"인 10 개의 세그먼트로 나누어집니다. 이 세그먼트들은 모두 1 단위의 시간이 걸립니다. 나의 현재의 설정은 차가 같은 속도로오고 있지만 더 느리게 움직이는 차가 더 오래 걸리고 교통 혼잡을 일으킬 수 있도록 차를 바꿀 것이다. 도로의 각 세그먼트는 현재 사용중인 경우 request() 함수의 영향을받는 리소스입니다.Simpy 교통 시뮬레이션의 AttributeError 및 구문

저는 python에서 simpy를 사용하고 있습니다. 파이썬에 대한 경험이 거의 없다는 것을 명심하십시오. 여기 내 코드입니다 : 나는이 개 질문이

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

:

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) 

이 나에게 다음과 같은 오류를 제공 실행 1)이 오류의 원인이 무엇입니까? 이 문제를 수정하면 내 코드가 작동합니까? 2) simpy로 이런 종류의 시뮬레이션을 작성하는 더 좋은 방법이 있습니까? - 특히 동일한 코드가 반복적으로 반복되는 도로 구간.

+0

완전한 스택 추적이 도움이되었을 것입니다. –

답변

0
  1. Street.seg1 당신의 Strett 클래스 내에서 당신은 위에 정의되지 않은 자원을 정의 함수 SEG1이다 (왜 당신도 그 (02) - 네임 스페이스 ??에 자원 인스턴스).

  2. 네, 더 좋은 방법이 있습니다.

난 당신이 모두 좀 더 잘 알고 먼저 Simpy에 워드 프로세서에서 제공하는 예제와 함께 장난감 주위해야 얻을 생각, 파이썬과 Simpy에, 당신은 당신의 실제 시뮬레이션을 계속하기 전에.