SimPy Paketi: Olay zamanlamasını yönetme

Python ile Ayrık Olay Benzetimi

Dr Diogo Costa

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

Olay gerçekleşmelerini yönetme

  • Gerçek dünyada olayların gerçekleşmesi çeşitli durumlara bağlı olabilir.

  • En yaygın durumlar:

    • koşullu olaylar
    • olayların kesilmesi
    • süreçleri bekleme

Bu durumlar SimPy ayrık olay modeline dönüştürülebilir.

Python ile Ayrık Olay Benzetimi

Koşullu olaylar

  • Bazı olaylar başka bir olayın gerçekleşmesine bağlıdır
  • Yalnızca bir koşul sağlanırsa tetiklenir

Örnek

  • Müşteriler bir giyim mağazasına gelir

    def customer_arrivals(env, shop)
    
  • Belirli bir ürünü arar

    env.timeout(search_time)
    
  • Yalnızca varsa satın alır
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))
Python ile Ayrık Olay Benzetimi

Olayların kesilmesi

Bazı olaylar şu nedenlerle kesilebilir:

  • Daha yüksek öncelikli olaylar
  • İsteğe bağlı kesme (ör. araç şarjı)
  • Zorunlu kesme (ör. makine arızası)

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()
Python ile Ayrık Olay Benzetimi

Süreçleri bekleme

  • Bazı süreçler diğerlerinin bitmesini beklemek zorundadır
  • Bu genelde sınırlı kaynaklar nedeniyle olur
  • Örnek: capacity=5 paylaşılan kaynak:
    simpy.Resource(env, capacity=5)
    
  • Bu nedenle tüm kaynaklar kullanılıyorsa bir süreç bekleyebilir

Ö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_speed
yield env.timeout(refuel_duration)
Python ile Ayrık Olay Benzetimi

Bit düzeyi işleçlerle olayları birleştirme

Bit düzeyi işleçler

  • Tamsayılarda bit düzeyi hesaplama yapar
  • İki işlenen bekler
    • Örnek: a & b, a >> b, a ^ b

SimPy'de

  • Koşul olayı üretir
  • 2 olay arasında

SimPy için ilgili bit düzeyi işleçler

  • Her iki süreci bekler: __and__() veya &
  • Süreçlerden birini bekler: __or__() veya |
Python ile Ayrık Olay Benzetimi

Bit düzeyi işleçlerle olayları birleştirme

Ö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

Hadi pratik yapalım!

Python ile Ayrık Olay Benzetimi

Preparing Video For Download...