НачатьНачать бесплатно

Модель ресторана: управление столиками и временем ожидания

Представьте, что вы открываете ресторан в популярном районе Сан-Франциско. Правильно определить количество столиков и пропускную способность кухни крайне важно: от этого зависит, сколько посетителей удастся обслужить и насколько оправданными окажутся первоначальные вложения и текущие расходы. Модель дискретно-событийного моделирования поможет принять это инвестиционное решение: она симулирует уровень занятости столиков, время ожидания клиентов и количество посетителей, покинувших очередь из-за слишком долгого ожидания.

Для начала определим генератор, который моделирует запросы на столик и решения клиентов — ждать или уйти — в зависимости от времени ожидания. В следующем упражнении вы настроите модель, запустите её и проанализируете результаты. Время в модели измеряется в минутах.

Это упражнение является частью курса

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

Посмотреть курс

Инструкции к упражнению

  • Откройте запрос на столик как req, когда клиент приходит в ресторан.
  • Используйте оператор побитового ИЛИ, чтобы ждать, пока не освободится столик (req) или пока не закончится терпение клиента (env.timeout(patience)).
  • Передайте управление на время, в течение которого столик занят клиентом; оно задаётся переменной time_at_tables.

Интерактивное практическое упражнение

Попробуйте выполнить это упражнение, дополнив этот пример кода.

def customer(env, name, tables):

  global customers_served, customers_quiting_waiting
  arrive = env.now

  # Request a table
  with tables.request() as ____:
    patience = random.uniform(MIN_PATIENCE, MAX_PATIENCE)

    # Wait until a table is free or the customer runs out of patience
    results = yield ____ | ____
    wait = env.now - arrive

    if req in results:

      print(f"{env.now:7.4f} {name} > Waited {wait:6.3f} minutes for a table!")
      time_at_tables = random.uniform(MIN_SEATING_TIME, MAX_SEATING_TIME)

      # Yield the time the table is occupied by the customer
      ____ env.timeout(time_at_tables)
      print(f"{env.now:7.4f} {name} > Finished meal :)")
      costumers_served += 1

    else:
      print(f"{env.now:7.4f} {name} > Gave up waiting and left after waiting {wait:7.4f} minutes :(")
      customers_quiting_waiting += 1
Редактировать и запускать код