SimPy-pakket: typen 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)
  • Beperkt het aantal processen dat gelijktijdig toegang heeft
  • Een proces moet gebruiksrecht aanvragen
    • Als alles bezet is, komen aanvragen in de wachtrij
  • Bij vrijgave worden openstaande aanvragen geactiveerd

Een resource aanvragen

# Resourceaanvraag openen
with resource_1.request() as request:

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

Resources: prioriteit en pre-emption

  • Variant op de vorige resource

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

  • Voorbeeld: monteur

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

  • Resource aanvragen met hoogste prioriteit

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Resource 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: Brandstofreserve in een tankstation.

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

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

    tank_1.level
    
  • Totale tankcapaciteit

    tank_1.capacity
    
Discrete Event Simulation in Python

Methode: simpy.Store()

  • Een store maken

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

  • In tegenstelling tot de abstracte “hoeveelheid” in containers

  • Toevoegen aan en afhalen uit opslag
yield store_1.put("item_1")
yield store_1.get()
  • Lijst met beschikbare items opvragen

    store_1.items
    
  • Opslagcapaciteit opvragen

    store_1.capacity
    
Discrete Event Simulation in Python

Hoe helpen SimPy-resources bij beslissingen?

Voorbeeld

  • Supermarkt met 1 kassamedewerker
  • Eigenaar wil weten of extra kassa’s zinvol 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...