Pakiet SimPy: typy zasobów

Symulacja zdarzeń dyskretnych w Pythonie

Dr Diogo Costa

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

Dostępne typy zasobów

  • SimPy udostępnia trzy typy zasobów:

  • resource

  • container
  • store
Symulacja zdarzeń dyskretnych w Pythonie

Dostępne typy zasobów

simpy.Resource()

  • Współdzielenie zasobów między procesami
  • Przykład: stoliki w restauracji

simpy.Container()

  • Zasób do współdzielenia jednorodnej materii między procesami
  • Ilości mogą być dyskretne (np. jabłka) lub ciągłe (np. woda)
  • Przykład: zbiornik wodny

simpy.Store()

  • Przechowywanie potencjalnie nieograniczonej liczby obiektów
  • Przykład: supermarket
Symulacja zdarzeń dyskretnych w Pythonie

Metoda: simpy.Resource()

Tworzenie zasobu

resource_1 = simpy.Resource(env, capacity=8)
  • Stosowane przy ograniczonej pojemności zasobu (np. capacity=8)
  • Ogranicza liczbę procesów korzystających z zasobu jednocześnie
  • Proces musi zażądać prawa dostępu do zasobu
    • Jeśli wszystkie zasoby są zajęte, żądania są kolejkowane
  • Po zwolnieniu zasobu oczekujące żądania zostaną aktywowane

Żądanie zasobu

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

# Make resource request yield request
# Once resource is avaiable yield env.timeout(event_duration)
Symulacja zdarzeń dyskretnych w Pythonie

Zasoby: priorytety i wywłaszczanie

  • Wariant poprzedniego zasobu

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Niektóre procesy mogą mieć pierwszeństwo przed innymi

  • Przykład: technik naprawczy

    • Priorytet 1: naprawa uszkodzonych maszyn
    • Priorytet 2 lub niższy: konserwacja maszyn
  • Użycie podobne do simpy.Resource()

  • Żądanie zasobu z najwyższym priorytetem

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Żądanie zasobu z niższym priorytetem

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Symulacja zdarzeń dyskretnych w Pythonie

Metoda: simpy.Container()

  • Przydatne do modelowania produkcji/konsumpcji jednorodnych, nierozróżnialnych zasobów masowych

  • Mogą być ciągłe (jak woda) lub dyskretne (jak jabłka)

Przykład: Rezerwy paliwa na stacji benzynowej.

  • Samochody zmniejszają rezerwy, ciężarówki uzupełniają
  • Tworzenie kontenera
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Dodawanie i pobieranie z kontenera/zbiornika

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Bieżąca ilość w zbiorniku

    tank_1.level
    
  • Całkowita pojemność zbiornika

    tank_1.capacity
    
Symulacja zdarzeń dyskretnych w Pythonie

Metoda: simpy.Store()

  • Tworzenie magazynu

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Podobne do simpy.Container(), ale umożliwia przechowywanie różnych obiektów

  • W przeciwieństwie do abstrakcyjnej „ilości" w kontenerach

  • Dodawanie i pobieranie z magazynu
yield store_1.put("item_1")
yield store_1.get()
  • Lista dostępnych elementów

    store_1.items
    
  • Pojemność magazynu

    store_1.capacity
    
Symulacja zdarzeń dyskretnych w Pythonie

Jak zasoby SimPy wspierają decyzje biznesowe?

Przykład

  • Supermarket z 1 kasjerem
  • Właściciel zastanawia się, czy opłaca się zatrudnić więcej kasjerów
  • Czy więcej kasjerów skróci czas oczekiwania?

Obecna sytuacja: 1 kasjer

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

Symulowane scenariusze: n kasjerów

  • 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
Symulacja zdarzeń dyskretnych w Pythonie

Czas na ćwiczenia!

Symulacja zdarzeń dyskretnych w Pythonie

Preparing Video For Download...