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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:15:07