You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R语言模拟双服务台排队系统?

双服务台排队系统模拟的R代码修改方案

你的单服务台排队系统实现逻辑是正确的,针对双服务台(顾客排成一队,分配至最早空闲的服务台;均空闲时随机选择)的需求,核心修改点是跟踪两个服务台的空闲状态,并为每个顾客动态分配服务台。以下是具体的代码修改步骤和完整实现:

核心思路

  1. 初始化两个服务台的空闲时间(初始均为0,代表服务台一开始就空闲)
  2. 对每个到达的顾客:
    • 筛选出当前空闲的服务台(空闲时间 ≤ 顾客到达时间)
    • 若有空闲服务台,随机选择一个;若无,则选择最早空闲的服务台
    • 计算该顾客的开始服务时间、完成时间,更新对应服务台的空闲时间
  3. 调整队列长度、等待时间的计算逻辑,适配双服务台场景

完整代码实现

1. 初始化参数与数据

library(ggplot2)

# 参数设置
lambda1 <- 5  # 顾客到达间隔的泊松参数(指数分布均值)
lambda2 <- 7  # 服务时间的泊松参数(指数分布均值)
time_period <- 1000  # 模拟的顾客总数

# 生成到达时间与服务时间
arrival_times <- cumsum(rexp(time_period, rate = 1/lambda1))
service_times <- rexp(time_period, rate = 1/lambda2)

# 初始化跟踪变量
start_service_times <- numeric(time_period)  # 每个顾客的开始服务时间
completion_times <- numeric(time_period)     # 每个顾客的完成时间
total_wait_time <- numeric(time_period)      # 每个顾客的总等待时间(到达→完成)
queue_length <- numeric(time_period)         # 每个顾客到达时的队列长度
desk_free_time <- c(0, 0)                    # 两个服务台的当前空闲时间

2. 双服务台模拟循环

# 模拟主循环
for (i in 1:time_period) {
  current_arrival <- arrival_times[i]
  
  # 筛选空闲服务台(空闲时间 ≤ 当前顾客到达时间)
  free_desks <- which(desk_free_time <= current_arrival)
  
  if (length(free_desks) > 0) {
    # 有空闲服务台,随机选择一个
    selected_desk <- sample(free_desks, 1)
    start_time <- current_arrival
  } else {
    # 无空闲服务台,选择最早空闲的服务台
    selected_desk <- which.min(desk_free_time)
    start_time <- desk_free_time[selected_desk]
  }
  
  # 计算完成时间与等待时间
  completion_time <- start_time + service_times[i]
  wait_time <- completion_time - current_arrival
  
  # 更新跟踪变量
  start_service_times[i] <- start_time
  completion_times[i] <- completion_time
  total_wait_time[i] <- wait_time
  desk_free_time[selected_desk] <- completion_time
  
  # 计算当前顾客到达时的队列长度:已到达但未开始服务的顾客数
  arrived_customers <- sum(arrival_times <= current_arrival)
  started_customers <- sum(start_service_times[1:i] <= current_arrival)
  queue_length[i] <- max(0, arrived_customers - started_customers)
}

# 整理为数据框
df <- data.frame(
  Customer_ID = 1:time_period,
  Arrival_Time = arrival_times,
  Completed_Orders = 1:time_period,
  Queue_Length = queue_length,
  Total_Wait_Time = total_wait_time
)

3. 可视化绘图

ggplot(df, aes(x = Arrival_Time)) +
  geom_line(aes(y = Completed_Orders, color = "Completed Orders")) +
  geom_line(aes(y = Queue_Length, color = "Queue Length")) +
  geom_line(aes(y = Total_Wait_Time, color = "Total Wait Time")) +
  scale_y_continuous(
    sec.axis = sec_axis(~., name = "Total Wait Time"),
    name = "Completed Orders / Queue Length"
  ) +
  scale_color_manual(
    values = c(
      "Completed Orders" = "blue",
      "Queue Length" = "red",
      "Total Wait Time" = "green"
    )
  ) +
  labs(
    x = "Time (Minutes)",
    title = "Dual-Server Queue System Simulation",
    color = "Metric"
  ) +
  theme_minimal()

关键代码解释

  • 服务台分配逻辑:通过which(desk_free_time <= current_arrival)筛选空闲服务台,存在空闲时用sample随机选择;无空闲时用which.min找到最早空闲的服务台,确保顾客总是被分配到最优服务台。
  • 队列长度计算:通过统计「已到达顾客数」与「已开始服务顾客数」的差值,得到当前等待队列的长度,更贴合双服务台场景的实际情况。
  • 状态更新:每次分配服务台后,立即更新该服务台的空闲时间为当前顾客的完成时间,保证后续顾客能获取准确的服务台状态。

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 03:05:57