Как получить случайное время, устанавливающее минимальный порог с SimPy? - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь получить генератор случайных транспортных средств из процедуры симуляции SimPy. Код, который я использую, я извлек и адаптировал из http://phillipmfeldman.org/Python/discrete_event_simulation/traffic_sim.py. Проблема в том, что я хотел бы, чтобы транспортные средства достигали не менее указанного значения, например, 1006 * (4 секунды). В приведенном ниже коде представлены транспортные средства, прибывающие в случайном порядке, но иногда скорость движения слишком мала (например, транспортное средство № 2 прибыло в 2,03 и транспортное средство № 3 прибыло в 2,45, эта разница составляет менее 1 секунды). Я хотел бы знать, если есть способ установить заданный порог c для моделирования, спасибо ...

from collections import deque # double-ended queue
from numpy import random
import simpy
from simpy.util import start_delayed

class Struct(object):
   def __init__(self, **kwargs):
      self.__dict__.update(kwargs)

random.seed([1, 2, 3])

# Total number of seconds to be simulated:
end_time= 3600.0

# Cars cars arrive at the traffic light according to a Poisson process with an
# average rate of (0.00028-0.5) per second:
demand_per_hour = 1800 #veh/h
sh = 4 # sat headway 4 seconds,


arrival_rate= demand_per_hour/(3600*sh)
t_interarrival_mean= 1.0 / arrival_rate

queue= deque()
arrival_count = departure_count= 0

def arrival():

   global arrival_count, env, queue

   while True:
      arrival_count+= 1

      print("Vehicle #%d arrived at time "
         "%.3f." % (arrival_count, env.now))

      # Schedule next arrival:
      yield env.timeout( random.exponential(t_interarrival_mean))

print("\nSimulation of Cars Arriving at Intersection Controlled by a Traffic "
  "Light\n\n")
env= simpy.Environment()
t_first_arrival= random.exponential(t_interarrival_mean)
start_delayed(env, arrival(), delay=t_first_arrival)
env.run(until=end_time)

1 Ответ

0 голосов
/ 21 апреля 2020

Несколько способов сделать это.

  1. Сокращение вашего экспоненциального распределения по времени между получателями:
t=max(threshold_value, random.exponential(t_interarrival_mean))
Сдвиньте свое экспоненциальное распределение IAT (также известное как двухпараметрическое экспоненциальное распределение):
t = threshold_value + random.exponential(t_interarrival_mean)
Использовать другой дистрибутив. Вы уверены, что экспоненциальный лучше? Как насчет распределения tri angular?
...