Pachetul SimPy: Tipuri de resurse

Simulare de evenimente discrete în Python

Dr Diogo Costa

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

Tipuri de resurse disponibile

  • SimPy oferă trei tipuri de resurse:

  • resource

  • container
  • store
Simulare de evenimente discrete în Python

Tipuri de resurse disponibile

simpy.Resource()

  • Partajarea resurselor între procese
  • Exemplu: mese într-un restaurant

simpy.Container()

  • Resursă pentru partajarea materiei omogene între procese
  • Cantitățile pot fi discrete (mere) sau continue (apă)
  • Exemplu: Rezervor de apă

simpy.Store()

  • Stocarea unui număr nelimitat de obiecte
  • Exemplu: supermarket
Simulare de evenimente discrete în Python

Metodă: simpy.Resource()

Crearea unei resurse

resource_1 = simpy.Resource(env, capacity=8)
  • Utilizat când capacitatea resursei este limitată (ex., capacity=8)
  • Limitează numărul de procese care accesează o resursă simultan
  • Procesul trebuie să solicite dreptul de utilizare a resursei
    • Dacă toate resursele sunt ocupate, solicitările sunt puse în coadă
  • Când un proces eliberează resursa, solicitările în așteptare sunt declanșate

Solicitarea unei resurse

# Open resource request
with resource_1.request() as request:

# Make resource request yield request
# Once resource is avaiable yield env.timeout(event_duration)
Simulare de evenimente discrete în Python

Resurse: priorități și preempțiune

  • Variantă a resursei anterioare

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Unele procese pot avea prioritate față de altele

  • Exemplu: tehnician de service

    • Prioritate 1: repararea mașinilor defecte
    • Prioritate 2 sau mai mică: întreținere mașini
  • Utilizare similară cu simpy.Resource()

  • Solicitarea resursei cu cea mai mare prioritate

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Solicitarea resursei cu prioritate mai mică

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Simulare de evenimente discrete în Python

Metodă: simpy.Container()

  • Util pentru modelarea producției/consumului de materie omogenă

  • Poate fi continuă (apă) sau discretă (mere)

Exemplu: Rezerve de combustibil la o benzinărie.

  • Mașinile scad rezervele, iar cisternele le măresc
  • Crearea unui container
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Adăugare și eliminare din container/rezervor

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Cantitatea curentă din rezervor

    tank_1.level
    
  • Capacitatea totală a rezervorului

    tank_1.capacity
    
Simulare de evenimente discrete în Python

Metodă: simpy.Store()

  • Creare unui store

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Similar cu simpy.Container(), dar permite stocarea unor obiecte diferite

  • Spre deosebire de „cantitatea" abstractă stocată în containere

  • Adăugare și eliminare din store
yield store_1.put("item_1")
yield store_1.get()
  • Lista obiectelor disponibile

    store_1.items
    
  • Capacitatea store-ului

    store_1.capacity
    
Simulare de evenimente discrete în Python

Cum pot resursele SimPy informa deciziile de afaceri?

Exemplu

  • Supermarket cu 1 casier
  • Proprietarul vrea să știe dacă merită să investească în mai mulți casieri
  • Mai mulți casieri reduc timpul de așteptare?

Situație actuală: 1 casier

  • simpy.Resource(env, capacity=1)
...
time: 23.7 min | Customer 30 > Finished

Scenarii simulate: n casieri

  • simpy.Resource(env, capacity=2)
...
time: 13.2 min | Customer 30 > Finished
  • simpy.Resource(env, capacity=3)
...
time: 8.6 min | Customer 30 > Finished
  • simpy.Resource(env, capacity=4)
...
time: 8.6 min | Customer 30 > Finished
Simulare de evenimente discrete în Python

Să exersăm!

Simulare de evenimente discrete în Python

Preparing Video For Download...