使用SimPy进行离散事件模拟的基础知识

SimPy是一个用Python编写的强大的基于流程的离散事件模拟框架。

null

安装: 要安装SimPy,请使用以下命令-

pip install simpy

基本概念:

SimPy背后的核心思想是Python中的生成器函数。普通函数和生成器的区别在于,普通函数使用“return”语句,而生成器使用“yield”语句。

如果函数有一个return语句,那么即使在多个函数调用中,它也会返回相同的值。例如——

def func():
return 1
return 2


在运行时调用func()时,它总是在return语句的第一个实例返回,也就是说,函数func()总是返回1,而下一个return语句永远不会执行。

然而,在离散事件模拟中,我们可能需要在给定的时间T找到系统的状态。为此,需要记住T之前的间隔状态,然后执行给定的模拟并在时间T返回状态。

这就是生成器函数非常有用的地方。例如,考虑以下功能

def func():
while True :
yield 1
yield 2


现在,当第一次调用这个函数时,它“产生”1。然而,在下一次调用中,它将产生2。从某种意义上讲,它会记住上次调用时返回的内容,并继续下一个收益率语句。

SimPy中的事件称为 过程 ,它们由各自的生成器函数定义。这些过程发生在 环境 (把环境想象成一个大盒子,里面保存着进程。)

考虑一个简单的例子,涉及交通灯的模拟——

# Python 3 code to demonstrate basics of SimPy package
# Simulation of a Traffic Light
# import the SimPy package
import simpy
# Generator function that defines the working of the traffic light
# "timeout()" function makes next yield statement wait for a
# given time passed as the argument
def Traffic_Light(env):
while True :
print ( "Light turns GRN at " + str (env.now))
# Light is green for 25 seconds
yield env.timeout( 25 )
print ( "Light turns YEL at " + str (env.now))
# Light is yellow for 5 seconds
yield env.timeout( 5 )
print ( "Light turns RED at " + str (env.now))
# Light is red for 60 seconds
yield env.timeout( 60 )
# env is the environment variable
env = simpy.Environment()
# The process defined by the function Traffic_Light(env)
# is added to the environment
env.process(Traffic_Light(env))
# The process is run for the first 180 seconds (180 is not included)
env.run(until = 180 )


输出:

Light turns GRN at 0
Light turns YEL at 25
Light turns RED at 30
Light turns GRN at 90
Light turns YEL at 115
Light turns RED at 120

在这段代码中,生成器函数Traffic_Light(env)将环境变量作为参数,并在env中作为参数传递的时间段内模拟红绿灯的操作。run()函数。(实际上,SimPy中的时间是无单位的。尽管它可以根据需要转换为小时、分钟或秒)。环境。现在返回经过的时间的当前值。

环境。timeout()函数是此模拟的基础,因为它等待作为参数传递的时间在计算机的模拟时钟上经过(它不是实时时钟),然后启动下一个yield语句,直到在env中作为参数传递的时间。run()已完成。

环境。run()同时启动链接到环境的所有进程=0。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享