Diskrete-Ereignis-Simulation mit Python
Dr Diogo Costa
Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific
Das Auftreten von Ereignissen kann durch verschiedene Situationen beeinflusst werden.
Häufige Fälle:
Diese Situationen lassen sich in ein SimPy-Ereignismodell übersetzen.
Beispiel
Kund:innen kommen in ein Kleidungsgeschäft
def customer_arrivals(env, shop)
Suchen nach einem bestimmten Artikel
env.timeout(search_time)
if shop.available[item]:
Generator: Code zusammenführen
def customer_arrivals(env, shop):while True: yield env.timeout(search_time)# Artikel nur kaufen, wenn verfügbar if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Bestimmte Ereignisse können unterbrochen werden durch:
Methode
simpy_process_1.interrupt()
Beispiel
Maschine fällt periodisch aus und unterbricht die Produktion.
def break_machine(env):# Maschine fällt hin und wieder aus. while True: # Zeit zwischen Ausfällen yield env.timeout(fail_time())# Ausfall: Prozess unterbrechen simpy_process_1.interrupt()
capacity=5:simpy.Resource(env, capacity=5)
Beispiel: Treibstoffvorräte an einer Tankstelle müssen regelmäßig aufgefüllt werden
with gas_station.request() as request:# Eine Zapfsäule anfordern yield request# Sobald frei: tanken liters_request = 10 yield fuel_reserve.get(liters_request) # Das eigentliche Tanken dauert refuel_duration = liters_request / refuel_speedyield env.timeout(refuel_duration)
Bitweise Operatoren
a & b, a >> b, a ^ bIn SimPy
Relevante bitweise Operatoren für SimPy
__and__() oder &__or__() oder |Beispiel: Kinobesucher wartet an der Kasse bis er/sie dran ist oder der Film ausverkauft ist
with counter.request() as my_turn:# Warten bis dran oder ausverkauft result = yield my_turn | counter.sold_out[movie]# Wenn Tickets verfügbar if my_turn in result: theater.num_moviegoers[movie] += 1 return# Wenn ausverkauft if my_turn not in result: theater.num_renegers[movie] += 1 return
Diskrete-Ereignis-Simulation mit Python