我正在尝试模拟事件的发生(车辆进入隧道),事实证明这是一个泊松过程。
我将一天分成 1 分钟的间隔,从上午 9 点到下午 5 点。
对于每 1 分钟的间隔,我计算/获得平均值:
- 在此期间进入隧道的车辆数量。
- 每辆车进入隧道之间的时间(预计到达间隔时间)
例如,对于分钟 10:37-38,平均值是 5 辆车,平均到达间隔时间为 12 秒
为了采样 10:37-38 分钟,我执行以下操作:
- 对均值为 5 的泊松分布进行抽样以确定将到达的元素数量,分配给 X
- 对均值为 1/12 X 的指数分布进行采样,得出到达间隔时间 y_0、y_1..._y_x
- 将到达间隔时间求和并分配给 K
- 如果 K 大于 60 秒,转到第 2 步
- 积累各种计数器
- 最后打印统计信息。
代码如下:
#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;
}
上面代码的问题是:
拒收部分成本很高
平均到达间隔时间的结果不正确:
- 平均每分钟项目数:5.014
- 平均到达间隔时间:7.647 秒
所以我的问题如下:
是否有更好更有效的技术来确保总到达间隔时间永远不会超过该时段内的最大秒数?
为什么平均到达间隔时间偏低?对于上面的示例,我预计它大约是 12 - 我认为代码中存在错误,但我似乎无法确定。
最佳答案
听起来您正在尝试模拟 non-homogeneous Poisson process其中 lambda(t) 被分段定义为最接近的分钟。
正确的方法是使用“thinning”。基本上,找到最大 lambda(t) 并在时间 t1、t2、t3 生成伪到达,...速率 lambdamax。对于时间 ti 的每个伪到达,将其视为概率为 lambda(ti)/lambdamax 的实际到达。结果是车辆到达隧道的时间序列。
关于c++ - 模拟到达间隔时间的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19556891/