Problemy symulujące czasy międzywęzłowe
Próbuję symulować wystąpienie zdarzenia (pojazdu wchodzącego do tunelu), który jak się okazuje jest procesem Poissona.
Przerwałem dzień w odstępach 1-minutowych, zaczynając od 9 rano do 5 po południu.
Dla każdego interwału 1 minuty obliczyłem / otrzymałem średnią:
Liczba pojazdów, które wchodzą do tunelu w tym okresie.Czas pomiędzy każdym pojazdem wjeżdżającym do tunelu (oczekiwany czas między przejściami)Na przykład dla minuty 10: 37-38 średnia wynosi 5 pojazdów, a średni czas między przybyciem wynosi 12 sekund
Aby wypróbować 10: 37-38 minut, wykonuję następujące czynności:
Przykładowy rozkład Poissona ze średnią 5, aby określić, ile elementów dotrze, przypisz do XPrzykładowy rozkład wykładniczy średniej 1/12 X razy, aby uzyskać czasy między kolejnymi przyjazdami y_0, y_1 ..._ y_xPodsumuj czasy międzyprzedziałowe i przypisz KJeśliK jest dłuższy niż 60 sekund przejdź do kroku 2Akumuluj różne licznikiWreszcie wydrukuj statystyki.Kod jest następujący:
#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;
}
Problem z powyższym kodem to:
Część odrzucenia jest bardzo kosztowna
Wyniki dotyczące średniego czasu między przybyciem są nieprawidłowe:
Średnie przedmioty na minutę: 5.014Średni czas między przybyciem: 7,647 sMoje pytania są następujące:
Czy istnieje lepsza, skuteczniejsza technika zapewniająca, że całkowity czas między przyjazdami nigdy nie przekroczy maksymalnej liczby sekund w danym okresie?
Dlaczego średni czas między przyjazdami jest przekrzywiony? w powyższym przykładzie spodziewam się, że będzie to około 12 - myślę, że w kodzie jest błąd, ale nie wydaje mi się, żebym go dotknął.