Pacote SimPy: agendando eventos

Simulação de Eventos Discretos em Python

Dr Diogo Costa

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

Gerenciando ocorrências de eventos

  • A ocorrência de eventos em problemas reais pode ser afetada por várias situações.

  • As mais comuns envolvem:

    • eventos condicionais
    • interrupção de eventos
    • espera por processos

Essas situações podem ser modeladas em SimPy (eventos discretos).

Simulação de Eventos Discretos em Python

Eventos condicionais

  • Certos eventos dependem da ocorrência de outro evento
  • Só disparam se uma condição for atendida

Exemplo

  • Clientes chegam a uma loja de roupas

    def customer_arrivals(env, shop)
    
  • Procuram um item específico

    env.timeout(search_time)
    
  • Só compram se houver estoque
if shop.available[item]:

Gerador: juntando tudo

def customer_arrivals(env, shop):

while True: yield env.timeout(search_time)
# Só compra se houver estoque if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Simulação de Eventos Discretos em Python

Interrupção de eventos

Certos eventos podem ser interrompidos por:

  • Eventos de maior prioridade
  • Interrupção voluntária (ex.: carga de carro)
  • Interrupção forçada (ex.: quebra de máquina)

Método

simpy_process_1.interrupt()

Exemplo

Máquina quebra periodicamente, interrompendo a produção.

def break_machine(env):

# Quebra de tempos em tempos while True: # Tempo entre falhas yield env.timeout(fail_time())
# Falha: interrompe o processo simpy_process_1.interrupt()
Simulação de Eventos Discretos em Python

Esperando por processos

  • Alguns processos precisam esperar outros terminarem
  • Isso ocorre porque recursos são limitados
  • Ex.: recursos compartilhados com capacity=5:
    simpy.Resource(env, capacity=5)
    
  • Assim, um processo pode esperar se todos os recursos estiverem em uso

Exemplo: Reservas de gasolina num posto precisam ser reabastecidas regularmente

with gas_station.request() as request:

# Solicita uma das bombas yield request
# Quando liberar: bombeia combustível liters_request = 10 yield fuel_reserve.get(liters_request) # O abastecimento "real" leva tempo refuel_duration = liters_request / refuel_speed
yield env.timeout(refuel_duration)
Simulação de Eventos Discretos em Python

Concatenar eventos com operadores bit a bit

Operadores bit a bit

  • Fazem cálculos bit a bit em inteiros
  • Esperam dois operandos
    • Ex.: a & b, a >> b, a ^ b

No SimPy

  • Gera evento-condição
  • Entre 2 eventos

Operadores bit a bit relevantes no SimPy

  • Espera ambos os processos: __and__() ou &
  • Espera qualquer um dos processos: __or__() ou |
Simulação de Eventos Discretos em Python

Concatenar eventos com operadores bit a bit

Exemplo: Espectador espera na fila até chegar sua vez ou os ingressos acabarem

with counter.request() as my_turn:

# Espera pela vez ou por esgotar result = yield my_turn | counter.sold_out[movie]
# Se ainda há ingressos if my_turn in result: theater.num_moviegoers[movie] += 1 return
# Se esgotou if my_turn not in result: theater.num_renegers[movie] += 1 return
Simulação de Eventos Discretos em Python

Vamos praticar!

Simulação de Eventos Discretos em Python

Preparing Video For Download...