Пакет SimPy: керування плануванням подій

Дискретно-подієве моделювання в Python

Dr Diogo Costa

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

Керування настанням подій

  • На перебіг подій у реальних задачах впливають різні ситуації.

  • Найтиповіші випадки:

    • умовні події
    • переривання подій
    • очікування процесів

Ці ситуації можна змоделювати в дискретно-подійному SimPy.

Дискретно-подієве моделювання в Python

Умовні події

  • Деякі події залежать від настання інших подій
  • Вони запускаються лише за виконання умови

Приклад

  • Клієнти приходять у крамницю одягу

    def customer_arrivals(env, shop)
    
  • Шукають конкретний товар

    env.timeout(search_time)
    
  • Купують лише якщо є в наявності
if shop.available[item]:

Генератор: об'єднуємо весь код

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))
Дискретно-подієве моделювання в Python

Переривання подій

Деякі події можуть перериватись через:

  • події вищого пріоритету
  • добровільне переривання (наприклад, заряджання авто)
  • вимушене переривання (наприклад, поломка машини)

Метод

simpy_process_1.interrupt()

Приклад

Машина періодично ламається й перериває конвеєр.

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()
Дискретно-подієве моделювання в Python

Очікування процесів

  • Деяким процесам доводиться чекати завершення інших
  • Часто це через обмежені ресурси
  • Приклад: спільні ресурси з capacity=5:
    simpy.Resource(env, capacity=5)
    
  • Отже, процес може чекати, якщо всі ресурси зайняті

Приклад: Запаси пального на АЗС потрібно регулярно поповнювати

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)
Дискретно-подієве моделювання в Python

Об'єднання подій побітовими операторами

Побітові оператори

  • Виконують побітові обчислення над цілими числами
  • Очікують два операнди
    • Приклад: a & b, a >> b, a ^ b

У SimPy

  • Формують умовну подію
  • Між 2 подіями

Доречні побітові оператори в SimPy

  • Чекати на обидва процеси: __and__() або &
  • Чекати на будь-який процес: __or__() або |
Дискретно-подієве моделювання в Python

Об'єднання подій побітовими операторами

Приклад: Глядач чекає в черзі до каси, доки не настане його/її черга або фільм не розпродадуть

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
Дискретно-подієве моделювання в Python

Давайте потренуємось!

Дискретно-подієве моделювання в Python

Preparing Video For Download...