Simpy流量模拟中的属性错误和语法

2024-04-18 09:27:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个单车道交通拥堵的离散事件模拟。车道分为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)

运行此命令会出现以下错误:

^{pr2}$

我有两个问题: 1) 这个错误的原因是什么?解决这个问题能让我的代码工作吗? 2) 用simpy编写这种模拟有没有更好的方法?-尤其是路段,其中很多相同的代码被一遍又一遍地重写。在


Tags: nameselfenvlogstreetrequestdefsim
1条回答
网友
1楼 · 发布于 2024-04-18 09:27:32
  1. 在街道.seg1是您在stret类中定义的函数seg1,而不是您在上面定义的资源(为什么还要在simpy名称空间中定义资源实例??)。

  2. 是的,有更好的方法。

我认为您应该先玩玩SimPy文档中提供的示例,在继续进行实际模拟之前,先对Python和SimPy这两个方面有一点熟悉。在

相关问题 更多 >