Pachetul SimPy: Gestionarea programării evenimentelor

Simulare de evenimente discrete în Python

Dr Diogo Costa

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

Gestionarea apariției evenimentelor

  • Apariția evenimentelor din lumea reală poate fi influențată de mai multe situații.

  • Cele mai frecvente situații implică:

    • evenimente condiționate
    • întreruperea evenimentelor
    • așteptarea proceselor

Aceste situații pot fi modelate cu SimPy ca model cu evenimente discrete.

Simulare de evenimente discrete în Python

Evenimente condiționate

  • Anumite evenimente depind de producerea altor evenimente
  • Sunt declanșate doar dacă o condiție este îndeplinită

Exemplu

  • Clienții ajung la un magazin de haine

    def customer_arrivals(env, shop)
    
  • Caută un anumit articol

    env.timeout(search_time)
    
  • Îl cumpără doar dacă este disponibil
if shop.available[item]:

Generator: codul complet

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))
Simulare de evenimente discrete în Python

Întreruperea evenimentelor

Anumite evenimente pot fi întrerupte din cauza:

  • Evenimentelor cu prioritate mai mare
  • Întreruperii voluntare (ex.: încărcarea mașinii)
  • Întreruperii forțate (ex.: defectarea utilajului)

Metodă

simpy_process_1.interrupt()

Exemplu

Utilajul se defectează periodic, întrerupând linia de producție.

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()
Simulare de evenimente discrete în Python

Așteptarea proceselor

  • Unele procese trebuie să aștepte finalizarea altora
  • Aceasta se întâmplă adesea deoarece resursele sunt limitate
  • Exemplu: resurse partajate cu capacity=5:
    simpy.Resource(env, capacity=5)
    
  • Astfel, un proces poate trebui să aștepte dacă toate resursele sunt ocupate

Exemplu: Rezervele de combustibil ale unei stații de benzină trebuie reîncărcate periodic

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)
Simulare de evenimente discrete în Python

Concatenarea evenimentelor cu operatori pe biți

Operatori pe biți

  • Efectuează calcule pe biți asupra întregilor
  • Necesită doi operanzi
    • Exemplu: a & b, a >> b, a ^ b

În SimPy

  • Generează un eveniment condiționat
  • Între 2 evenimente

Operatori pe biți relevanți pentru SimPy

  • Așteaptă ambele procese: __and__() sau &
  • Așteaptă oricare proces: __or__() sau |
Simulare de evenimente discrete în Python

Concatenarea evenimentelor cu operatori pe biți

Exemplu: Spectatorul așteaptă la coadă până la rândul său sau până la epuizarea biletelor

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
Simulare de evenimente discrete în Python

Să exersăm!

Simulare de evenimente discrete în Python

Preparing Video For Download...