Simulación de eventos discretos en Python
Dr Diogo Costa
Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific
SimPy ofrece tres tipos de recursos:
resource
containerstore simpy.Resource()
simpy.Container()
simpy.Store()
Crear un recurso
resource_1 = simpy.Resource(env, capacity=8)
capacity=8)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)
Variación del recurso anterior
resource_1 = simpy.PreemptiveResource(
env, capacity=1)
Algunos procesos tienen prioridad sobre otros
Ejemplo: técnico de 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)
Ú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.
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
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
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
Ejemplo
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