【问题标题】:Problems Simulating Interarrival Times模拟到达时间的问题
【发布时间】:2013-11-02 15:02:32
【问题描述】:

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

我将一天分成 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 - 我认为代码中存在错误,但似乎无法解决。

【问题讨论】:

    标签: c++ math distribution simulation sample


    【解决方案1】:

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

    正确的方法是使用“thinning”。基本上,找到最大 lambda(t) 并在时间 t1、t2、t3、...处生成伪到达率 lambdamax。对于时间 ti 的每个伪到达,将其视为具有概率 lambda(ti) / lambdamax 的实际到达。结果是车辆到达隧道的时间序列。

    【讨论】:

    • 这正是我要找的!感谢您的论文,它提供了非常丰富的信息-从未想过费率是“可变的”
    • 论文链接失效。它指的是 P. A. W Lewis 和 G. S. Shedler 的“通过变薄模拟非均匀泊松过程”; doi:10.1002/nav.3800260304
    • @StanleyF。非常感谢您指出这一点,我已经更新了答案中的链接。
    【解决方案2】:

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

    【讨论】:

    • 我正在尝试模拟第 i 分钟。因此,我们对泊松分布进行采样,以确定在第 i 分钟的特定样本期间将发生多少事件。然后根据将发生多少事件来计算到达间隔时间。不对吗?
    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多