Paquete SimPy: tipos de recursos

Simulación de eventos discretos en Python

Dr Diogo Costa

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

Tipos de recursos disponibles

  • SimPy ofrece tres tipos de recursos:

  • resource

  • container
  • store
Simulación de eventos discretos en Python

Tipos de recursos disponibles

simpy.Resource()

  • Compartir recursos entre procesos
  • Ejemplo: mesas en un restaurante

simpy.Container()

  • Recurso para compartir materia homogénea entre procesos
  • Cantidades discretas (p. ej., manzanas) o continuas (p. ej., agua)
  • Ejemplo: depósito de agua

simpy.Store()

  • Almacena una cantidad posiblemente ilimitada de objetos
  • Ejemplo: supermercado
Simulación de eventos discretos en Python

Método: simpy.Resource()

Crear un recurso

resource_1 = simpy.Resource(env, capacity=8)
  • Úsalo cuando la capacidad es limitada (p. ej., capacity=8)
  • Sirve para limitar procesos concurrentes que acceden al recurso
  • Un proceso debe solicitar el uso del recurso
    • Si todo está en uso, las solicitudes se encolan
  • Cuando un proceso libera el recurso, se atienden las peticiones pendientes

Solicitar un recurso

# Abrir solicitud del recurso
with resource_1.request() as request:

# Hacer la solicitud yield request
# Cuando el recurso esté disponible yield env.timeout(event_duration)
Simulación de eventos discretos en Python

Recursos: prioridades y expropiación

  • Variación del recurso anterior

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Algunos procesos tienen prioridad sobre otros

  • Ejemplo: técnico de mantenimiento

    • Prioridad 1: reparar máquinas averiadas
    • Prioridad 2 o menos: mantenimiento
  • Uso similar a simpy.Resource()

  • Solicitar el recurso con máxima prioridad

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Solicitar el recurso con menor prioridad

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Simulación de eventos discretos en Python

Método: simpy.Container()

  • Útil para modelar producción/consumo de materia homogénea y no diferenciada

  • Puede ser continua (agua) o discreta (manzanas)

Ejemplo: Reservas de gasolina en una gasolinera.

  • Los coches bajan las reservas y los camiones cisterna las suben
  • Crear un contenedor
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Añadir y quitar del contenedor/deposito

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Obtener cantidad actual en el depósito

    tank_1.level
    
  • Obtener capacidad total del depósito

    tank_1.capacity
    
Simulación de eventos discretos en Python

Método: simpy.Store()

  • Crear un almacén

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Similar a simpy.Container() pero permite guardar objetos distintos

  • A diferencia de la "cantidad" abstracta de los contenedores

  • Añadir y retirar del almacén
yield store_1.put("item_1")
yield store_1.get()
  • Obtener la lista de objetos disponibles

    store_1.items
    
  • Obtener la capacidad del almacén

    store_1.capacity
    
Simulación de eventos discretos en Python

¿Cómo ayudan los recursos de SimPy a decidir en el negocio?

Ejemplo

  • Supermercado con 1 cajero
  • La dirección quiere saber si compensa invertir en más cajeros
  • ¿Más cajeros reducen la espera?

Situación actual: 1 cajero

  • simpy.Resource(env, capacity=1)
...
tiempo: 23.7 min | Cliente 30 > Finalizado

Escenarios simulados: n cajeros

  • simpy.Resource(env, capacity=2)
...
tiempo: 13.2 min | Cliente 30 > Finalizado
  • simpy.Resource(env, capacity=3)
...
tiempo: 8.6 min | Cliente 30 > Finalizado
  • simpy.Resource(env, capacity=4)
...
tiempo: 8.6 min | Cliente 30 > Finalizado
Simulación de eventos discretos en Python

¡Vamos a practicar!

Simulación de eventos discretos en Python

Preparing Video For Download...