我正在尝试创建单个车道上交通拥堵的离散事件模拟。车道分为 10 段,即每辆车通过的“宽度”。这些段都需要 1 个单位的时间才能通过。我目前的设置有汽车以相同的速度通过,但我会改变它以允许慢速行驶的汽车花费更长的时间并造成交通拥堵。每个路段都是一个资源,如果当前正在使用,则受 request() 函数的约束。
我在 python 中用 simpy 来做这个。请记住,我几乎没有使用 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'
我有两个问题:1)这个错误的原因是什么?修复这个原因会使我的代码工作吗?2)有没有更优化的方法来用simpy编写这种模拟?- 特别是路段,很多相同的代码被一遍又一遍地重写。