Моделирование тематического парка Понимание времени ожидания в очереди с помощью R

Моделирование тематического парка с помощью R

Моделирование тематического парка для понимания времени ожидания в очередях и изучения оптимизации бизнес-процессов на языке R.

Фото от Thomas Kelley на Unsplash

Длинные очереди всегда отталкивают, особенно когда вы ждете, чтобы покорить космос или плыть вдоль Великого Барьерного Рифа. Во время летних каникул я уверен, что почти все будут стоять в очередях куда-то, и, надеюсь, вам повезет и вы направляетесь прямо в Волшебное Королевство. Возможно, вы сейчас стоите в одной из этих очередей и читаете этот блог!

В коде приведены примеры для поддержки иллюстраций, но полный код можно найти на моем GitHub, ссылка на который приведена в конце статьи. В проекте используются R и пакет simmer для дискретного событийного моделирования. Приятного прочтения!

Обзор концепции — дискретное событийное моделирование

Что потребуется, чтобы смоделировать тематический парк на моем ноутбуке? И будет ли это что-то похожее на Центральную Станцию для Игр из “Разрушитель Ральфа”?

К сожалению, нет … написанный на языке R код будет использовать дискретное событийное моделирование, которое показывает, что может произойти в процессе со временем. Основное применение дискретного событийного моделирования состоит в оптимизации процессов, и поэтому оно широко используется в исследованиях операций. Моделирование позволяет принимающим решениям увидеть типичный процесс после многократных итераций и понять, как его можно улучшить. Например, добавление дополнительных машин на производственную линию может снизить узкие места в производстве продукта?

В этой статье будет применено дискретное событийное моделирование к гипотетическому Диснейленду. Эта версия парка будет немного проще и будет иметь некоторые дополнительные предположения, чтобы упростить моделирование.

Поскольку этот блог фокусируется больше на приложении, здесь будет много примеров кода, а не теории, но этот обзор концепции компонентов поможет нам войти в курс дела.

Компоненты

Для работы дискретного событийного моделирования необходимы некоторые основные компоненты. Каждый из них будет создан с помощью simmer, но давайте сначала рассмотрим их:

  • Траектория: Траектория – это путь, который гость пройдет во время моделирования. Например, когда гость прибывает, он может встать в очередь на аттракцион, проехать на нем, а затем уйти. Это будет его траектория.
  • Ресурс: Ресурс – это объект, используемый во время траектории. В приведенном выше примере, аттракцион будет ресурсом.
  • Генератор: Генератор – это элемент, который мы используем для генерации гостей, и генераторы обычно генерируют множество гостей в течение моделирования. Генератор также нуждается в траектории, чтобы знать, куда должны идти сгенерированные гости.
  • Окружение: Окружение – это место, где происходит всё моделирование, в нашем случае это сам Тематический Парк. Оно объединяет все наши ресурсы, генераторы и траектории. С помощью simmer есть дополнительное преимущество: окружение также отслеживает и отчетливо отображает использование наших ресурсов, что упрощает анализ моделирования.

После завершения обзора давайте начнем! Нижеприведенные моделирования строятся друг на друге и становятся все сложнее по мере продвижения. Для наглядности код не рефакторизован до последнего моделирования, в котором используются дополнительные функции и возможности языка R для упорядочивания моделирования.

Моделирование 1: Встреча с Лило и Стичем

Первое моделирование будет служить введением. В этом моделировании гости прибывают и начинают становиться в очередь, чтобы увидеть Лило и Стича. Перед написанием кода полезно рассмотреть компоненты:

  • Траектория: Прибытие в парк, становление в очередь, использование персонажа (Лило или Стич), освобождение персонажа и уход из парка.
  • Ресурс: Персонаж, с которым гости могут встретиться. Это может быть Лило или Стич, поэтому для этого ресурса установлена вместимость два гостя одновременно.
  • Генератор: Будет генерировать гостей, периодически прибывающих в парк.
  • Окружение: Сам парк.

Теперь давайте подумаем о коде для каждого из этих элементов. R позволяет нам использовать другие пакеты, такие как dplyr, чтобы организовать наш код. Это упрощает построение траектории:

Сначала гость захватывает символ, блокируя его от использования другими гостями. Затем он ждет с этим ресурсом. Во время ожидания гость не может выполнять другие действия. Время ожидания в большинстве симуляций основано на реальном процессе. Однако в этом вымышленном сценарии продолжительность времени ожидания выбирается из нормального распределения. Наконец, гость освобождает ресурс, и он может быть использован другим гостем в очереди.

Траектория является наиболее сложным концептом. Среда, ресурсы и генератор определяются вместе в одном блоке кода:

Этот набор компонентов снова очень простой. Важно отметить, что ресурс имеет вместимость два, в соответствии с спецификацией. Гости приходят в соответствии с экспоненциальной функцией и получают заданную выше траекторию. Приход гостей также обычно моделируется по реальному событию, но в данном примере экспоненциальная функция будет работать прекрасно!

Последний шаг – запуск симуляции и проведение анализа. Запуск симуляции так же прост, как ввод команды “run” и указание количества временных шагов для выполнения. В этом случае парк будет открыт 15 часов. Для анализа мы будем использовать simmer.plot – расширение библиотеки simmer, которое предоставляет простые визуализации:

Первый график ниже показывает использование ресурса. В этой симуляции наше использование составляет всего 20%. Этот процент представляет собой долю времени симуляции, когда ресурс был использован.

Изображение автора

Значение использования в 20% довольно низкое, и идеально было бы иметь более высокую загрузку, так как это означает больше довольных гостей! Следующая визуализация представляет время ожидания, при этом ни один гость не ждет более 5 временных шагов. Это логично, так как наше время ожидания ресурса основано на выборке из нормального распределения вокруг 5 шагов. Среднее время ожидания, однако, намного ниже и представлено голубой линией.

Изображение автора

Вторая симуляция: Встреча с Лило и Стичем с использованием быстрых проходов

Теперь давайте добавим немного сложности, начнем медленно. Симуляция останется такой же, как и выше. Однако мы добавим приоритетных клиентов. Они будут имитировать систему “FastPass” в парках Disney. На самом деле все, что мы делаем – это генерируем нового клиента с приоритетом:

Обратите внимание, что у этого клиента приоритет равен единице, в отличие от клиента по умолчанию, которому по умолчанию присваивается значение 0. Более высокое значение приоритета означает, что этот клиент пропустит очередь и прокатится раньше всех клиентов с более низким приоритетом. Еще одно дополнение заключается в том, что эти клиенты прибывают каждые 50 временных шагов. На самом деле они заранее забронировали проход на определенное равномерно распределенное время.

Изображение автора

Обратите внимание, что использование ресурса значительно увеличилось! Это связано с тем, что теперь гарантированно прибывает клиент, который обходит всех остальных клиентов с фиксированным интервалом. В то же время время ожидания увеличилось, что также логично, поскольку теперь есть не только больше гостей, но и больше гостей с FastPass, что увеличивает время ожидания для исходной группы.

Третья симуляция: Встреча с Лило и Стичем с отказом

Ожидание в очередях может быть раздражающим, и люди часто просто сдаются. Это можно учесть математически с помощью идеи отказа. Если клиент долго ждет в очереди, мы можем моделировать вероятность того, что он просто сдастся. Для этого необходимо внести изменения в траекторию:

Время, через которое клиент откажется, снова выбирается из нормального распределения, на этот раз вокруг значения 2 (обычно оно было бы оценено и было бы выше, но в этом примере мы имеем очень нетерпеливых клиентов, чтобы лучше понять отказ). Важно отменить отказ, как только гость получит ресурс. Гости не покидали бы очередь сразу после окончания периода ожидания!

Изображение автора

Этот отказ в конечном итоге снизил использование ресурсов, так как больше гостей уходят, следовательно, не используя ресурс. Однако он также сократил время ожидания, так как многие гости просто сдаются, поэтому их время ожидания не учитывается. Дополнительным эффектом ухода гостей является то, что другие гости испытывают более короткую очередь, что также снижает время ожидания. В остальной части симуляций мы увеличим время, необходимое гостям для отказа.

Симуляция четыре: поездка на горе Космос с одной тележкой, используя пакетирование

Теперь перейдем к интересному: аттракционам. Аттракционы в тематическом парке будут использовать функцию пакетирования в simmer. Пакетирование позволяет группировать гостей вместе в одну тележку Горы Космос, например:

Параметр n указывает, сколько гостей может быть в одной группе, поэтому в данном случае каждая тележка может вместить 6 гостей. Параметр timeout указывает, как долго пакет должен ждать, чтобы быть заполненным, прежде чем перейти к следующей части траектории. Таким образом, пакет может либо достичь своей вместимости в 6 гостей, либо пройти 10 временных шагов, прежде чем пакет займет тележку.

Изображение автора

С учетом добавленной сложности этого примера и необходимости группировки гостей или, по крайней мере, ожидания соответствующего времени перед уходом без полного пакета, использование ресурсов снижается. Эти условия также вызывают проблему времени ожидания, которое значительно варьируется по сравнению с временем ожидания персонажей. Гость может прибыть и сразу же уйти или же ему может потребоваться ждать целых 10 временных шагов, чтобы новый пакет ушел. Чтобы решить эту проблему в реальности, размер или количество тележек были бы увеличены.

Симуляция пять: Гора Космос или Гора Шлеп с разветвлением

Давайте сделаем все еще более реалистичным; никакой тематический парк не будет хорош без нескольких аттракционов. Добавив новый аттракцион, например, Гору Шлеп, мы можем моделировать предпочтения гостей и использовать разветвленные траектории, чтобы увидеть, на какой аттракцион они отправятся. Это немного сложнее, и в полном скрипте можно увидеть, что элементы аттракциона в траектории были добавлены в свои собственные функции. В данном случае приведена более краткая версия просто для демонстрации логики разветвления:

В указанном случае гости выбирают на основе подбрасывания монеты, поэтому одинаково вероятно, что гость выберет Гору Космос или Гору Шлеп. В более реальном приложении это можно моделировать на основе реальных предпочтений. Изменения в построении симуляции также происходят здесь:

В этом примере есть два отдельных ресурса. Это отличается от примеров с Лило и Стичем, где и Лило, и Стич были моделированы как ресурс “персонаж” с вместимостью два. Здесь же Гора Шлеп является отдельным ресурсом по сравнению с Горой Космос.

Изображение автора

Использование этих двух аттракционов очень различается, главным образом из-за разницы во времени поездки между двумя траекториями. Поездка на Горе Космос занимает больше времени, и гости более склонны отказываться. Добавленная сложность также привела к более разнообразному времени ожидания, однако с точки зрения оптимизации, мы успешно улучшили опыт гостей, сократив среднее время ожидания при открытии нового более быстрого аттракциона.

Симуляция шестая: Открытие парка с использованием расписаний и предпочтений очереди

В финальной симуляции мы объединяем все, что мы создали, и добавляем расписание в парк. До сих пор мы определяли пропускную способность ресурсов с использованием фиксированных значений. Существует альтернатива: использование расписаний. Расписания позволяют нам контролировать пропускную способность ресурса на основе временных интервалов.

График работы парка будет контролироваться воротами, которые открываются через 50 временных шагов и закрываются за 50 временных шагов до конца симуляции. Код ниже использует множество рефакторизованных функций, которые также связаны в репозитории GitHub ниже. График работы ворот является самым важным для рассмотрения:

На этот раз наш траектория объединяет аттракционы и персонажей. Были добавлены некоторые другие части кода, чтобы гости выбирали персонажей, которых они посещают по принципу “каждому по кругу”. Теперь генерируется больше гостей, так как есть больше делать.

Изображение автора

В этой симуляции реализовано более реалистичное распределение использования всех ресурсов. Есть больше вещей, которые могут делать посетители, поэтому каждый ресурс тратит меньше времени на использование. Также добавлено условие, что посетителям необходимо ждать, чтобы войти в парк. Обратите внимание, что ворота вызывают большое снижение использования, но сами по себе они используются мало, потому что посетители сразу же захватывают и освобождают их. Время ожидания также достигает пика здесь, поскольку гости ждут открытия парка, а затем аттракционов в парке, но это гораздо более реалистичная симуляция. Первая группа гостей выпускается в парк, чтобы выбрать, на что им хочется покататься и кого они хотят встретить, сразу после открытия ворот.

Заключение и окончательные мысли

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

Некоторые принятые решения в процессе, например, добавление большего количества аттракционов, показали, как ДСМ может использоваться для оптимизации процессов. С другой стороны, добавление более сложного поведения, например, отказа, показало, как ресурсы могут быть недостаточно использованы, если они не настроены правильно.

Надеюсь, вам понравилась эта статья! Если да, пожалуйста, подумайте о подписке на мою страницу для получения больше контента по науке о данных.

Ресурсы

Код:

GitHub – josephlewisjgl/DESR: Репозиторий, содержащий код из блог-поста “Симуляция тематического парка…”

Репозиторий, содержащий код из блог-поста “Симуляция тематического парка: Понимание времени ожидания в очереди с помощью R.” – GitHub …

github.com

Документация по Simmer:

6.1 Заправочная станция для пончиков | Симуляция и моделирование для понимания изменений

Это лекционные заметки для модуля “Симуляция и моделирование для понимания изменений”, проводимого в Школе человека…

bookdown.org