模拟到达时间的问题

Sod*_*der 2 c++ simulation math sample distribution

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

从上午9点到下午5点,我把这一天打破了1分钟.

对于每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;
}
Run Code Online (Sandbox Code Playgroud)

上面代码的问题是:

  1. 拒绝部分非常昂贵

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

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

所以我的问题如下:

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

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

pjs*_*pjs 5

听起来你正试图模拟一个非齐次泊松过程,其中lambda(t)被分段定义到最接近的分钟.

正确的方法是" 减薄 ".基本上,找到最大的λ(t)和生成在时间t的伪进港航班1,T 2,T 3在速率拉姆达,... 最大.对于时间t i的每个伪到达,接受它作为具有概率λ(t i)/ lambda max的实际到达.结果是车辆到达隧道的一系列时间.