如何使用Python的SimPy库搭建车库车辆运维闭环仿真系统
基于SimPy的车库车辆闭环仿真实现方案
核心实现思路
我们基于SimPy离散事件仿真的特性,围绕车辆的完整生命周期建模,核心实现三个模块:
- 车辆独立进程的循环逻辑,支持同一车辆反复执行「可用→故障→维修→归位」的全流程
- 维修资源(工位)的约束模拟,适配多车同时故障时的排队场景
- 全流程状态埋点,自动统计车辆不可用状态的全量相关数据
完整可运行代码
import simpy import random from collections import defaultdict # -------------------------- 仿真参数配置 -------------------------- NUM_VEHICLES = 10 # 车库总车辆数 NUM_REPAIR_BAYS = 2 # 维修工位数量 SIM_DURATION = 30*24 # 仿真总时长:单位小时,此处模拟30天 # 随机分布参数,可根据真实业务数据调整 MEAN_OPERATION_HOURS = 7*24 # 车辆平均无故障运行时长,默认7天 MEAN_REPAIR_HOURS = 24 # 平均单次维修时长,默认1天 # 全局统计存储结构 vehicle_stats = defaultdict(lambda: { "fault_count": 0, # 累计故障次数 "total_unavailable_hours": 0, # 累计不可用总时长 "fault_records": [] # 每次故障的明细:(故障开始时间, 维修完成时间) }) # -------------------------- 车辆生命周期进程 -------------------------- def vehicle_process(env, vehicle_id, repair_bays, stats): while True: # 1. 车辆正常投入使用阶段 operation_hours = random.expovariate(1 / MEAN_OPERATION_HOURS) yield env.timeout(operation_hours) # 2. 车辆触发故障,进入不可用状态 fault_start_time = env.now stats[vehicle_id]["fault_count"] += 1 stats[vehicle_id]["fault_records"].append([fault_start_time, None]) # 3. 申请维修资源,排队等待维修 with repair_bays.request() as req: yield req # 拿到工位后开始维修 repair_hours = random.expovariate(1 / MEAN_REPAIR_HOURS) yield env.timeout(repair_hours) # 4. 维修完成,恢复可用状态,更新统计数据 fault_end_time = env.now unavailable_duration = fault_end_time - fault_start_time stats[vehicle_id]["total_unavailable_hours"] += unavailable_duration stats[vehicle_id]["fault_records"][-1][1] = fault_end_time # -------------------------- 仿真启动逻辑 -------------------------- if __name__ == "__main__": # 初始化仿真环境和维修资源 env = simpy.Environment() repair_bays = simpy.Resource(env, capacity=NUM_REPAIR_BAYS) # 启动所有车辆的独立进程 for vehicle_id in range(NUM_VEHICLES): env.process(vehicle_process(env, vehicle_id, repair_bays, vehicle_stats)) # 运行仿真到指定时长 env.run(until=SIM_DURATION) # -------------------------- 统计结果输出示例 -------------------------- print("===== 车库仿真30天统计结果 =====") total_avg_available_rate = 0 for vid, stat in vehicle_stats.items(): available_rate = 1 - stat["total_unavailable_hours"] / SIM_DURATION total_avg_available_rate += available_rate print(f"车辆{vid:2d} | 故障次数:{stat['fault_count']:2d}次 | 累计不可用时长:{round(stat['total_unavailable_hours'],1):>5}小时 | 可用率:{round(available_rate*100,2)}%") print(f"\n全局车辆平均可用率:{round(total_avg_available_rate/NUM_VEHICLES*100,2)}%")
关键逻辑说明
- 车辆循环逻辑:每个车辆对应一个独立的SimPy进程,用
while True包裹全流程,天然支持同一车辆反复进出维修状态,不需要额外创建新实体 - 不可用状态统计:在故障触发、维修完成两个节点分别埋点记录时间戳,可直接计算单次不可用时长、累计不可用时长、故障次数等指标,如果需要拆分「排队等待维修」和「实际维修中」两个子状态,可在申请资源前再加一个时间戳拆分统计即可
- 资源适配:用
simPy.Resource模拟维修工位,自动处理多车同时故障时的排队逻辑,和真实业务场景完全对齐
可扩展优化点
- 随机分布替换:可将代码中的指数分布替换为和真实业务匹配的分布,比如维修时长用正态分布、无故障运行时长用韦伯分布等
- 新增调度逻辑:如果需要模拟车库调度规则(比如优先调用使用时长更短的车辆),可额外新增一个车库可用车辆池,调度时从池中筛选符合条件的车辆即可
- 新增异常逻辑:可加入维修缺件、临时增加维修工位等特殊场景的事件触发逻辑
内容的提问来源于stack exchange,提问作者Giorgio Cabrera
相关产品推荐
相关产品推荐

