SimPy es un poderoso marco de simulación de eventos discretos basado en procesos escrito en Python.
Instalación:
para instalar SimPy, use el siguiente comando:
pip install simpy
Conceptos básicos :
La idea central detrás de SimPy es la función generadora en Python. La diferencia entre una función normal y un generador es que una función normal usa la declaración de «retorno», mientras que un generador usa la declaración de «rendimiento».
Si la función tiene una declaración de devolución, incluso en varias llamadas de función, devuelve el mismo valor. Por ejemplo –
def func(): return 1 return 2
Cuando se llama a func() durante el tiempo de ejecución, siempre regresará en la primera instancia de la declaración de retorno, es decir, la función func() siempre devuelve 1, y la próxima declaración de retorno nunca se ejecuta.
Sin embargo, en la simulación de eventos discretos, es posible que necesitemos encontrar el estado del sistema en un momento dado T. Para eso, se requiere recordar el estado del intervalo justo antes de T, y luego realizar la simulación dada y volver al estado en el tiempo t
Aquí es donde las funciones del generador son bastante útiles. Por ejemplo, considere la siguiente función
def func(): while True: yield 1 yield 2
Ahora, cuando se llama a esta función por primera vez, ‘produce’ 1. Sin embargo, en la siguiente llamada, dará 2. En cierto sentido, recuerda lo que devolvió en la última llamada y pasa a la siguiente. declaración de rendimiento.
Los eventos en SimPy se denominan procesos , que están definidos por funciones generadoras propias. Estos procesos tienen lugar dentro de un Entorno . (Imagine que el entorno es una caja grande, dentro de la cual se guardan los procesos).
Considere un ejemplo simple, que involucra la simulación de un semáforo:
# 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)
Producción :
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
En este código, la función generadora Traffic_Light(env) toma la variable de entorno como argumento y simula el funcionamiento del semáforo durante el período de tiempo pasado como argumento en la función env.run(). (En realidad, el tiempo en SimPy no tiene unidades. Aunque se puede convertir a horas, minutos o segundos según convenga). env.now devuelve el valor actual del tiempo transcurrido.
La función env.timeout() es la base de esta simulación, ya que espera que el tiempo transcurrido como argumento transcurra en el reloj de simulación de la computadora (no es un reloj de tiempo real), y luego inicia la siguiente declaración de rendimiento, hasta el tiempo pasado como argumento en env.run() ha terminado.
env.run() inicia todos los procesos vinculados al entorno al mismo tiempo = 0.
Publicación traducida automáticamente
Artículo escrito por Sanchit Agarwal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA