Пакет 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

  • Генерирует условное событие
  • Между двумя событиями

Релевантные побитовые операторы для 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...