Pacchetto SimPy: tipi di risorse

Simulazione a eventi discreti in Python

Dr Diogo Costa

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

Tipi di risorse disponibili

  • SimPy offre tre tipi di risorsa:

  • resource

  • container
  • store
Simulazione a eventi discreti in Python

Tipi di risorse disponibili

simpy.Resource()

  • Condividere risorse tra processi
  • Esempio: tavoli in un ristorante

simpy.Container()

  • Risorsa per condividere materia omogenea tra processi
  • Le quantità possono essere discrete (es. mele) o continue (es. acqua)
  • Esempio: serbatoio d’acqua

simpy.Store()

  • Memorizza una quantità anche illimitata di oggetti
  • Esempio: supermercato
Simulazione a eventi discreti in Python

Metodo: simpy.Resource()

Creare una resource

resource_1 = simpy.Resource(env, capacity=8)
  • Usata quando la capacità è limitata (es. capacity=8)
  • Limita il numero di processi che accedono in parallelo
  • Il processo deve richiedere l’uso della resource
    • Se tutte occupate, le richieste vanno in coda
  • Quando un processo rilascia la resource, si attivano le richieste in attesa

Richiedere una resource

# Apri richiesta risorsa
with resource_1.request() as request:

# Effettua la richiesta yield request
# Quando la risorsa è disponibile yield env.timeout(event_duration)
Simulazione a eventi discreti in Python

Risorse: priorità e preemption

  • Variante della resource precedente

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Alcuni processi hanno priorità su altri

  • Esempio: tecnico

    • Priorità 1: riparare macchine guaste
    • Priorità 2 o meno: manutenzione
  • Uso simile a simpy.Resource()

  • Richiesta con priorità più alta

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Richiesta con priorità più bassa

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Simulazione a eventi discreti in Python

Metodo: simpy.Container()

  • Utile per modellare produzione/consumo di materia omogenea e indistinta

  • Può essere continua (acqua) o discreta (mele)

Esempio: Riserve di carburante in un distributore.

  • Le auto riducono le riserve, le autobotti le aumentano
  • Creare un container
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Aggiungere o rimuovere dal serbatoio

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Quantità attuale nel serbatoio

    tank_1.level
    
  • Capacità totale del serbatoio

    tank_1.capacity
    
Simulazione a eventi discreti in Python

Metodo: simpy.Store()

  • Creare uno store

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Simile a simpy.Container() ma consente di memorizzare oggetti diversi

  • A differenza dell’astratta "quantità" dei container

  • Aggiungere e rimuovere dallo store
yield store_1.put("item_1")
yield store_1.get()
  • Elenco degli oggetti disponibili

    store_1.items
    
  • Capacità dello store

    store_1.capacity
    
Simulazione a eventi discreti in Python

Come le risorse SimPy guidano le decisioni di business?

Esempio

  • Supermercato con 1 cassiere
  • Il titolare vuole sapere se conviene aggiungerne altri
  • Più cassieri ridurranno l’attesa?

Situazione attuale: 1 cassiere

  • simpy.Resource(env, capacity=1)
...
ora: 23.7 min | Cliente 30 > Completato

Scenari simulati: n cassieri

  • simpy.Resource(env, capacity=2)
...
ora: 13.2 min | Cliente 30 > Completato
  • simpy.Resource(env, capacity=3)
...
ora: 8.6 min | Cliente 30 > Completato
  • simpy.Resource(env, capacity=4)
...
ora: 8.6 min | Cliente 30 > Completato
Simulazione a eventi discreti in Python

Ayo berlatih!

Simulazione a eventi discreti in Python

Preparing Video For Download...