SimPy是一个用Python编写的强大的基于流程的离散事件模拟框架。
安装: 要安装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。