Conceptos básicos de la simulación de eventos discretos con SimPy

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *