Balíček SimPy: Typy zdrojů

Diskrétní simulace událostí v Pythonu

Dr Diogo Costa

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

Dostupné typy zdrojů

  • SimPy poskytuje tři typy zdrojů:

  • resource

  • container
  • store
Diskrétní simulace událostí v Pythonu

Dostupné typy zdrojů

simpy.Resource()

  • Sdílení zdrojů mezi procesy
  • Příklad: stoly v restauraci

simpy.Container()

  • Zdroj pro sdílení homogenní hmoty mezi procesy
  • Množství může být diskrétní (např. jablka) nebo spojité (např. voda)
  • Příklad: vodní nádrž

simpy.Store()

  • Ukládání neomezeného množství objektů
  • Příklad: supermarket
Diskrétní simulace událostí v Pythonu

Metoda: simpy.Resource()

Vytvoření zdroje

resource_1 = simpy.Resource(env, capacity=8)
  • Používá se při omezené kapacitě zdroje (např. capacity=8)
  • Omezuje počet procesů přistupujících ke zdroji souběžně
  • Proces musí požádat o právo použití zdroje
    • Pokud jsou všechny zdroje obsazeny, požadavky se zařadí do fronty
  • Po uvolnění zdroje procesem se aktivují čekající požadavky

Vyžádání zdroje

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

# Make resource request yield request
# Once resource is avaiable yield env.timeout(event_duration)
Diskrétní simulace událostí v Pythonu

Zdroje: priority a přerušení

  • Varianta předchozího zdroje

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Některé procesy mohou mít přednost před jinými

  • Příklad: opravář

    • Priorita 1: oprava porouchaných strojů
    • Priorita 2 a nižší: údržba strojů
  • Použití podobné jako u simpy.Resource()

  • Vyžádání zdroje s nejvyšší prioritou

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Vyžádání zdroje s nižší prioritou

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Diskrétní simulace událostí v Pythonu

Metoda: simpy.Container()

  • Vhodné pro modelování výroby/spotřeby homogenní, nediferencované hmoty

  • Může být spojitá (jako voda) nebo diskrétní (jako jablka)

Příklad: Zásoby paliva na čerpací stanici.

  • Auta zásoby snižují, cisternová auta je doplňují
  • Vytvoření kontejneru
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Přidání a odebrání z kontejneru/nádrže

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Získání aktuálního množství v nádrži

    tank_1.level
    
  • Získání celkové kapacity nádrže

    tank_1.capacity
    
Diskrétní simulace událostí v Pythonu

Metoda: simpy.Store()

  • Vytvoření úložiště

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Podobné jako simpy.Container(), ale umožňuje ukládání různých objektů

  • Na rozdíl od abstraktního „množství" uloženého v kontejnerech

  • Přidání a odebrání z úložiště
yield store_1.put("item_1")
yield store_1.get()
  • Získání seznamu dostupných položek

    store_1.items
    
  • Získání kapacity úložiště

    store_1.capacity
    
Diskrétní simulace událostí v Pythonu

Jak mohou zdroje SimPy podporovat obchodní rozhodování?

Příklad

  • Supermarket s 1 pokladní
  • Majitel chce vědět, zda se vyplatí investovat do dalších pokladních
  • Sníží více pokladních čekací dobu?

Aktuální situace: 1 pokladní

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

Simulované scénáře: n pokladních

  • 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
Diskrétní simulace událostí v Pythonu

Pojďme si procvičit!

Diskrétní simulace událostí v Pythonu

Preparing Video For Download...