SimPy-paketet: Typer av resurser

Diskret händelsesimulering i Python

Dr Diogo Costa

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

Tillgängliga resurstyper

  • SimPy erbjuder tre typer av resurser:

  • resource

  • container
  • store
Diskret händelsesimulering i Python

Tillgängliga resurstyper

simpy.Resource()

  • Delar resurser mellan processer
  • Exempel: bord på en restaurang

simpy.Container()

  • Resurs för att dela homogent material mellan processer
  • Mängder kan vara diskreta (t.ex. äpplen) eller kontinuerliga (t.ex. vatten)
  • Exempel: vattentank

simpy.Store()

  • Lagrar ett potentiellt obegränsat antal objekt
  • Exempel: stormarknad
Diskret händelsesimulering i Python

Metod: simpy.Resource()

Skapa en resurs

resource_1 = simpy.Resource(env, capacity=8)
  • Används när resursen har begränsad kapacitet (t.ex. capacity=8)
  • Begränsar antalet processer som använder resursen samtidigt
  • En process måste begära nyttjanderätt till resursen
    • Om alla resurser används köas begäran
  • När en process frigör resursen aktiveras väntande begäranden

Begära en resurs

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

# Make resource request yield request
# Once resource is avaiable yield env.timeout(event_duration)
Diskret händelsesimulering i Python

Resurser: prioritet och preemption

  • Variant av föregående resurs

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Vissa processer kan ha högre prioritet än andra

  • Exempel: reparatör

    • Prioritet 1: laga trasiga maskiner
    • Prioritet 2 eller lägre: maskinunderhåll
  • Används på liknande sätt som simpy.Resource()

  • Begära resurs med högsta prioritet

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Begära resurs med lägre prioritet

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Diskret händelsesimulering i Python

Metod: simpy.Container()

  • Lämplig för att modellera produktion och konsumtion av homogent, odifferentierat material

  • Kan vara kontinuerligt (som vatten) eller diskret (som äpplen)

Exempel: Bensintillgångar vid en bensinstation.

  • Bilar minskar tillgångarna medan tankbilar fyller på
  • Skapa en container
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Lägg till och ta bort från container/tank

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Hämta aktuell mängd i tanken

    tank_1.level
    
  • Hämta tankens totala kapacitet

    tank_1.capacity
    
Diskret händelsesimulering i Python

Metod: simpy.Store()

  • Skapa ett lager

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Liknar simpy.Container() men tillåter lagring av olika objekt

  • Till skillnad från den mer abstrakta "mängden" som lagras i containrar

  • Lägg till och ta bort från lagret
yield store_1.put("item_1")
yield store_1.get()
  • Hämta lista över tillgängliga objekt

    store_1.items
    
  • Hämta lagrets kapacitet

    store_1.capacity
    
Diskret händelsesimulering i Python

Hur kan SimPy-resurser stödja affärsbeslut?

Exempel

  • Stormarknad med 1 kassör
  • Ägaren vill veta om det lönar sig att investera i fler kassörer
  • Minskar fler kassörer väntetiden?

Nuläge: 1 kassör

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

Simulerade scenarier: n kassörer

  • 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
Diskret händelsesimulering i Python

Nu kör vi en övning!

Diskret händelsesimulering i Python

Preparing Video For Download...