прибытие агентов по пуассоновскому процессу

Я пытаюсь добиться прибытия агентов в мою модель в соответствии с пуассоновским процессом. Из данных я знаю, что в среднем в день прибывает 230 агентов (или 9,583 агента в час или 0,1597 в минуту). Теперь в симуляциях мне нужно использовать эту информацию для добавления агентов. Один временной шаг симуляции равен 5 минутам (реального времени) и если считать по данным, то в среднем 0,7986 агентов нужно добавлять в симуляцию каждый временной шаг, чтобы добиться в среднем 230 в день. Но как я мог это сделать? Я не могу использовать 0,7986 на временной шаг, потому что мне нужно целое число для добавления агента. Если я округлю 0,7986 до 1, то я переоценю это.

Понятно, что мы не можем добавлять агента каждый временной шаг, но я понятия не имею, как выбрать временной шаг, в который должен быть добавлен агент. Если я знаю, какой временной шаг мне нужно выбрать для добавления агента, я могу сделать это легко. Кто-нибудь знает, как это сделать в Python? Я попробовал приведенный ниже код, но не могу понять, что это на самом деле

for i in range(1,12): # 1 simulation time step is equal 5min, so this loops covers 1 hour. 
    time=int(random.expovariate(1/0.7986))

Я не очень понимаю приведенный выше код, так как он выдает совсем другие числа. Любая помощь, пожалуйста.


person HT121    schedule 29.05.2018    source источник


Ответы (1)


Если прибытия агентов являются процессом Пуассона, то время между прибытиями отдельных агентов имеет экспоненциальное распределение. Это то, что генерирует предоставленный вами код, но он полезен только в том случае, если вы используете непрерывное время с дискретным планированием событий. Используя временной шаг в качестве механизма продвижения по времени, вы на самом деле просто хотите придерживаться распределения Пуассона, регулируя скорость в соответствии с размером интервала временного шага, что вы уже сделали.

import numpy

last_step = 12 * 24   # to simulate one day, for example
rate = 230.0 / last_step
for time_step in range(1, last_step + 1):
    number_of_new_agents = numpy.random.poisson(rate)
    for new_agent_number in range(number_of_new_agents):
        # do whatever you want at this point

Обратите внимание, что number_of_new_agents часто будет равно 0, и в этом случае внутренний цикл будет повторяться ноль раз.

person pjs    schedule 29.05.2018
comment
Спасибо Pjs, спасибо за объяснение и пример кода. Работает идеально! - person HT121; 30.05.2018