Pacchetto SimPy: gestione della pianificazione degli eventi

Simulazione a eventi discreti in Python

Dr Diogo Costa

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

Gestire il verificarsi degli eventi

  • Il verificarsi degli eventi nei problemi reali può essere influenzato da varie situazioni.

  • Le più comuni riguardano:

    • eventi condizionali
    • interruzione di eventi
    • attesa di processi

Queste situazioni si traducono in un modello a eventi discreti SimPy.

Simulazione a eventi discreti in Python

Eventi condizionali

  • Alcuni eventi dipendono dal verificarsi di altri
  • Si attivano solo se è soddisfatta una condizione

Esempio

  • I clienti arrivano in un negozio di abbigliamento

    def customer_arrivals(env, shop)
    
  • Cercano un articolo specifico

    env.timeout(search_time)
    
  • Lo comprano solo se disponibile
if shop.available[item]:

Generatore: riunire tutto il codice

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))
Simulazione a eventi discreti in Python

Interruzione di eventi

Alcuni eventi possono essere interrotti da:

  • Eventi a priorità più alta
  • Interruzione volontaria (es. ricarica auto)
  • Interruzione forzata (es. guasto macchina)

Metodo

simpy_process_1.interrupt()

Esempio

La macchina si rompe periodicamente, interrompendo la linea di produzione.

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()
Simulazione a eventi discreti in Python

Attesa di processi

  • Alcuni processi devono aspettare che altri finiscano
  • Succede spesso perché le risorse sono limitate
  • Esempio: risorse condivise con capacity=5:
    simpy.Resource(env, capacity=5)
    
  • Quindi un processo può dover aspettare se tutte le risorse sono occupate

Esempio: Le riserve di carburante di una stazione vanno rifornite regolarmente

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)
Simulazione a eventi discreti in Python

Concatena eventi con operatori bitwise

Operatori bitwise

  • Fanno calcoli bit a bit su interi
  • Richiedono due operandi
    • Esempio: a & b, a >> b, a ^ b

In SimPy

  • Genera un evento condizione
  • Tra 2 eventi

Operatori bitwise rilevanti per SimPy

  • Attende entrambi i processi: __and__() o &
  • Attende uno dei processi: __or__() o |
Simulazione a eventi discreti in Python

Concatena eventi con operatori bitwise

Esempio: Lo spettatore aspetta in coda finché tocca a lui/lei o finché il film è esaurito

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
Simulazione a eventi discreti in Python

Passons à la pratique !

Simulazione a eventi discreti in Python

Preparing Video For Download...