Я пытаюсь смоделировать возникновение события (транспортное средство, въезжающее в туннель), которое, как оказалось, является пуассоновским процессом.
Я разбил день на 1-минутные интервалы, начиная с 9 утра до 5 вечера.
Для каждого 1-минутного интервала я вычислил / получил среднее значение:
Например, для минуты 10: 37-38 среднее значение составляет 5 транспортных средств со средним временем прибытия 12 секунд.
Для отбора минут 10: 37-38 я делаю следующее:
Код выглядит следующим образом:
#include <iostream>
#include <cstdio>
#include <random>
#include <algorithm>
#include <iterator>
int main()
{
double mean_num_itms = 5.0;
double mean_inter_time = 12; //seconds
double max_sec_in_period = 60; //seconds
unsigned int rounds = 10000;
std::random_device r;
std::exponential_distribution<double> exponential(1.0 / mean_inter_time);
std::poisson_distribution<double> poisson(mean_num_itms);
double total_itms = 0;
double total_inter_time = 0;
for (std::size_t i = 0; i < rounds; ++i)
{
//Determine how many items will arrive in time period
unsigned int num_itms = (unsigned int)(poisson(r));
total_itms += num_itms;
//Get the interarrival times for the 'num_itms'
double last_arrival_time = 0;
do
{
last_arrival_time = 0;
for (unsigned int j = 0; j < num_itms; ++j)
{
double current_arrival_time = exponential(r);
last_arrival_time += current_arrival_time ;
}
}
//Reject any group of arrival times that exceed period span.
while (last_arrival_time > max_sec_in_period);
total_inter_time += last_arrival_time;
}
printf("Mean items per minute: %8.3f\n" ,total_itms / rounds);
printf("Mean inter-arrival time: %8.3fsec\n",total_inter_time / total_itms);
return 0;
}
Проблема с кодом выше:
Отклонение части очень дорого
Результаты для среднего времени прибытия неверны:
Итак, мои вопросы таковы:
Существует ли лучший, более эффективный метод, обеспечивающий, чтобы общее время между прибытиями никогда не превышало максимальное количество секунд в периоде?
Почему среднее время прибытия искажено? для приведенного выше примера я ожидаю, что он будет примерно 12 — я думаю, что в коде есть ошибка, но, похоже, я не могу это понять.
Похоже, вы пытаетесь смоделировать неоднородный пуассоновский процесс где лямбда (t) определяется в кусочных сегментах с точностью до минуты.
Правильный способ сделать это с «разжижениеMsgstr «По сути, найдите максимальную лямбду (t) и сгенерируем псевдоприбытие в моменты времени t1, T2, T3,… по ставке лямбдаМаксимум. Для каждого псевдоприбытия в момент времени tя, принять это как фактическое прибытие с вероятностью лямбда (тя) / лямбдаМаксимум. Результатом является последовательность времени, в которое транспортные средства прибывают в туннель.
Я вполне уверен, что способ симуляции пуассоновского процесса состоит в том, чтобы взять время выборки и построить время прибытия из этого — выборка как среднего числа в единицу времени, так и времени поступления не имеет для меня никакого смысла.