SimPy 离散事件仿真
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-02qudk26/simpy。
技能介绍
要解决什么问题
很多系统并不是「每 0.1 秒算一步」的连续动力学,而是事件不规则发生:客户到达、机器故障、数据包入队、员工换班。实体之间还要抢同一批有限资源——服务器槽位、产线工位、链路带宽。用普通脚本写 sleep 循环很难表达「谁先等到资源、等待多久、利用率多少」,也不方便做参数扫描和容量规划。
SimPy 把这类问题抽象成离散事件仿真(DES):仿真时钟只在事件发生时推进,进程用 Python 生成器(yield 事件)描述行为,资源与队列由框架统一管理。
技能如何工作
核心能力包括:用生成器函数建模进程;Resource、PriorityResource、Container、Store 等共享资源;env.timeout、request()、自定义事件以及 AllOf / AnyOf 组合同步;可选与挂钟对齐的实时仿真;配合监控脚本做统计与 CSV 导出。
典型工作流可以概括为四步:
- 定义系统——实体、资源、进程活动、要量的指标(等待时间、利用率、吞吐量)。
- 写进程函数——每种行为一个生成器,在关键点
yield env.timeout(...)或yield resource.request()。 - 挂监控——如
ResourceMonitor/MultiResourceMonitor在运行过程中采样,而不是只在结束时看一眼。 - 跑仿真并分析——固定
random.seed()便于复现,必要时与简单情形的解析解对照。
技能内还提供客户-服务器队列、生产者-消费者、并行任务等模式,以及 basic_simulation_template.py 等模板。
适用边界与注意点
- 适合:队列与等待时间分析、资源竞争、制造/物流/服务流程、网络与容量规划、实施前的行为验证。
- 不适合:固定步长的连续系统(更偏 SciPy ODE);彼此独立、无资源共享的进程;纯数学优化(更偏 SciPy optimize)。
- 常见坑:进程里忘记
yield会「瞬间跑完」;事件只能触发一次;资源要用with resource.request()等形式避免泄漏;进程内避免阻塞式 I/O;时间单位在全模型中保持一致。
使用场景
- 呼叫中心在增配座席前,用仿真估算不同人力下的平均等待时间与队列长度
- 产线工程师模拟某工位停机或换线,评估对整条流水线吞吐与在制品的影响
- 网络或云架构师在调整链路带宽策略前,分析数据包排队与端到端时延分布
- 急诊或门诊流程设计者对比不同分诊与床位配置下的患者等待与逗留时间
适合人员
- 负责产线排产与瓶颈分析的制造/工业工程师,需要可重复运行的 Python 仿真而非静态表格推算
- 电信、CDN 或云网络架构师,要在不动现网的情况下做拥塞与容量 what-if 分析
- 医院运营、精益或质量改进人员,希望量化急诊候诊、服务时长与人力配置的方案差异
- 运筹、工业工程或系统仿真方向的学生与研究员,用生成器进程搭建可验证的队列与资源模型