SimPy: Zarządzanie harmonogramem zdarzeń

Symulacja zdarzeń dyskretnych w Pythonie

Dr Diogo Costa

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

Zarządzanie wystąpieniami zdarzeń

  • Wystąpienie zdarzeń w rzeczywistych problemach może zależeć od wielu czynników.

  • Najczęstsze sytuacje obejmują:

    • zdarzenia warunkowe
    • przerwanie zdarzeń
    • oczekiwanie na procesy

Sytuacje te można odwzorować w modelu dyskretno-zdarzeniowym SimPy.

Symulacja zdarzeń dyskretnych w Pythonie

Zdarzenia warunkowe

  • Pewne zdarzenia zależą od wystąpienia innych zdarzeń
  • Są wyzwalane tylko wtedy, gdy spełniony jest warunek

Przykład

  • Klienci przychodzą do sklepu odzieżowego

    def customer_arrivals(env, shop)
    
  • Szuka określonego artykułu

    env.timeout(search_time)
    
  • Kupuje go tylko, jeśli jest dostępny
if shop.available[item]:

Generator: połączenie całego kodu

def customer_arrivals(env, shop):

while True: yield env.timeout(search_time)
# Only buy item if available if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Symulacja zdarzeń dyskretnych w Pythonie

Przerywanie zdarzeń

Pewne zdarzenia mogą być przerwane z powodu:

  • Zdarzeń o wyższym priorytecie
  • Dobrowolnego przerwania (np. ładowanie samochodu)
  • Wymuszonego przerwania (np. awaria maszyny)

Metoda

simpy_process_1.interrupt()

Przykład

Maszyna ulega awarii okresowo, przerywając linię produkcyjną.

def break_machine(env):

# Break machine every now and then. while True: # Time between machine fails yield env.timeout(fail_time())
# Machine fail: interrupt process simpy_process_1.interrupt()
Symulacja zdarzeń dyskretnych w Pythonie

Oczekiwanie na procesy

  • Niektóre procesy muszą czekać na zakończenie innych
  • Wynika to często z ograniczonej dostępności zasobów
  • Przykład: zasób współdzielony z capacity=5:
    simpy.Resource(env, capacity=5)
    
  • Proces może więc czekać, jeśli wszystkie zasoby są zajęte

Przykład: Rezerwy paliwa na stacji benzynowej wymagają regularnego uzupełniania

with gas_station.request() as request:

# Request one of the gas pumps yield request
# Once pump is available: pump fuel liters_request = 10 yield fuel_reserve.get(liters_request) # The "actual" refueling takes time refuel_duration = liters_request / refuel_speed
yield env.timeout(refuel_duration)
Symulacja zdarzeń dyskretnych w Pythonie

Łączenie zdarzeń operatorami bitowymi

Operatory bitowe

  • Wykonują obliczenia bitowe na liczbach całkowitych
  • Wymagają dwóch operandów
    • Przykład: a & b, a >> b, a ^ b

W SimPy

  • Generuje zdarzenie warunkowe
  • Między dwoma zdarzeniami

Istotne operatory bitowe w SimPy

  • Oczekuje na oba procesy: __and__() lub &
  • Oczekuje na jeden z procesów: __or__() lub |
Symulacja zdarzeń dyskretnych w Pythonie

Łączenie zdarzeń operatorami bitowymi

Przykład: Kinoman czeka w kolejce do kasy, aż nadejdzie jego kolej lub film wyprzeda się

with counter.request() as my_turn:

# Wait until turn or movie is sold out result = yield my_turn | counter.sold_out[movie]
# If tickets available if my_turn in result: theater.num_moviegoers[movie] += 1 return
# If tickets sold out if my_turn not in result: theater.num_renegers[movie] += 1 return
Symulacja zdarzeń dyskretnych w Pythonie

Czas na ćwiczenia!

Symulacja zdarzeń dyskretnych w Pythonie

Preparing Video For Download...