Discrete Event Simulation in Python
Dr Diogo Costa
Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific
Het optreden van events in realistische problemen kan door verschillende situaties worden beïnvloed.
De meest voorkomende zijn:
Deze situaties kun je modelleren met een SimPy discrete-eventmodel.
Voorbeeld
Klanten komen aan bij een kledingwinkel
def customer_arrivals(env, shop)
Zoeken naar een specifiek item
env.timeout(search_time)
if shop.available[item]:
Generator: alle code samenbrengen
def customer_arrivals(env, shop):while True: yield env.timeout(search_time)# Koop item alleen als beschikbaar if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Bepaalde events kunnen worden onderbroken door:
Methode
simpy_process_1.interrupt()
Voorbeeld
Machine valt periodiek uit en onderbreekt de productielijn.
def break_machine(env):# Laat de machine af en toe uitvallen. while True: # Tijd tussen storingen yield env.timeout(fail_time())# Storing: onderbreek proces simpy_process_1.interrupt()
capacity=5:simpy.Resource(env, capacity=5)
Voorbeeld: Brandstofvoorraad in een tankstation moet regelmatig worden aangevuld
with gas_station.request() as request:# Vraag een van de pompen aan yield request# Zodra een pomp vrij is: tank brandstof liters_request = 10 yield fuel_reserve.get(liters_request) # Het “echte” tanken kost tijd refuel_duration = liters_request / refuel_speedyield env.timeout(refuel_duration)
Bitwise-operators
a & b, a >> b, a ^ bIn SimPy
Relevante bitwise-operators voor SimPy
__and__() of &__or__() of |Voorbeeld: Bezoeker wacht in de rij tot z’n/haar beurt of tot de film is uitverkocht
with counter.request() as my_turn:# Wacht tot beurt of uitverkocht result = yield my_turn | counter.sold_out[movie]# Als er kaarten zijn if my_turn in result: theater.num_moviegoers[movie] += 1 return# Als uitverkocht if my_turn not in result: theater.num_renegers[movie] += 1 return
Discrete Event Simulation in Python