统计计算第二次作业(排队论)
2016-09-24 本文已影响55人
hopless
代码部分
arrive<-rexp(2000,0.5) #生成服从指数分布的随机变量,表示客人到达的间隔时间
arritime<-cumsum(arrive) #通过累加,获得客人到达的时间点
stat1<-rexp(2000,0.25) #生成服务台1的服务时间间隔
stat2<-rexp(2000,0.25) #生成服务台2的服务时间间隔
get_ser<-c() #记录每个客户开始服务时间
end_ser<-c() #记录每个客户结束服务时间
i=1;j=1
A_opentime <-0 # A_opeantime表示服务台1允许开始服务时间,也就是上一位客人结束服务的时间
B_opentime<-0.001 # B_opeantime表示服务台2允许开始服务时间,也就是上一位客人结束服务的时间
for(k in 1:2000){
temp <-arritime[k]
if(A_opentime < B_opentime){ #如果服务台1比服务台2提前结束上一轮服务,则第k个客户的服务由服务台1进行(为服务台1服务的第i个人)
if(temp > A_opentime) #比较客户到达时间与服务台1开始服务时间,若第k个客户尚未到达,服务台1空闲,更新
A_opentime<-temp # 服务台1的开始服务时间为第k个客户到达时间
get_ser[k]=A_opentime #讲第k个客户的开始服务时间 =服务台1的opentime
end_ser[k]=get_ser[k]+stat1[i] #讲第k个客户的结束服务时间点 =开始服务时间 +服务台1本次花费时间(从stat1中的第i个)
A_opentime=end_ser[k] #更新服务台1的下一次开放时间为第k个客户结束服务时间
i=i+1 #更新i到i+1,方便提取服务台1为服务下一个客户花费时间的数据
}
else {
if(temp >B_opentime)
B_opentime<-temp
get_ser[k]=B_opentime
end_ser[k]=get_ser[k]+stat2[j]
B_opentime=end_ser[k]
j=j+1
}
}
#将所有客户的到达时间,接受服务时间 ,结束服务时间合并起来
A=data.frame(arritime=arritime,get_ser=get_ser,end_ser =end_ser)
waiting=A[,2]-A[,1] #计算每个人的等待时间
summary(waiting)
#计算平均队伍长度
line=c(0)
for(i in 2:2000){
temp2=arritime[i]
line<-c(line,i-table(get_ser< temp2)[2])
}
summary(line)
模拟结果
当服务间隔时间的期望是3,到达时间间隔的期望是1
#等待时间
> summary(waiting)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0 264.2 498.3 486.4 725.0 957.1
> #计算平均队伍长度
> summary(line)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 53.75 110.00 131.50 214.20 299.00
当服务间隔时间的期望是3,到达时间间隔的期望是2
#等待时间
> summary(waiting)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 0.000 1.493 4.468 6.412 32.010
> #计算平均队伍长度
> summary(line)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 1.000 2.000 4.094 6.000 19.000
当服务间隔时间的期望是3,到达时间间隔的期望是3
#等待时间
> summary(waiting)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0000 0.0000 0.0000 1.1400 0.9547 15.2100
> #计算平均队伍长度
> summary(line)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 1.000 1.000 1.325 1.000 10.000