SimPy-Paket: Ressourcentypen

Diskrete-Ereignis-Simulation mit Python

Dr Diogo Costa

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

Verfügbare Ressourcentypen

  • SimPy bietet drei Ressourcentypen:

  • resource

  • container
  • store
Diskrete-Ereignis-Simulation mit Python

Verfügbare Ressourcentypen

simpy.Resource()

  • Ressourcen zwischen Prozessen teilen
  • Beispiel: Tische in einem Restaurant

simpy.Container()

  • Ressource zum Teilen homogener Materie zwischen Prozessen
  • Mengen können diskret (z. B. Äpfel) oder kontinuierlich (z. B. Wasser) sein
  • Beispiel: Wasserspeicher

simpy.Store()

  • Beliebig viele Objekte speichern (ggf. unbegrenzt)
  • Beispiel: Supermarkt
Diskrete-Ereignis-Simulation mit Python

Methode: simpy.Resource()

Ressource erstellen

resource_1 = simpy.Resource(env, capacity=8)
  • Für begrenzte Ressourcenkapazität (z. B. capacity=8)
  • Begrenzt die Zahl gleichzeitiger Zugriffe auf eine Ressource
  • Prozesse müssen die Nutzung anfordern
    • Wenn alles belegt ist, kommen Anfragen in die Warteschlange
  • Wenn Prozesse freigeben, werden offene Anfragen bedient

Ressource anfordern

# Anfrage öffnen
with resource_1.request() as request:

# Anfrage stellen yield request
# Sobald Ressource verfügbar ist yield env.timeout(event_duration)
Diskrete-Ereignis-Simulation mit Python

Ressourcen: Prioritäten und Verdrängung

  • Variante der vorherigen Ressource

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Manche Prozesse haben Priorität vor anderen

  • Beispiel: Techniker

    • Priorität 1: defekte Maschinen reparieren
    • Priorität 2 oder niedriger: Wartung
  • Nutzung ähnlich wie simpy.Resource()

  • Ressource mit höchster Priorität anfordern

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Ressource mit niedrigerer Priorität anfordern

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Diskrete-Ereignis-Simulation mit Python

Methode: simpy.Container()

  • Nützlich zum Modellieren von Produktion/Verbrauch homogener, undifferenzierter Mengen

  • Kann kontinuierlich (z. B. Wasser) oder diskret (z. B. Äpfel) sein

Beispiel: Treibstoffvorräte an einer Tankstelle.

  • Autos senken den Vorrat, Tanklaster füllen nach
  • Container anlegen
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • In den Container/Tank ein- und auslagern

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Aktuelle Tankmenge abfragen

    tank_1.level
    
  • Gesamtkapazität abfragen

    tank_1.capacity
    
Diskrete-Ereignis-Simulation mit Python

Methode: simpy.Store()

  • Store erstellen

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Ähnlich wie simpy.Container(), speichert aber verschiedene Objekte

  • Im Gegensatz zur eher abstrakten „Menge“ in Containern

  • In den Store ein- und auslagern
yield store_1.put("item_1")
yield store_1.get()
  • Liste verfügbarer Items abrufen

    store_1.items
    
  • Store-Kapazität abrufen

    store_1.capacity
    
Diskrete-Ereignis-Simulation mit Python

Wie helfen SimPy-Ressourcen bei Entscheidungen?

Beispiel

  • Supermarkt mit 1 Kasse
  • Der Inhaber will wissen, ob sich mehr Kassen lohnen
  • Reduzieren mehr Kassen die Wartezeit?

Ist-Zustand: 1 Kasse

  • simpy.Resource(env, capacity=1)
...
Zeit: 23.7 Min | Kunde 30 > Fertig

Simulierte Szenarien: n Kassen

  • simpy.Resource(env, capacity=2)
...
Zeit: 13.2 Min | Kunde 30 > Fertig
  • simpy.Resource(env, capacity=3)
...
Zeit: 8.6 Min | Kunde 30 > Fertig
  • simpy.Resource(env, capacity=4)
...
Zeit: 8.6 Min | Kunde 30 > Fertig
Diskrete-Ereignis-Simulation mit Python

Lass uns üben!

Diskrete-Ereignis-Simulation mit Python

Preparing Video For Download...