Python 实现离散事件仿真_第1页
Python 实现离散事件仿真_第2页
Python 实现离散事件仿真_第3页
Python 实现离散事件仿真_第4页
Python 实现离散事件仿真_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python实现离散事件仿真

(如排队系统、物流调度)

一、离散事件仿真的核心概念

环境(Environment)

管理仿真时间,调度事件。

事件(Event)

在特定时间触发的动作(如客户到达、服务完成)。

资源(Resource)

被实体竞争使用的对象(如服务窗口、卡车)。

进程(Process)

通过生成器函数定义的实体行为逻辑。

二、SimPy基础示例:银行排队系统

场景描述

客户随机到达银行,排队等待服务。

银行有2个服务窗口。

每个客户的服务时间固定为1单位时间。

代码实现

python

importsimpyimportrandom

#定义客户行为defcustomerfenv,name,counter):

arrival_time=env.now

print(f"{name}到达时间:{arrivaltime:.2f}")

#请求资源(服务窗口)

withcounter.requestf)asreq:

yieldreq#等待直到有空闲窗口

starttime=env.now

print(f"{name}开始服务时间:{start_time:.2f}(等待时长:{start_time-

arrival_time:.2f})")

#模拟服务时间(随机0.5F.5单位时间)

service_time=random.uniform(0.5,1.5)

yieldenv.timeout(service_time)

print(f”{name}离开时间:{env.now:.2f}(服务时长:{service_time:.2f})")

#定义客户生成器defcustomer_generator(env,counter):

customerjd=0

whileTrue:

yieldenv.timeout(random.expovariate(1.0))#指数分右到达间隔(平均1单位时间)

customerjd+=1

cess{customer(env/f"-{customerjd}",counter))

#创建仿真环境并运行

env=simpy.Environment()

counter=simpy.Resource(env,capacity=2)#2个服务窗口

cess(customer_generator(env,counter))

env.run(until=10)it仿真运行10单位时间

输出示例

text

客户-1到达时间:0.00

客户-1开始服务时间:0.00(等待时长:0.00)

客户・2到达时间:0.83

客户-2开始服务时间:0.83(等待时长:0.00)

客户-3到达时间:1.03

客户-1离开时间:1.32(服务时长:1.32)

客户-3开始服务时间:1.32(等待时长:0.29)

客户-2离开时间:1.84(服务时长:1.01)

三、扩展案例:物流调度系统

场景描述

货物从仓库通过卡车运输到目的地。

仓库有3辆卡车,每辆卡车装载货物需要2单位时间。

货物到达时间服从泊松过程。

代码实现

python

importsimpyimportrandom

deftransportJob(env,truck,jobjd):

print(f”时间{env.now:.2f}:货物{jobjd)开始装载卡车”)

yieldenv.timeout(2)#装载时间

print(f”时间{env.now:.2f}:货物{job.id)装载完成,出发运输")

yieldenv.timeout(S)#运输时间

print。时间{env.now:.2f}:货物{jobjd)到达目的地")

defwarehouse(env,trucks):

job_id=0

whileTrue:

yieldenv.timeout(random.expovanate(U.b))n平均每2单位时间到达一个货物

job_id+=1

cess(transportjob(env,trucks,job_id))

env=simpy.Environment()

trucks=simpy.Resourcefenv,capacity=3)#3辆卡车

cess(warehouse(env,trucks))

env.run(until=20)

输出示例

text

时间0.00:货物1开始装载卡车

时间2.00:货物1装载完成,出发运输

时间3.14:货物2开始装载卡车

时间5.14:货物2装载完成,出发运输

时间7.00:货物1到达目的地

时间8.14:货物2到达目的地

四、关键功能扩展

1.优先级资源请求

python

#使用PriorityResource实现优先级fromsimpyimportPriorityResource,Priorityitem

defcustomer(env,name,priorit/,counter):

withcounter.request(priority=Priorityltem(priority,env.now))asreq:

yieldreq

#…服务逻辑…

counter=PriorityResource(env,capacity=2)

动态资源调整

python

#在仿真中动态增减资源容量defadjust_capacity(env,counter):

yieldenv.timeout(S)

counter.capacity+=1#5单位时间后增加1个窗口

cess(adjust_capacity(env,counter))

3.数据收集与分析

python

#记录等待时间和服务时间

wait_times=[]

service_times=[]

defcustomer(env,name,counter):

arrival_time=env.now

withcounter.request()asreq:

yieldreq

wait_time=env.now-arrival_time

wait_times.append(wait_time)

#...记录服务时间…

五、调试与优化

调试技巧

使用env.step()单步执行。

打印关键事件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论