\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}