随机服务系统模拟(二)—M/M/1仿真R实现
M/M/1模型是一种出生-死亡过程,此随机过程中的每一个状态代表模型中人数的数目。因为模型的队列长度无限且参与人数亦无限,故此状态数目亦为无限。例如状态0表示模型闲置、状态1表示模型有一人在接受服务、状态2表示模型有二人(一人正接受服务、一人在等候),如此类推。 此模型中,出生率(即加入队列的速率)λ在各状态中均相同,死亡率(即完成服务离开队列的速率)μ亦在各状态中相同(除了状态0,因其不可能有人离开队列)。故此,在任何状态下,只有两种事情可能发生:有人加入队列。如果模型在状态k,它会以速率λ进入状态k + 1有人离开队列。如果模型在状态k(k不等于0),它会以速率μ进入状态k − 1,由此可见,模型的隐定条件为λ < μ。如果死亡率小于出生率,则队列中的平均人数为无限大,此这种系统没有平衡点。
0、M/M/1 排队系统
M/M/1 排队系统是最基本的排队模型,广泛应用于 单窗口服务 的场景,如 单个收银台、ATM 机、单个客服座席 等。
0.1 系统特征
- 泊松到达(Poisson Process): 顾客到达系统的时间间隔服从指数分布,平均到达率为 λ;
- 指数服务时间(Exponential Service Time): 服务时间服从指数分布,平均服务率为 μ;
- 单服务器(Single Server): 系统只有 一个 服务台;
- 先到先服务(FCFS): 采用 先到先服务 规则;
- 无限等待空间(Infinite Queue Capacity): 假设系统可以容纳无限多个等待的顾客;
- 稳态条件(λ < μ): 服务器的处理能力必须大于顾客到达速率,否则队列会无限增长,系统进入拥堵状态。
由于 M/M/1 系统结构简单、计算直观,常作为 排队论分析的基础模型,用于研究单服务器排队系统的特性。
0.2 系统绩效指标
在 M/M/1 系统中,使用 Little 公式 计算系统的关键指标:
(1)系统中顾客平均数(\(L_s\))
表示系统内的 总顾客数,包括正在接受服务的顾客和等待的顾客。
(2)队列中顾客平均数(\(L_q\))
表示 排队等待 的顾客平均数量。
(3)系统中顾客的平均等待时间(\(W_s\))
表示顾客从进入系统到完成服务的 平均停留时间。
(4)队列中的平均等待时间(\(W_q\))
表示顾客 在队列中等待服务的平均时间。
(5)系统空闲概率(\(P_0\))
表示 服务器空闲 的概率。
(6)服务器利用率(ρ)
表示服务器的 平均繁忙程度,若 \(ρ < 1\),系统处于稳定状态,否则排队人数趋向无穷。
通过 M/M/1 模型,可以分析 单服务器系统的服务能力,优化顾客等待时间,合理调整服务器资源,以提高整体效率。
一、M/M/1随机服务系统的模拟
M/M/1服务系统:(1)队列长度没有限制;(2)顾客到达的时间间隔和服务时间均服从指数分布;(3)服务台数量为1。
1.1 系统的理论绩效指标
模型参数符号说明
参数 | 平均到达率 | 平均服务率 | 系统服务强度 | 系统空闲概率 | 系统平均顾客数 | 队列平均人数 | 平均逗留时间 | 平均等待时间 |
---|---|---|---|---|---|---|---|---|
符号 | \(\lambda\) | \(\mu\) | \(\rho\) | \(P_0\) | \(L_s\) | \(L_q\) | \(W_s\) | \(W_q\) |
R计算程序
Lambda <- 1
Mue <-2
Rho <-Lambda/Mue
p0=1-Rho
Lq= Rho ^ 2/(1-Rho)
Wq = Lq / Lambda
Ls <- Lq + Rho
Ws <- Ls / Lambda
R计算结果
参数 | 平均到达率 | 平均服务率 | 系统服务强度 | 系统空闲概率 | 系统平均顾客数 | 队列平均人数 | 平均逗留时间 | 平均等待时间 |
---|---|---|---|---|---|---|---|---|
符号 | \(\lambda\) | \(\mu\) | \(\rho\) | \(P_0\) | \(L_s\) | \(L_q\) | \(W_s\) | \(W_q\) |
理论值 | 1 | 2 | 0.5 | 0.5 | 1 | 0.5 | 1 | 0.5 |
1.2 系统的R模拟仿真
R模型构建
library(dplyr)
library(simmer)
T0=10
T1=10000
lambda=1.0
mu=2.0
set.seed(1234)
## 建立模拟环境
bank <- simmer("bank")
## 用trajectory()建立顾客,并指定顾客的一系列活动
## seize()获取柜台服务资源,如果正在忙,就进入排队
## 服务时间用timeout指定,为了生成多个随机服务时间,
## timeout的参数是返回随机服务时间的而函数而不是时间值本身
customer <-
trajectory("顾客") %>%
seize("柜台") %>%
timeout( function() rexp(1, mu)) %>%
release("柜台")
## 用add_resource生成柜台资源
## 用add_generator()生成顾客到来列
bank %>%
add_resource("柜台") %>%
add_generator("顾客", customer, function() {rexp(1, lambda)} )
## 用run()执行模拟到指定结束时刻
bank %>%
run(until=T1)
R计算程序
## 用get_mon_arrivals()获取各个顾客到来的时间、离开时间、活动时间等,结果是数据框
## 用dplyr::mutate()对数据框增加新变量
resd <- bank %>%
get_mon_arrivals() %>%
dplyr::mutate(waiting_time = end_time - start_time - activity_time,
stay_time = end_time - start_time)
stay_times <- resd %>%
dplyr::filter(start_time >= T0, end_time < T1) %>%
dplyr::select(stay_time)
ER <- mean(stay_times[[1]])
ER.true <- 1/(mu-lambda)
cat('模拟的平均逗留时间Ws=', ER,
' 期望值=', ER.true, '\n')
R计算结果
cat('估计的平均逗留时间Ws=', ER,' 期望值=', ER.true, '\n')
模拟的平均逗留时间Ws=0.9900721 期望值= 1
3. R模拟可视化
mon1=get_mon_arrivals(bank)
head(mon1,6)
name start_time end_time activity_time finished replication
1 顾客0 2.501759 2.505050 0.003290978 TRUE 1
2 顾客1 2.748517 2.942109 0.193591292 TRUE 1
3 顾客2 4.491264 4.903304 0.412040757 TRUE 1
4 顾客3 4.581213 5.283519 0.380215150 TRUE 1
5 顾客4 4.783831 6.223558 0.940038339 TRUE 1
6 顾客5 5.621871 7.052889 0.829331192 TRUE 1
mon = get_mon_resources(bank)
aggregate(cbind(server, queue) ~ resource, mon, mean)
library(ggplot2)
ggplot(mon, aes(x=server, fill=resource)) +
geom_histogram(binwidth = 0.5) +
facet_grid(.~resource, scales = 'free')
二、模拟仿真总结
随机服务系统在我们日常生活、工业生产、科学技术、军事领域中是经常遇到的随机模型,例如研究银行、理发店、商店、海关通道、高速路收费口等服务人员个数的设置和排队规则,研究计算机网络网关、移动网络的调度规则,等等。某些随机服务系统可以进行严格理论分析得到各种问题的理论解, 但是随机服务系统中存在大量随机因素,使得理论分析变得很困难以至于不可能。例如,即使是上面的银行服务问题可能的变化因素就包括:顾客到来用齐次泊松过程还是非齐次泊松过程,柜员有多少个,是否不同时间段柜员个数有变化,柜员服务时间服从什么样的分布,顾客排队按照什么规则,是否VIP顾客提前服务,顾客等候过长时会不会放弃排队,等等。 包含了这么多复杂因素的随机服务系统的理论分析会变得异常复杂,完全靠理论分析无法解决问题,可用随机模拟方法给出答案。
参考文献
1.(Simmer 2019带你飞 )[https://www.sohu.com/a/344940911_100040805]
2.(Simmer仿真平台高级使用技巧)[https://segmentfault.com/a/1190000019820794]