模拟到达时间的问题

时间:2013-10-24 04:23:48

标签: c++ math distribution simulation sample

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

我从上午9点到下午5点将这一天打成间隔1分钟。

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

  1. 在此期间进入隧道的车辆数量。
  2. 每辆车进入隧道之间的时间(预计到达时间)
  3. 例如,对于分钟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. 最后打印统计数据。
    7. 代码如下:

      #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.647sec
      3. 所以我的问题如下:

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

        2. 为什么平均到达时间会下降?对于上面的示例,我预计它大约为12 - 我认为代码中有一个错误,但似乎无法将其放在上面。

2 个答案:

答案 0 :(得分:5)

听起来你正试图模拟一个non-homogeneous Poisson process,其中lambda(t)被分段定义到最近的分钟。

执行此操作的正确方法是使用“thinning”。基本上,找到最大lambda(t)并在t 1 ,t 2 ,t 3 ,... at时生成伪到达rate lambda max 。对于时间t i 的每个伪到达,接受它作为具有概率lambda(t i )/ lambda max 的实际到达。结果是车辆到达隧道的一系列时间。

答案 1 :(得分:0)

我非常确定模拟泊松过程的方法是对间隔时间进行采样并从中构建到达时间 - 对每单位时间的平均数和内部时间进行采样对任何意义都没有意义我