0

単一車線の交通渋滞の離散イベント シミュレーションを作成しようとしています。車線は、通過する各車の「幅」である 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'

2 つの質問があります。1) このエラーの原因は何ですか? この原因を修正すると、コードが機能するようになりますか? 2) この種のシミュレーションを simpy で記述するより最適な方法はありますか? - 特に、同じコードが何度も何度も書き直されている道路のセグメント。

4

1 に答える 1

0
  1. Street.seg1 は、上で定義したリソースではなく、Strett クラス内で定義した関数 seg1 です (リソースのインスタンスを simpy-Namespace にするのはなぜですか??)。

  2. はい、もっと良い方法があります。

実際のシミュレーションを続行する前に、最初に SimPy ドキュメントで提供されている例をいじって、Python と SimPy の両方にもう少し慣れておく必要があると思います。

于 2016-06-24T10:26:09.327 に答える