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

求助:使用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.")

关键修改说明:

  1. 全局数据容器:定义waiting_times和service_times两个列表,专门存储成功完成服务的顾客的等待时间和服务时间(反悔的顾客可根据需求决定是否纳入统计)
  2. 数据收集逻辑:在顾客成功获得服务的分支里,将waiting_time和systime(服务时间)分别添加到对应列表中
  3. 均值计算:模拟结束后,通过statistics.mean()计算列表的平均值,同时增加空列表判断,避免无数据时的报错
  4. 语法修正:原代码末尾的print语句存在语法错误,修改为正确的格式化输出方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:24:47