3

我试图模拟一个事件的发生(车辆进入隧道),结果证明这是一个泊松过程。

我把一天分成 1 分钟的间隔,从早上 9 点到下午 5 点。

对于每 1 分钟的间隔,我计算/获得了平均值:

  1. 在此期间进入隧道的车辆数量。
  2. 每辆车进入隧道的时间(预计到达时间)

例如,对于 10:37-38 分钟,平均值为 5 辆车,平均到达间隔时间为 12 秒

要采样 10:37-38 分钟,我执行以下操作:

  1. 对平均值为 5 的泊松分布进行采样以确定有多少物品将到达,分配给 X
  2. 对平均 1/12 X 次的指数分布进行采样以得出到达间隔时间 y_0,y_1..._y_x
  3. 将到达间隔时间相加并分配给 K
  4. 如果K大于 60 秒,则转到步骤 2
  5. 累积各种计数器
  6. 最后打印统计信息。

代码如下:

#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;
}

上面代码的问题是:

  1. 拒绝部分非常昂贵

  2. 平均到达间隔时间的结果不正确:

    • 每分钟平均项目数:5.014
    • 平均到达间隔时间:7.647 秒

所以我的问题如下:

  1. 是否有更好更有效的技术来确保总的到达间隔时间永远不会超过该期间的最大秒数?

  2. 为什么平均到达间隔时间会向下倾斜?对于上面的示例,我预计它大约为 12 - 我认为代码中存在错误,但似乎无法解决。

4

2 回答 2

6

听起来您正在尝试模拟非齐次泊松过程,其中 lambda(t) 被分段定义到最近的分钟。

正确的做法是使用“细化”。基本上,找到最大 lambda(t) 并在时间 t 1、 t 2、 t 3 ……以 lambda max的速率生成伪到达。对于时间 t i的每个伪到达,将其视为具有概率 lambda(t i ) / lambda max的实际到达。结果是车辆到达隧道的时间序列。

于 2013-10-24T14:38:33.120 回答
0

我很确定模拟泊松过程的方法是对到达间隔时间进行采样并从中构造到达时间——对每单位时间的平均数和到达间隔时间进行采样对我来说没有任何意义。

于 2013-10-24T06:09:05.420 回答