Paquete SimPy: gestión de la programación de eventos

Simulación de eventos discretos en Python

Dr Diogo Costa

Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific

Gestión de la ocurrencia de eventos

  • La ocurrencia de eventos en problemas reales puede verse afectada por varias situaciones.

  • Las más comunes incluyen:

    • eventos condicionales
    • interrupción de eventos
    • espera de procesos

Estas situaciones pueden modelarse en SimPy con eventos discretos.

Simulación de eventos discretos en Python

Eventos condicionales

  • Ciertos eventos dependen de otros
  • Solo se activan si se cumple una condición

Ejemplo

  • Llegan clientes a una tienda de ropa

    def customer_arrivals(env, shop)
    
  • Buscan un artículo concreto

    env.timeout(search_time)
    
  • Lo compran solo si está disponible
if shop.available[item]:

Generador: unir todo el código

def customer_arrivals(env, shop):

while True: yield env.timeout(search_time)
# Only buy item if available if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Simulación de eventos discretos en Python

Interrupción de eventos

Algunos eventos pueden interrumpirse por:

  • Eventos de mayor prioridad
  • Interrupción voluntaria (p. ej., carga de coche)
  • Interrupción forzada (p. ej., avería de máquina)

Método

simpy_process_1.interrupt()

Ejemplo

La máquina se avería periódicamente e interrumpe la producción.

def break_machine(env):

# Break machine every now and then. while True: # Time between machine fails yield env.timeout(fail_time())
# Machine fail: interrupt process simpy_process_1.interrupt()
Simulación de eventos discretos en Python

Espera de procesos

  • Algunos procesos deben esperar a que otros terminen
  • Suele pasar por recursos limitados
  • Ejemplo: recursos compartidos con capacity=5:
    simpy.Resource(env, capacity=5)
    
  • Un proceso puede esperar si todos los recursos están ocupados

Ejemplo: Las reservas de gasolina de una gasolinera deben reponerse con regularidad

with gas_station.request() as request:

# Request one of the gas pumps yield request
# Once pump is available: pump fuel liters_request = 10 yield fuel_reserve.get(liters_request) # The "actual" refueling takes time refuel_duration = liters_request / refuel_speed
yield env.timeout(refuel_duration)
Simulación de eventos discretos en Python

Concatena eventos con operadores bit a bit

Operadores bit a bit

  • Operan a nivel de bits sobre enteros
  • Requieren dos operandos
    • Ejemplo: a & b, a >> b, a ^ b

En SimPy

  • Generan un evento condicional
  • Entre 2 eventos

Operadores bit a bit relevantes en SimPy

  • Espera a ambos procesos: __and__() o &
  • Espera a cualquiera: __or__() o |
Simulación de eventos discretos en Python

Concatena eventos con operadores bit a bit

Ejemplo: Espectador espera su turno en taquilla o a que se agoten las entradas

with counter.request() as my_turn:

# Wait until turn or movie is sold out result = yield my_turn | counter.sold_out[movie]
# If tickets available if my_turn in result: theater.num_moviegoers[movie] += 1 return
# If tickets sold out if my_turn not in result: theater.num_renegers[movie] += 1 return
Simulación de eventos discretos en Python

¡Vamos a practicar!

Simulación de eventos discretos en Python

Preparing Video For Download...