如何用R语言模拟双服务台排队系统?
双服务台排队系统模拟的R代码修改方案
你的单服务台排队系统实现逻辑是正确的,针对双服务台(顾客排成一队,分配至最早空闲的服务台;均空闲时随机选择)的需求,核心修改点是跟踪两个服务台的空闲状态,并为每个顾客动态分配服务台。以下是具体的代码修改步骤和完整实现:
核心思路
- 初始化两个服务台的空闲时间(初始均为0,代表服务台一开始就空闲)
- 对每个到达的顾客:
- 筛选出当前空闲的服务台(空闲时间 ≤ 顾客到达时间)
- 若有空闲服务台,随机选择一个;若无,则选择最早空闲的服务台
- 计算该顾客的开始服务时间、完成时间,更新对应服务台的空闲时间
- 调整队列长度、等待时间的计算逻辑,适配双服务台场景
完整代码实现
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
相关产品推荐
相关产品推荐

