Pacote SimPy: tipos de recursos

Simulação de Eventos Discretos em Python

Dr Diogo Costa

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

Tipos de recursos disponíveis

  • O SimPy oferece três tipos de recursos:

  • resource

  • container
  • store
Simulação de Eventos Discretos em Python

Tipos de recursos disponíveis

simpy.Resource()

  • Compartilha recursos entre processos
  • Exemplo: mesas num restaurante

simpy.Container()

  • Recurso para compartilhar matéria homogênea entre processos
  • Quantidades podem ser discretas (ex.: maçãs) ou contínuas (ex.: água)
  • Exemplo: reservatório de água

simpy.Store()

  • Armazena uma quantidade possivelmente ilimitada de objetos
  • Exemplo: supermercado
Simulação de Eventos Discretos em Python

Método: simpy.Resource()

Criando um resource

resource_1 = simpy.Resource(env, capacity=8)
  • Use quando a capacidade é limitada (ex.: capacity=8)
  • Limita quantos processos acessam o recurso ao mesmo tempo
  • O processo precisa pedir direito de uso do recurso
    • Se todos estiverem em uso, os pedidos entram na fila
  • Quando um processo libera o recurso, pedidos pendentes são atendidos

Solicitando um recurso

# Abrir solicitação de recurso
with resource_1.request() as request:

# Fazer a solicitação yield request
# Quando o recurso estiver disponível yield env.timeout(event_duration)
Simulação de Eventos Discretos em Python

Recursos: prioridade e preempção

  • Variação do resource anterior

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Alguns processos têm prioridade sobre outros

  • Exemplo: técnico de manutenção

    • Prioridade 1: consertar máquinas quebradas
    • Prioridade 2 ou menor: manutenção preventiva
  • Uso semelhante a simpy.Resource()

  • Solicitando recurso com maior prioridade

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Solicitando recurso com menor prioridade

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Simulação de Eventos Discretos em Python

Método: simpy.Container()

  • Útil para modelar produção/consumo de material homogêneo, indiferenciado

  • Pode ser contínuo (água) ou discreto (maçãs)

Exemplo: Reservas de gasolina num posto.

  • Carros reduzem o nível; caminhões de reabastecimento aumentam
  • Criando um container
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Adicionar e remover do container/tanque

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Obter a quantidade atual no tanque

    tank_1.level
    
  • Obter a capacidade total do tanque

    tank_1.capacity
    
Simulação de Eventos Discretos em Python

Método: simpy.Store()

  • Criar um store

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Parecido com simpy.Container(), mas armazena objetos diferentes

  • Em vez da noção abstrata de “quantidade” dos containers

  • Adicionar e remover do estoque
yield store_1.put("item_1")
yield store_1.get()
  • Ver lista de itens disponíveis

    store_1.items
    
  • Ver capacidade do store

    store_1.capacity
    
Simulação de Eventos Discretos em Python

Como recursos do SimPy ajudam decisões de negócio?

Exemplo

  • Supermercado com 1 caixa
  • O dono quer saber se vale investir em mais caixas
  • Mais caixas reduzem a espera?

Situação atual: 1 caixa

  • simpy.Resource(env, capacity=1)
...
tempo: 23.7 min | Cliente 30 > Concluído

Cenários simulados: n caixas

  • simpy.Resource(env, capacity=2)
...
tempo: 13.2 min | Cliente 30 > Concluído
  • simpy.Resource(env, capacity=3)
...
tempo: 8.6 min | Cliente 30 > Concluído
  • simpy.Resource(env, capacity=4)
...
tempo: 8.6 min | Cliente 30 > Concluído
Simulação de Eventos Discretos em Python

Vamos praticar!

Simulação de Eventos Discretos em Python

Preparing Video For Download...