Simulação de Eventos Discretos em Python
Dr Diogo Costa
Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific
A ocorrência de eventos em problemas reais pode ser afetada por várias situações.
As mais comuns envolvem:
Essas situações podem ser modeladas em SimPy (eventos discretos).
Exemplo
Clientes chegam a uma loja de roupas
def customer_arrivals(env, shop)
Procuram um item específico
env.timeout(search_time)
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))
Certos eventos podem ser interrompidos por:
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()
capacity=5:simpy.Resource(env, capacity=5)
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_speedyield env.timeout(refuel_duration)
Operadores bit a bit
a & b, a >> b, a ^ bNo SimPy
Operadores bit a bit relevantes no SimPy
__and__() ou &__or__() ou |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