求助:使用SimPy计算M/M/1排队系统的平均性能指标
解决SimPy M/M/1排队系统的平均等待/服务时间计算问题
你的核心问题是没有将顾客的等待时间、服务时间统一收集到全局可访问的容器中,原代码里的waiting_time是customer函数的局部变量,外部无法调用,自然无法计算均值。以下是修改后的完整代码,附带关键说明:
import random import simpy import numpy from random import randint, seed, expovariate import statistics # 全局列表,用于存储成功获得服务的顾客的等待时间和服务时间 waiting_times = [] service_times = [] random_seed = 42 # 随机种子 new_customers = 20 # 总顾客数 interarrival = numpy.random.poisson(randint(0,20), size=None) # 平均到达间隔(泊松生成) min_priority = 1 max_priority = 10 def generator(env, number, interval, server): """生成顾客的发生器""" for i in range(number): c = customer(env, f'Customer{i:02d}', server, system_time=15) env.process(c) # 生成指数分布的到达间隔时间 t = expovariate(1.0 / interval) yield env.timeout(t) def customer(env, name, server, system_time): arrive = env.now print(f'Arrival time of Customer {name} is: {arrive:7.4f}') with server.request() as req: priority = random.uniform(min_priority, max_priority) results = yield req | env.timeout(priority) waiting_time = env.now - arrive if req in results: # 顾客成功获得服务,记录等待时间 waiting_times.append(waiting_time) print(f'{name} waited {waiting_time:6.3f} seconds in the queue') # 生成指数分布的服务时间,记录服务时间 systime = expovariate(1.0 / system_time) service_times.append(systime) yield env.timeout(systime) print(f'{env.now:7.4f} {name}: Finished') print(f'Customer {name} spent {systime:7.4f} time in the server') print(f'{name} waited {waiting_time:6.3f} seconds') else: # 顾客反悔离开,不记录时间(可根据需求调整) print(f'{env.now:7.4f} {name}: Reneging Time {waiting_time:6.3f}') # 初始化模拟环境 random.seed(random_seed) seed(29384) env = simpy.Environment() server = simpy.Resource(env, capacity=1) # M/M/1的单服务台 env.process(generator(env, new_customers, interarrival, server)) env.run() # 计算并输出平均值 if waiting_times: avg_wait = statistics.mean(waiting_times) print(f"\nAverage waiting time for served customers: {avg_wait:.4f} seconds") else: print("\nNo customers were served.") if service_times: avg_service = statistics.mean(service_times) print(f"Average service time: {avg_service:.4f} seconds") else: print("No service time data available.")
关键修改说明:
- 全局数据容器:定义
waiting_times和service_times两个列表,专门存储成功完成服务的顾客的等待时间和服务时间(反悔的顾客可根据需求决定是否纳入统计) - 数据收集逻辑:在顾客成功获得服务的分支里,将
waiting_time和systime(服务时间)分别添加到对应列表中 - 均值计算:模拟结束后,通过
statistics.mean()计算列表的平均值,同时增加空列表判断,避免无数据时的报错 - 语法修正:原代码末尾的
print语句存在语法错误,修改为正确的格式化输出方式
内容的提问来源于stack exchange,提问作者dozgunay
相关产品推荐
相关产品推荐

