SimPy-pakket: Soorten resources

Discrete Event Simulation in Python

Dr Diogo Costa

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

Beschikbare resourcetypen

  • SimPy biedt drie typen resources:

  • resource

  • container
  • store
Discrete Event Simulation in Python

Beschikbare resourcetypen

simpy.Resource()

  • Deel resources tussen processen
  • Voorbeeld: tafels in een restaurant

simpy.Container()

  • Resource om homogene materie tussen processen te delen
  • Hoeveelheden kunnen discreet (bv. appels) of continu (bv. water) zijn
  • Voorbeeld: waterreservoir

simpy.Store()

  • Sla een (mogelijk) onbeperkt aantal objecten op
  • Voorbeeld: supermarkt
Discrete Event Simulation in Python

Methode: simpy.Resource()

Een resource maken

resource_1 = simpy.Resource(env, capacity=8)
  • Gebruik bij beperkte resourcecapaciteit (bv. capacity=8)
  • Beperk het aantal processen dat tegelijk toegang heeft
  • Een proces moet gebruiksrecht aanvragen
    • Als alles bezet is, komt de aanvraag in de wachtrij
  • Bij vrijgave worden wachtende aanvragen geactiveerd

Resource aanvragen

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

# Doe de aanvraag yield request
# Zodra de resource beschikbaar is yield env.timeout(event_duration)
Discrete Event Simulation in Python

Resources: prioriteit en pre-emption

  • Variant van de vorige resource

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Sommige processen hebben prioriteit boven andere

  • Voorbeeld: monteur

    • Prioriteit 1: kapotte machines repareren
    • Prioriteit 2 of lager: onderhoud
  • Gebruik lijkt op simpy.Resource()

  • Aanvragen met hoogste prioriteit

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Aanvragen met lagere prioriteit

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Discrete Event Simulation in Python

Methode: simpy.Container()

  • Handig om productie/consumptie van homogene, ongedifferentieerde bulk te modelleren

  • Kan continu (zoals water) of discreet (zoals appels) zijn

Voorbeeld: Brandstofvoorraad bij een tankstation.

  • Auto’s verlagen de voorraad, tankwagens vullen aan
  • Container maken
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Toevoegen en verwijderen uit container/tank

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Huidige hoeveelheid in de tank ophalen

    tank_1.level
    
  • Totale tankcapaciteit ophalen

    tank_1.capacity
    
Discrete Event Simulation in Python

Methode: simpy.Store()

  • Maak een store

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Lijkt op simpy.Container() maar slaat verschillende objecten op

  • In tegenstelling tot de vrij abstracte "hoeveelheid" in containers

  • Toevoegen en verwijderen uit opslag
yield store_1.put("item_1")
yield store_1.get()
  • Lijst met beschikbare items ophalen

    store_1.items
    
  • Opslagcapaciteit ophalen

    store_1.capacity
    
Discrete Event Simulation in Python

Hoe kunnen SimPy-resources beslissingen ondersteunen?

Voorbeeld

  • Supermarkt met 1 kassamedewerker
  • Eigenaar wil weten of extra kassa’s de moeite waard zijn
  • Verminderen extra kassa’s de wachttijd?

Huidige situatie: 1 kassa

  • simpy.Resource(env, capacity=1)
...
tijd: 23,7 min | Klant 30 > Klaar

Gesimuleerde scenario’s: n kassa’s

  • simpy.Resource(env, capacity=2)
...
tijd: 13,2 min | Klant 30 > Klaar
  • simpy.Resource(env, capacity=3)
...
tijd: 8,6 min | Klant 30 > Klaar
  • simpy.Resource(env, capacity=4)
...
tijd: 8,6 min | Klant 30 > Klaar
Discrete Event Simulation in Python

Laten we oefenen!

Discrete Event Simulation in Python

Preparing Video For Download...