Пакет 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)
  • Обмежує кількість процесів, що одночасно отримують доступ до ресурсу
  • Процес має надіслати запит на право користування ресурсом
    • Якщо всі ресурси зайняті, запити ставляться в чергу
  • Коли процеси звільняють ресурс, очікувані запити активуються

Запит ресурсу

# Відкрити запит ресурсу
with resource_1.request() as request:

# Надіслати запит на ресурс yield request
# Коли ресурс стане доступним 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)
...
час: 23.7 хв | Покупець 30 > Завершено

Змодельовані сценарії: n касирів

  • simpy.Resource(env, capacity=2)
...
час: 13.2 хв | Покупець 30 > Завершено
  • simpy.Resource(env, capacity=3)
...
час: 8.6 хв | Покупець 30 > Завершено
  • simpy.Resource(env, capacity=4)
...
час: 8.6 хв | Покупець 30 > Завершено
Дискретно-подієве моделювання в Python

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

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

Preparing Video For Download...