我想在Java中创建一个函数,根据平均到达率(lambda)和平均服务率(mu)生成Poisson到达.
在我的例子中,我有:2,2个请求/天,换句话说2,2个到达/天,平均服务时间为108个小时.考虑到我的程序在t = 0分钟开始,我想创建一个返回到达[]的函数,它将包含t1,t2和一个可能的t3.T1,t2和t3是这些到达发生的白天的瞬间(以分钟为单位).我有以下限制:
t1 < t2 < t3 < 1440 minutes (24 hours*60 minutes/hour)
t2-t1 > 108 minutes
t3-t2 > 108 minutes
t3+ 108 minutes < 1440 minutes
有人可以帮帮我吗?
谢谢,
安娜
您可以使用D. Knuth提出的算法:
private 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;
}
Run Code Online (Sandbox Code Playgroud)
要理解这是如何工作的,请注意在k次迭代之后循环条件变为
p 1*p 2*...*p k > L.
这相当于
-ln(p 1)/ mean -ln(p 2)/ mean ... -ln(p k)/ mean> 1
注意,如果p均匀分布,则-ln(p)/ mean具有给定均值的指数分布.当事件之间的间隔长度是具有指数分布的独立随机变量时,具有泊松分布的随机变量等于给定事件在固定间隔内发生的次数.由于我们使用泊松分布的均值作为事件之间间隔的指数分布的均值,因此我们计算出现次数的固定内部是单位长度.因此,循环条件总结了事件之间间隔的长度,并检查我们是否超出了单位间隔.如果我们在计算第k个事件时已超出单位间隔,则在该区间内发生k-1个事件,因此我们返回k-1.
下面是一些生成具有给定均值的泊松数的简化代码:
private static int poisson(double mean) {
int r = 0;
double a = random.nextDouble();
double p = Math.exp(-mean);
while (a > p) {
r++;
a = a - p;
p = p * mean / r;
}
return r;
}
Run Code Online (Sandbox Code Playgroud)
您应该能够使用它或类似的东西来生成每个时间段的到达人数:输入应该是您期望在该时间段内到达的平均人数。
请注意,如果您的平均值非常大(例如 500+),您将需要使用正态分布来近似到达人数。这更有效,而且它避免了上面代码中固有的数字溢出问题(在某些时候 Math.exp(-mean) 会四舍五入到零......哎呀!)
| 归档时间: |
|
| 查看次数: |
13783 次 |
| 最近记录: |