随机服务系统模拟(三)——M/M/c仿真R实现

M/M/c 排队系统是一种 多重服务器排队模型,其中顾客到达和服务时间均服从指数分布。该模型适用于多个服务窗口并行工作的场景,如银行柜台、呼叫中心、医疗诊所等。系统包含 c 个服务器,可以同时处理多个顾客,服务规则通常为 先到先服务(FCFS)。M/M/c 广泛应用于 银行、医疗、交通、客服中心、供应链管理 等领域,可用于优化人力资源配置、降低客户等待时间,提高系统效率,在经济管理中具有重要价值。

0、M/M/c随机服务系统

M/M/c 排队系统是一种经典的多重服务器(Multi-server)随机服务系统,广泛应用于 银行柜台、呼叫中心、医院门诊、交通管理 等场景。

0.1 系统特征

该系统属于 泊松到达、指数服务时间的排队模型,核心特征包括:

  • 泊松到达(Poisson Process): 顾客的到达间隔时间服从指数分布,平均到达率为 λ
  • 指数服务时间(Exponential Service Time): 每个服务器的服务时间服从指数分布,平均服务率为 μ
  • c 个服务器(c Servers): 系统包含 c 个并行工作的服务器,可同时为多个顾客提供服务;
  • 先到先服务(FCFS): 顾客按照 先来先服务 的原则接受服务;
  • 无限等待空间: 假设系统中可以容纳无限多个等待的顾客;
  • 稳态条件: 系统需满足 ρ = λ / (cμ) < 1,即服务器的总服务能力大于到达速率,否则排队长度会无限增长,系统无法稳定运行。

M/M/c 系统的计算主要涉及 队列长度、等待时间、服务器利用率 等关键指标,以衡量系统的服务效率和客户体验。

0.2 系统绩效指标

Little 公式是排队论中的基本公式,适用于 稳态排队系统

  • L:系统中的平均顾客数;
  • λ:顾客到达率(单位时间内的平均到达人数);
  • W:顾客在系统中的平均逗留时间(包括排队和服务时间)。

在 M/M/c 系统中,常见的 Little 公式指标包括:
(1)系统中顾客平均数(\(L_s\)

\[L_s = \frac{\lambda}{\mu} + L_q \]

表示系统内的总顾客数,包括正在接受服务的顾客和排队等待的顾客。
(2)队列中顾客平均数(Lq

\[L_q = \frac{ \frac{ (\lambda/\mu)^c }{c!(1-\rho) } \cdot \frac{\rho}{(1-\rho)} }{ \sum_{n=0}^{c-1} \frac{(\lambda/\mu)^n}{n!} + \frac{(\lambda/\mu)^c}{c!(1-\rho)} } \]

其中 \(ρ = λ / (cμ)\),表示服务器的平均利用率。\(L_q\)反映了队列中平均等待的顾客数。
(3)系统中顾客的平均等待时间(\(W_s\)

\[W_s = \frac{L_s}{\lambda} \]

表示顾客从进入系统到完成服务所需的平均时间。
(4)队列中的平均等待时间(\(W_q\)

\[W_q = \frac{L_q}{\lambda} \]

表示顾客在队列中等待服务的平均时间。
(5)系统空闲概率(\(P_0\)

\[P_0 = \left[ \sum_{n=0}^{c-1} \frac{(\lambda/\mu)^n}{n!} + \frac{(\lambda/\mu)^c}{c!(1-\rho)} \right]^{-1} \]

表示所有服务器均为空闲的概率。
(6)服务器利用率(\(ρ\)

\[\rho = \frac{\lambda}{c\mu} \]

表示服务器的平均繁忙程度,若 \(ρ < 1\),系统可保持稳定。

通过 M/M/c 系统分析,可以合理规划 服务器数量,优化资源配置,提高服务质量,减少客户等待时间,提高系统的整体效率。

一、M/M/c随机服务系统的模拟

在M/M/c排队系统中,服务台为c个。设系统的到达率为λ,每个用户的服务率为μ。当系统的用户数n>c时,用户离开的速率为cμ,(因为只有c个服务员),当n≤c时,用户离开速率为nμ(因为顾客数小于服务员数)。此时的系统状态(既系统中的用户数)转移图如下图所示。

1.1 系统的理论绩效指标

模型参数符号说明

参数 平均到达率 平均服务率 系统服务强度 系统空闲概率 系统平均顾客数 队列平均人数 平均逗留时间 平均等待时间
符号 \(\lambda\) \(\mu\) \(\frac {\lambda}{c\times\mu}\) \(P_0\) \(L_s\) \(L_q\) \(W_s\) \(W_q\)
R计算程序
Lambda <-9
Mue <-4 
c=3
Rho <- Lambda / Mue
P0inv <- Rho^c /(factorial(c)*(1-(Rho/c)))
for (i in 0:(c-1)) { 
  P0inv = P0inv +(Rho^i)/ factorial(i)
} 
P0 =1/P0inv 
Lq=P0*(Rho^c*Rho/c)/(factorial(c)*(1-(Rho/c))^2)
Wq =Lq/Lambda 
Ls <- Lq+Rho 
Ws <- Ls/Lambda 
R计算结果
参数 平均到达率 平均服务率 系统服务强度 系统空闲概率 系统平均顾客数 队列平均人数 平均逗留时间 平均等待时间
符号 \(\lambda\) \(\mu\) \(\frac {\lambda}{c\times\mu}\) \(P_0\) \(L_s\) \(L_q\) \(W_s\) \(W_q\)
理论值 9 4 0.75 0.0748 3.9533 1.7033 0.4393 0.1893

1.2 系统的R模拟仿真

R模型构建
library(dplyr)
library(simmer)
library(simmer.plot)

T0=10
T1=10000
lambda=9
mu=4
c=3
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("柜台",capacity=c) %>%
    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 <- 0.4393
  
  cat('模拟的平均逗留时间ER=', ER,
      ' 期望值=', ER.true, '\n')
R计算结果
  cat('模拟的平均逗留时间ER=', ER,' 期望值=', ER.true, '\n')
  模拟的平均逗留时间ER= 0.4537      期望值= 0.4393 

1.3 R模拟可视化

mon1=get_mon_arrivals(bank)
head(mon1,6)
 name start_time  end_time activity_time finished replication
1 顾客0  0.2779732 0.2796187   0.001645489     TRUE           1
2 顾客1  0.3053908 0.4021865   0.096795646     TRUE           1
3 顾客2  0.4990293 0.7050497   0.206020379     TRUE           1
4 顾客3  0.5090237 0.7185338   0.209510080     TRUE           1
5 顾客4  0.5315368 1.0015560   0.470019170     TRUE           1
6 顾客5  0.6160291 1.1197153   0.414665596     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')

二、总结

随机服务系统的仿真主要用于评估不同排队系统(如 M/M/1、M/M/c)的性能,以优化资源配置,提高系统效率。通过计算机模拟,能够分析 顾客到达、服务时间、排队情况 等关键变量,进而评估系统在不同负载下的表现。仿真结果通常关注以下指标:

  • 平均等待时间(\(W_q\):衡量顾客在队列中的平均等待时长;
  • 系统平均停留时间(\(W_s\):顾客从进入到离开系统的总时间;
  • 系统平均人数(\(L_s\):队列和服务台中的总顾客数;
  • 服务器利用率(\(ρ\):衡量资源使用效率,确保 \(ρ < 1\) 以维持稳定运行。

随机服务系统仿真应用广泛,例如:

  • 银行与客服中心 通过调整服务器数量优化顾客体验;
  • 交通管理 评估收费站、机场安检的排队效率;
  • 医疗系统 通过优化医生排班降低患者等待时间。

通过仿真,可以量化不同策略的影响,优化资源配置,降低成本,提高系统的整体服务水平,为经济管理决策提供数据支持。

参考文献

1.(Simmer 2019带你飞 )[https://www.sohu.com/a/344940911_100040805]
2.(Simmer仿真平台高级使用技巧)[https://segmentfault.com/a/1190000019820794]

posted @ 2022-04-29 16:45  郝hai  阅读(468)  评论(0)    收藏  举报