Python ile Ayrık Olay Benzetimi
Dr Diogo Costa
Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific
Gerçek dünyada olayların gerçekleşmesi çeşitli durumlara bağlı olabilir.
En yaygın durumlar:
Bu durumlar SimPy ayrık olay modeline dönüştürülebilir.
Örnek
Müşteriler bir giyim mağazasına gelir
def customer_arrivals(env, shop)
Belirli bir ürünü arar
env.timeout(search_time)
if shop.available[item]:
Üreteç: tüm kodu birleştirme
def customer_arrivals(env, shop):while True: yield env.timeout(search_time)# Ürün varsa satın al if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Bazı olaylar şu nedenlerle kesilebilir:
Yöntem
simpy_process_1.interrupt()
Örnek
Makine periyodik olarak bozulur ve üretim hattını keser.
def break_machine(env):# Makine ara sıra bozulsun. while True: # Arızalar arası süre yield env.timeout(fail_time())# Makine arızası: süreci kes simpy_process_1.interrupt()
capacity=5 paylaşılan kaynak:simpy.Resource(env, capacity=5)
Örnek: Bir akaryakıt istasyonunda yakıt rezervleri düzenli olarak yenilenmelidir
with gas_station.request() as request:# Pompalardan birini iste yield request# Pompa uygun olunca: yakıt çek liters_request = 10 yield fuel_reserve.get(liters_request) # "Gerçek" yakıt ikmali zaman alır refuel_duration = liters_request / refuel_speedyield env.timeout(refuel_duration)
Bit düzeyi işleçler
a & b, a >> b, a ^ bSimPy'de
SimPy için ilgili bit düzeyi işleçler
__and__() veya &__or__() veya |Örnek: Sinemasever sıra kendisine gelene kadar ya da film tükenene kadar bekler
with counter.request() as my_turn:# Sıra gelene kadar veya film tükenene kadar bekle result = yield my_turn | counter.sold_out[movie]# Bilet varsa if my_turn in result: theater.num_moviegoers[movie] += 1 return# Bilet yoksa if my_turn not in result: theater.num_renegers[movie] += 1 return
Python ile Ayrık Olay Benzetimi