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 risorse:

  • 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
  • Quantità discrete (es. mele) o continue (es. acqua)
  • Esempio: serbatoio d’acqua

simpy.Store()

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

Metodo: simpy.Resources()

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 il diritto d’uso alla risorsa
    • Se tutte in uso, le richieste vanno in coda
  • Quando un processo rilascia la risorsa, si sbloccano le richieste in attesa

Richiedere una risorsa

# 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

  • Variazione della risorsa precedente

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

  • Esempio: tecnico

    • Priorità 1: riparare macchine guaste
    • Priorità 2 o minore: 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 indifferenziata

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

Esempio: riserve di benzina in un distributore.

  • Le auto riducono le riserve, le cisterne le aumentano
  • Creare un container
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Aggiungere e 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 della più astratta "quantità" nei 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 proprietario vuole capire se conviene investire in più cassieri
  • Più cassieri riducono 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

Passons à la pratique !

Simulazione a eventi discreti in Python

Preparing Video For Download...