Пакет SimPy: типы ресурсов

Дискретно-событийное моделирование на Python

Dr Diogo Costa

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

Доступные типы ресурсов

  • SimPy предоставляет три типа ресурсов:

  • resource

  • container
  • store
Дискретно-событийное моделирование на Python

Доступные типы ресурсов

simpy.Resource()

  • Совместное использование ресурсов между процессами
  • Пример: столики в ресторане

simpy.Container()

  • Ресурс для обмена однородным веществом между процессами
  • Количество может быть дискретным (например, яблоки) или непрерывным (например, вода)
  • Пример: водохранилище

simpy.Store()

  • Хранение неограниченного количества объектов
  • Пример: супермаркет
Дискретно-событийное моделирование на Python

Метод: simpy.Resource()

Создание ресурса

resource_1 = simpy.Resource(env, capacity=8)
  • Используется при ограниченной ёмкости ресурса (например, capacity=8)
  • Ограничивает количество процессов, одновременно использующих ресурс
  • Процесс должен запросить право на использование ресурса
    • Если все ресурсы заняты, запросы ставятся в очередь
  • Когда процесс освобождает ресурс, ожидающие запросы активируются

Запрос ресурса

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

# Make resource request yield request
# Once resource is avaiable yield env.timeout(event_duration)
Дискретно-событийное моделирование на Python

Ресурсы: приоритеты и вытеснение

  • Вариант предыдущего ресурса

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Некоторые процессы могут иметь приоритет над другими

  • Пример: ремонтник

    • Приоритет 1: ремонт сломанных машин
    • Приоритет 2 и ниже: техническое обслуживание
  • Использование аналогично simpy.Resource()

  • Запрос ресурса с наивысшим приоритетом

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Запрос ресурса с более низким приоритетом

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Дискретно-событийное моделирование на Python

Метод: simpy.Container()

  • Удобен для моделирования производства/потребления однородного сырья

  • Может быть непрерывным (как вода) или дискретным (как яблоки)

Пример: Запасы топлива на автозаправочной станции.

  • Автомобили расходуют топливо, бензовозы пополняют его
  • Создание контейнера
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Добавление и извлечение из контейнера/резервуара

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Текущее количество в резервуаре

    tank_1.level
    
  • Общая ёмкость резервуара

    tank_1.capacity
    
Дискретно-событийное моделирование на Python

Метод: simpy.Store()

  • Создание хранилища

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Аналогично simpy.Container(), но позволяет хранить разные объекты

  • В отличие от абстрактного «количества» в контейнерах

  • Добавление и извлечение из хранилища
yield store_1.put("item_1")
yield store_1.get()
  • Список доступных объектов

    store_1.items
    
  • Ёмкость хранилища

    store_1.capacity
    
Дискретно-событийное моделирование на Python

Как ресурсы SimPy помогают принимать бизнес-решения?

Пример

  • Супермаркет с 1 кассиром
  • Владелец хочет понять, стоит ли нанимать больше кассиров
  • Сократит ли время ожидания увеличение числа кассиров?

Текущая ситуация: 1 кассир

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

Смоделированные сценарии: n кассиров

  • 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
Дискретно-событийное моделирование на Python

Давайте потренируемся!

Дискретно-событийное моделирование на Python

Preparing Video For Download...