1. 设某商店只有一个售货员,假定该店上午 9 点开门,下午 5 点关门(要求把 5
点前进店现还在排队等待的顾客服务完毕才关店),请模拟这种单服务员排队系
统;并估计出顾客平均等待时间、平均服务时间、排队中的顾客平均数(假设顾
客到店的时间间隔和服务时间均为指数分布,其参数可以变化)。
#------------时间模拟法------------
demo.mm1 <- function(T0=0, T1=10000, lambda=1, mu=1.2){
## 初始化
t <- 0
B <- 0
L <- 0
i <- 0
j <- 0
n <- 0
# 时钟
# 柜员忙标志,0 表示柜员处于空闲状态,1 表示柜员处于忙碌状
态
# 排队等候人数
# 当前到达顾客号
# 正在接受服务顾客号
# 已结束服务顾客数
a <- numeric(0) # 顾客到来时间的集合
s <- numeric(0) # 顾客开始服务时间的集合
e <- numeric(0) # 顾客结束服务时间的集合
l <- numeric(0) # 排队顾客数量的集合
X <- rexp(1, lambda); A <- X # 下一顾客到来时间
E <- NA
# 正在服务的顾客结束时刻
## 时钟反复跳到下一事件发生的时间,并处理事件,更新待发生事件集合
repeat{
if(B==0 || (B==1 && A T1) break
if(t == A){ # 待处理到达事件
L <- L+1; l <- c(l,L)
i <- i+1; a <- c(a, t)
X <- rexp(1, lambda); A <- t + X
if(B==0){
B <- 1
L <- L-1; l <- c(l,L)
j <- j+1; s <- c(s, t)
Y <- rexp(1, mu); E <- t + Y
} # if !B
} else { # 待处理结束服务事件
B <- 0
n <- n+1; e <- c(e, t)
if(L > 0){
L <- L-1; l <- c(l,L)
B <- 1
j <- j+1; s <- c(s, t)
Y <- rexp(1, mu); E <- t + Y
}
} # end of 待处理结束服务事件
} # end of repeat
## 把 T1 时刻前进店现还在排队等待的顾客服务完毕
if(length(s)>length(e)){
n <- n+1;e <- c(e, t)
}
while(L>0){
L <- L-1; l <- c(l,L)
j <- j+1;s <- c(s, t)
Y <- rexp(1, mu); t <- t + Y
n <- n+1;e <- c(e, t)
}
B <- 0 # 服务完成,将柜员状态调至空闲
## 计算顾客平均等待时间、平均服务时间、排队中的顾客平均数
I <- a >= T0 & a <= T1
EW <- mean(s[I] - a[I])
## 顾客平均等待时间
EF <- mean(e[I] - s[I])
## 顾客平均服务时间
EL <- mean(l)
## 排队中的顾客平均数
cat(' 平均等待时间 EW=', EW,'\n',
' 平均服务时间 EF=', EF,'\n',
' 排队中的顾客平均数 EL=', EL, '\n')
}
## 测试运行
set.seed(1)
demo.mm1(T1=480, lambda=2, mu=2.4)