生成到达人数和平均等待时间

时间:2017-11-09 18:10:45

标签: java

在为总线创建模拟时我有点困惑。

问题是公共汽车从一个车站到另一个车站一段时间。一旦从第1站到第2站,它将在第2站装载一些乘客。

我的问题是,因为我想在车站2闲置的时候在车站2产生一些乘客(最后一辆公共汽车离开直到新巴士到达)我正在考虑使用带有lambda的泊松过程来确定到达时间和时间周期。

从另一篇StackOverflow文章中我发现了一个函数来计算PoissonArrivals给出的平均值,但是如何在其中引入时间约束?

public static int getPoissonRandom(double mean) {
        Random r = new Random();
        double L = Math.exp(-mean);
        int k = 0;
        double p = 1.0;
        do {
            p = p * r.nextDouble();
            k++;
        } while (p > L);
        return k - 1;
    }

我问,因为这是离散事件模拟,我不能每次都看到我的模型,所以对于每个站我存储最后的出发时间。我还认为一个好的质量措施将是平均等待时间(乘客等候时间的总和,直到他们登上下一班车)

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题:

import org.apache.commons.math3.distribution.UniformRealDistribution;
import org.apache.commons.math3.distribution.PoissonDistribution;
public class PassengerArrivals {

    private double T, lambda; // Time interval
    private double waiting;

    public PassengerArrivals(double lambda, double timeInterval) {
        // TODO Auto-generated constructor stub
        this.lambda = lambda;
        this.T = timeInterval;
        this.avg_waiting = 0;


        // Generate the number of events that will occur
        PoissonDistribution pd = new PoissonDistribution(this.lambda);
        int n = pd.sample();

        // Initialize an array to store the arrival times t_i, i = {1,2,..., n}.
        double arrivals[] = new double[n];

        // Generate the arrival times through a U[0,T]
        UniformRealDistribution ud = new UniformRealDistribution(0, this.T);
        for (int i = 0; i < n; ++i) {
            arrivals[i] = ud.sample();
        }

        //The Waiting times between events will be independent and identically distributed exponentialy.
        double sum_waiting_time = 0;
        for (int i = 0; i < n; ++i) {
            // For me, the waiting time is the time the arrival of passenger occurred and he will wait until the time interval will be done.
            sum_waiting_time += timeInterval - arrivals[i];
        }

        // Sometimes I got a NaN, possibly because my lambda was small so no events were generated. So it doesn't hurt to check :P
        if (Double.isNaN(waiting_time)) {
            sum_waiting_time = 0;
        }

        this.avg_waiting = sum_waiting_time / n;
    }

    /**
     * 
     * @return
     */
    public double getAvgWaitingTime() {
        return this.waiting;
    }

答案 1 :(得分:0)

要模拟在Station 2登上当前公交车的人数,您需要定义两件事:

  • p =每小时到达Station 2的人数平均值;
  • d =两辆公共汽车经过的时间(以小时为单位),即从最后一班公共汽车离开直至现有公共汽车离开的时间。

现在的意思是:

mean = p*d

您现在将计算getPoissonRandom(mean),这将为您提供上车的人数。

请注意,该功能不具有确定性;这个想法是它给出了一个跟随Poisson分布给出的概率分布的数字。

示例

例如,假设p=5(平均每小时5人),公共汽车之间的时间为d=0.5(半小时)。您可以使用getPoissonRandom(2.5)运行模拟。