在为总线创建模拟时我有点困惑。
问题是公共汽车从一个车站到另一个车站一段时间。一旦从第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;
}
我问,因为这是离散事件模拟,我不能每次都看到我的模型,所以对于每个站我存储最后的出发时间。我还认为一个好的质量措施将是平均等待时间(乘客等候时间的总和,直到他们登上下一班车)
答案 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
登上当前公交车的人数,您需要定义两件事:
Station 2
的人数平均值; 现在的意思是:
mean = p*d
您现在将计算getPoissonRandom(mean)
,这将为您提供上车的人数。
请注意,该功能不具有确定性;这个想法是它给出了一个跟随Poisson分布给出的概率分布的数字。
示例强>
例如,假设p=5
(平均每小时5人),公共汽车之间的时间为d=0.5
(半小时)。您可以使用getPoissonRandom(2.5)
运行模拟。