\documentclass[a4paper,fontsize=14bp]{article}

\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}
%\setcounter{secnumdepth}{0}
\numerationTop

\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader

% номер, тема, предмет, ?а, кто
\makeReportTitle{лабораторной}{1}{Имитационное моделирование архитектурных решений}{Моделирование информационных процессов и систем}{а}{Кадырбаева А.Р.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель работы}
Целью работы является ознакомление с современными средствами имитационного моделирования архитектурных решений.

\textit{В связи с возникшими проблемами с установкой среды, указанной в методических материалах было выдано другое задание, с применением альтернативного инструментария.}

\subsection{Задача}
Промоделировать работу билетных касс. В кассы есть единая очередь, которую обслуживают две основные кассы. Если основные кассы не справляются с потоком покупателей, то открывается третья касса. Поток покупателей меняется в зависимости от времени суток и становится больше в выходные дни. Расписание потока покупателей приведено ниже.
\textbf{Рабочие дни:}
\begin{itemize}
\item [] 8:00–13:00 — десять человек в час;
\item [] 13:00–16:00 — пятнадцать человек в час;
\item [] 16:00–22:00 — двадцать человек в час.
\end{itemize}
\textbf{Выходные дни:}
\begin{itemize}
\item [] 9:00–12:00 — двадцать человек в час;
\item [] 12:00–21:00 — сорок человек в час.
\end{itemize}
Покупатели, время ожидания покупки у которых превысило час, уходят из касс, не купив билета. Время обслуживания одного покупателя в кассах меняется случайным образом от 2 до 15 минут и в среднем составляет 5 минут. Предусмотреть в модели учет купивших и некупивших билеты.
\subsection{Задача для самостоятельного решения}
\begin{enumerate}
\item Выявите узкие места в модели и предложите решение.
\item Творческий проект. Создайте модель массового обслуживания. Принимаются собственные инициативы. Если таковых нет, то обратитесь к преподавателю.
\end{enumerate}

\subsection{Этапы решения}
\begin{enumerate}
\item Задание логики работы модели:
  \begin{enumerate}[label=\asbuk*),ref=\asbuk*]
  \item создание модели;
  \item моделирование прихода покупателей;
  \item моделирование очереди покупателей;
  \item моделирование процесса покупки;
  \item моделирование ухода покупателей из касс.
  \end{enumerate}
\item Уточнение расписаний:
  \begin{enumerate}[label=\asbuk*),ref=\asbuk*]
  \item задание расписания прихода покупателей;
  \item задание расписания работы кассиров;
  \item задание расписания перерывов в работе кассиров;
  \item привязка расписания покупателей;
  \item привязка расписания работы кассиров;
  \item привязка расписания перерывов в работе кассиров.
  \end{enumerate}
\item Создание резервной кассы и ухода клиентов, чье ожидание покупки превысило час:
  \begin{enumerate}[label=\asbuk*),ref=\asbuk*]
  \item моделирование резервной кассы и ресурсов;
  \item организация ограничения времени ожидания в кассах;
  \item проверка работоспособности модели, добавление часов;
  \item организация ухода покупателей, не купивших билет.
  \end{enumerate}
\item Добавление динамических графиков в модель:
  \begin{enumerate}[label=\asbuk*),ref=\asbuk*]
  \item создание наборов данных по проданным и непроданным билетам;
  \item создание круговой диаграммы по покупателям;
  \item создание временн\'{о}го графика;
  \item проверка работоспособности модели.
  \end{enumerate}
\end{enumerate}
\section{Результаты проведенных опытов и проеланной работы}
\subsection{Создание модели}
\begin{figure}[H]
  \centering
  \includegraphics[width=16cm]{01-model-draft.png}
  \caption{Черновик созданной модели}
  \label{pic:model-draft}
\end{figure}

В среде моделирования была создана модель билетных касс (рис. \hrf{pic:model-draft}) с указанием единиц модельного времени - минутами. Из библиотеки моделирования процессов в рабочей области были созданы:
\begin{itemize}
\item Источник заявок (Source-\code{customer}) - блок моделирует появление заявок в модели. В нашем случае покупатели — это заявки. Начальное значение интенсивности заявок было установлено в 10 заявок в час (первый параметр из задания).
\item Очередь покупателей (Queue-\code{queue}) - блок имитирует накопление заявок в модели, фактически моделирует очередь. Был отмечен пункт «Максимальная вместимость», поскольку в задании ничего не сказано об ограничениях длины очереди.
\item Выбор кассы (SelectOutput) - блок осуществляет выбор очереди, поскольку покупатель может пройти на любую из (например, двух) касс. Пусть покупатель идет во вторую кассу, увидев, что в первой кассе собралось более трех человек. Если величина, возвращенная функцией \code{size()} объекта \code{booking1}, будет больше 3, то значит, что в эту кассу покупатель не пойдет \code{booking1.size() < 4}.
\item Ресурсы для обработки заявок (ResourcePool-\code{booking\_clerk}) - блок не связывается ни с каким блоком в модели, так как через него не должны проходить заявки. Поскольку кассиры могут передвигаться от кассы к кассе, тип ресурса был задан как «Движущийся», с указанием скорости в 2 км/ч. Также было указано количество кассиров: 2.
\item Модель обслуживания (Service-\code{booking1,2}) - блок Service, который включает в себя логику работы: захват ресурсов, удержание заявки и ресурсов, освобождение ресурсов.  Блокам была задана вместимость собственных очередей 2 и время задержки (задается функцией треугольного распределения со средним значением 5 минут, минимальным значением 2 минуты и максимальным значением 15 минут \code{triangular(2, 5, 15)}). В «Набор ресурсов» модели обслуживания  добавлен созданный ресурс \code{booking\_clerk}. Так в первой и во второй кассах будут работать указанные в ресурсах 2 кассира.
\item Уход покупателя (Sink-\code{exit}) - блок, завершающий исполнение заявки, соединён с выходами обеих касс.
\end{itemize}
В результате запуска моделирования поведения чернового варианта модели были получены значения, показанные на рис. \hrf{pic:model-launch}. Модель с ненастроенным расписанием показывает, что в результате обслуживания 303 покупателей кассиры в среднем были заняты 57\% времени, причём вторая касса использовалась только для 14 покупателей ($4,6(2046)\%$).
\begin{figure}[H]
  \centering
  \includegraphics[width=16cm]{01-model-launch.png}
  \caption{Черновик созданной модели}
  \label{pic:model-launch}
\end{figure}
\subsection{Уточнение расписаний}
К созданной модели были добавлены следующие компоненты:
\begin{itemize}
  \item Расписание прихода покупателей (\code{schedule\_customer}) - тип расписания «Интенсивность», дискретизация задана в часах, расписание составлено на неделю, поскольку в задании было сказано, что интенсивность меняется по будням и выходным дням, полное расписание представлено на рис. \hrf{pic:schedule-customer};
  \begin{figure}[H]
    \centering
    \begin{subfigure}[b]{0.45\textwidth}
      \centering
      \includegraphics[width=\textwidth]{01-schedule-customer.png}
      \caption{Расписание интенсивности покупателей}
      \label{pic:schedule-customer}
    \end{subfigure}
    \hfill
    \begin{subfigure}[b]{0.45\textwidth}
      \centering
      \includegraphics[width=\textwidth]{01-schedule-clerks-timeout.png}
      \caption{Расписание перерывов работы кассиров}
      \label{pic:sched-clerk-to}
    \end{subfigure}
    \caption{Расписания в модели}
    \label{pic:schedules}
  \end{figure}
  \item Расписание работы кассиров - установлено в значения 8:00 - 22:00, расписание перерывов в работе кассиров представлено на рис. \hrf{pic:sched-clerk-to}.
  \item Объект \code{customer} был изменён так, чтобы прибытие осуществлялось не согласно интенсивности, а по расписанию интенсивности;
  \item Объект \code{booking\_clerk} был изменён так, чтобы количество задавалось не константно, а по расписанию, также в раздел «Смены» было добавлено расписание перерывов;
\end{itemize}
\subsection{Создание резервной кассы и ухода клиентов, чье ожидание покупки превысило час}  
Для моделирования резервной кассы был использован аналогичный основным кассам блок service. Время обработки было задано чуть меньше, чем в основных кассах (\code{triangular(1, 3, 15)}). К резервной кассе был привязан дополнительный ресурс \code{reserved\_clerk}. Выход резервной кассы ведёт к объекту \code{exit}.

Согласно условиям задачи тайм-ауты в первой и второй кассе равны 30 минутам, а в третьей кассе — 20 минут. Выходы OutTimeout объектов \code{booking1} и \code{booking2} ведут на вход объекта \code{booking3}. Таким образом, покупатели, чье время ожидания в первой и второй кассах превысило 30 минут, идут в резервную кассу. Уход покупателей, не купивших билет, моделируется так же, как и уход покупателей, купивших билет, но в вхыод \code{without\_ticket}.

\section{Анализ полученных результатов и выводы}
Для сбора данных по количеству проданных билетов во время работы модели используется объект Набор данных. Поскольку нас интересует динамика продаж билетов, то по оси Х зададим модельное время. По оси Y будем сохранять количество покупателей, прошедших через выход (\code{exit.count()}). Данные в наборе обновляются каждые три минуты. Для сбора данных по количеству потерянных билетов \code{without\_ticket.count()} (считаем минимальные потери, то есть каждый ушедший покупатель мог купить один билет). Для удобства визуализации были созданы диаграммы (графики) и круговая диаграмма продаж и упущенных покупателей. На круговой диаграмме, видно конечный результат моделирования - финальное количество купленных билетов и упущенных покупателей.

В результате запуска модели были получены значения, представленные на рис. \hrf{pic:model-final}.
\begin{figure}[H]
  \centering
  \includegraphics[width=15cm]{01-model-final.png}
  \caption{Результат запуска модели}
  \label{pic:model-final}
\end{figure}

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

\section{Контрольные вопросы}
\begin{itemize}
\item \textbf{Выявите узкие места в модели и предложите решение.}
  \begin{enumerate}
  \item Очевидно, что система не удовлетворяет никаким реалистичным требованиям продаж, поскольку количество упущенных покупателей превышает количество проданных в $\approx 3$ раза. Одним из самых простых решений может быть открытие третьей кассы на постоянной основе.
  \item Модель не учитывает, что пользователи, стоящие в общей очереди, скорее всего, не будут в ней стоять после завершения работы касс, поэтому общую очередь следует обнулять в 22:01 каждого дня.
  \item Расписания, представленные на рис. \hrf{pic:schedules} в модели менять не целесообразно, поскольку рабочий день и статистика посещений касс вряд ли изменятся по желанию системного аналитика. В связи с чем необходимо изменить логику работы модели. А именно - условие перехода от одной кассы к другой. Так, если каждый покупатель будет отправляться на кассу, которая содержит меньше людей, это позволит более равномерно распределить общий поток.
  \end{enumerate}
\item \textbf{Творческий проект. Создайте модель массового обслуживания.}
  В индивидуальном задании реализована модель обслуживания интернет-магазина. В интернет-магазин с некоторой интенсивностью приходят заказы, несколько человек с разной скоростью могут обрабатывать заказы и отправлять их на доставку. Доставка осуществляется командой курьеров, по понятной причине, работающей медленнее, но у них больший по длительности рабочий день и скорость перемещения. В результате моделирования (рис. \hrf{pic:model-indi}) стало очевидно, что было потеряно $\approx8\%$ заказов. Также поверхностный анализ показывает, что более загруженное работой подразделение - это курьеры ($68\%$ против $21\%$ у сотрудников, обрабатывающих заказы). Более детально рассмотрев полученную статистику, можно увидеть, что отказы из-за задержек происходят в системе \textbf{только} на этапе доставки, то есть сотрудников склада целесообразно переквалифицировать в сотрудников доставки для снижения показателя потерь.
  \begin{figure}[h]
    \centering
    \includegraphics[height=15cm, angle=90]{01-modify-final.png}
    \caption{Моделирование работы интернет-магазина}
    \label{pic:model-indi}
  \end{figure}
\end{itemize}

\end{document}
