Los fundamentos del modelado de eventos discretos usando SimPy

| | | | | | | | | | | | | | | | | | | | |

Instalación:
Para instalar SimPy, use el siguiente comando —

pip install simpy 

Conceptos básicos:

La idea principal de ‚Äã‚ÄãSimPy — esta es una función generadora en Python. La diferencia entre una función normal y un generador es que una función normal usa una declaración de retorno, mientras que un generador — yield.

Si una función tiene una declaración de retorno, incluso si se realizan varias llamadas a la función, devolverá el mismo valor. Por ejemplo —


def func():

volver 1

volver 2

Cuando func () se llama en tiempo de ejecución, siempre regresará en la primera instancia de la declaración de retorno, es decir, func () siempre devuelve 1, y la siguiente declaración de retorno nunca se ejecuta.

Sin embargo, cuando Al simular eventos discretos, es posible que necesitemos encontrar el estado del sistema en un momento dado T. Para hacer esto, recuerde el estado del intervalo inmediatamente anterior a T, y luego realice esta simulación y regrese al estado durante T.

Aquí, las funciones del generador son bastante sencillas. Por ejemplo, considere la siguiente función


def func():

while Verdadero :

rendimiento 1

rendimiento 2

Ahora, la primera vez que se llama a esta función, "da" 1. Sin embargo, la próxima vez que se llame, devolverá 2. En cierto sentido, recuerda lo que regresa después de la última llamada y pasa a la siguiente declaración de salida.

Los eventos en SimPy se denominan procesos, que están definidos por sus propias funciones generadoras. Estos procesos tienen lugar dentro del entorno. (Imagínese que el entorno es una caja grande que almacena procesos en su interior).

Veamos un ejemplo simple que implica simular un semáforo —


# Código de Python 2.7 para demostrar los conceptos básicos del paquete SimPy
# Simulación de semáforo


# importar paquete SimPy

importar < /código> simple


# Función generadora que determina cómo funcionan los semáforos
La función # timeout () hace que la siguiente declaración de rendimiento espere
# esto el tiempo ha pasado como argumento

def Traffic_Light (en v):


while True :


imprimir " La luz cambia a GRN en " + str (env.now)


# Iluminado en verde durante 25 segundos

rendimiento env.timeout ( 25 )


print "La luz se vuelve YEL en " + str (env.now)

< br>

# Amarillo claro durante 5 segundos

rendimiento env.tiempo de espera ( 5 )


imprimir "La luz se vuelve ROJA en" + str (env.now)


# Se ilumina en rojo para 60 segundos

yield env.timeout ( 60 )


# env - variable de entorno

env = simpy.Entorno ()


# Proceso, definido por Traffic_Light (env)
# agregado al miércoles
env.process (Traffic_Light (env) )


# El proceso comienza dentro de los primeros 180 segundos (180 no es incluido)

e nv.run (hasta que = 180 )

Salir:

La luz se vuelve VERDE en 0 La luz se vuelve AMARILLA en 25 La luz se vuelve ROJA en 30 La luz se vuelve VERDE a los 90 La luz se vuelve YEL a los 115 La luz se vuelve ROJA a los 120 

En este código, la función generadora Traffic_Light (env) toma una variable de entorno como argumento y simula el semáforo durante un período de tiempo que pasa como un argumento para env.run(). (En realidad, el tiempo en SimPy no tiene unidades. Aunque se puede convertir a horas, minutos o segundos por conveniencia). env.now devuelve el tiempo transcurrido actual.

La función env.timeout () es la base de esta simulación, ya que espera que el tiempo transcurrido como argumento se use en el reloj de simulación de la computadora ( no es un reloj en tiempo real) y luego activa la siguiente declaración de rendimiento hasta que el tiempo transcurrido como argumento para env.run () finaliza.

env.run () inicia todos los procesos asociados con el entorno al mismo tiempo = 0 .