Balíček SimPy: Správa plánování událostí

Diskrétní simulace událostí v Pythonu

Dr Diogo Costa

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

Správa výskytu událostí

  • Výskyt událostí v reálných problémech může být ovlivněn různými situacemi.

  • Nejčastější situace zahrnují:

    • podmínkové události
    • přerušení událostí
    • čekání na procesy

Tyto situace lze převést do diskrétně-událostního modelu SimPy.

Diskrétní simulace událostí v Pythonu

Podmínkové události

  • Některé události závisí na výskytu jiné události
  • Spustí se pouze při splnění podmínky

Příklad

  • Zákazníci přicházejí do obchodu s oblečením

    def customer_arrivals(env, shop)
    
  • Hledají konkrétní zboží

    env.timeout(search_time)
    
  • Koupí ho pouze pokud je dostupné
if shop.available[item]:

Generátor: spojení veškerého kódu

def customer_arrivals(env, shop):

while True: yield env.timeout(search_time)
# Only buy item if available if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Diskrétní simulace událostí v Pythonu

Přerušení událostí

Některé události mohou být přerušeny z důvodu:

  • Nastoupení událostí s vyšší prioritou
  • Dobrovolného přerušení (např. nabíjení auta)
  • Vynuceného přerušení (např. porucha stroje)

Metoda

simpy_process_1.interrupt()

Příklad

Stroj se pravidelně porouchá a přerušuje výrobní linku.

def break_machine(env):

# Break machine every now and then. while True: # Time between machine fails yield env.timeout(fail_time())
# Machine fail: interrupt process simpy_process_1.interrupt()
Diskrétní simulace událostí v Pythonu

Čekání na procesy

  • Některé procesy musí čekat na dokončení jiných
  • Důvodem bývá omezená dostupnost zdrojů
  • Příklad: sdílené zdroje s capacity=5:
    simpy.Resource(env, capacity=5)
    
  • Proces tedy musí čekat, pokud jsou všechny zdroje obsazeny

Příklad: Zásoby pohonných hmot na čerpací stanici je třeba pravidelně doplňovat

with gas_station.request() as request:

# Request one of the gas pumps yield request
# Once pump is available: pump fuel liters_request = 10 yield fuel_reserve.get(liters_request) # The "actual" refueling takes time refuel_duration = liters_request / refuel_speed
yield env.timeout(refuel_duration)
Diskrétní simulace událostí v Pythonu

Zřetězení událostí pomocí bitových operátorů

Bitové operátory

  • Provádějí bitové výpočty na celých číslech
  • Očekávají dva operandy
    • Příklad: a & b, a >> b, a ^ b

V SimPy

  • Generuje podmínkovou událost
  • Mezi 2 událostmi

Relevantní bitové operátory pro SimPy

  • Čeká na oba procesy: __and__() nebo &
  • Čeká na jeden z procesů: __or__() nebo |
Diskrétní simulace událostí v Pythonu

Zřetězení událostí pomocí bitových operátorů

Příklad: Návštěvník kina čeká ve frontě na lístek, dokud nepřijde řada nebo film nevyprodá

with counter.request() as my_turn:

# Wait until turn or movie is sold out result = yield my_turn | counter.sold_out[movie]
# If tickets available if my_turn in result: theater.num_moviegoers[movie] += 1 return
# If tickets sold out if my_turn not in result: theater.num_renegers[movie] += 1 return
Diskrétní simulace událostí v Pythonu

Pojďme si procvičit!

Diskrétní simulace událostí v Pythonu

Preparing Video For Download...