Подготовка пространственных узлов
Переходим к третьей фазе создания модели. Нам нужно добавить еще один
прямоугольный узел (Rectangular Node) и три
точечных узла (Point Node), реализующих следующую логику:
• Верхний точечный узел — место, куда по конвейеру прибывает корпус стиральной машины.
• Нижний точечный узел — место, откуда на сборку поступает дверца.
• Третий точечный узел — место, где робот собирает готовое изделие из корпуса и дверцы.
Эти узлы и один прямоугольный мы сейчас создадим.
Прямоугольный узел будет называться
ShapeDoorStorage. Точечные узлы получили осмысленные имена:
NodeBody,
NodeDoor,
NodeFinal.
Создание агентов
Теперь создадим трех
агентов (Agent).
1.
Агент Body. В библиотеке моделирования процессов выбираем «Тип агента», называем его
Body (корпус стиральной машины). Анимацию по умолчанию не задаем, создадим ее позже. В открывшемся холсте агента из палитры «Презентация» берем
прямоугольник (Rectangle). Настраиваем его: размер 10 на 10 пикселей, координаты центра (–5, –5). Это соответствует половине метра в масштабе модели.
2.
Агент Door. Создаем агента
Door (дверца) без анимации. В его холсте рисуем овал (Oval) серого цвета, радиусом 3, с центром в (0, 0).
3.
Агент Product. Создаем агента
Product (готовое изделие). В его холст копируем прямоугольник из Body и овал из Door. Накладываем овал на прямоугольник, чтобы получилось изображение стиральной машины с дверцей.
Возвращаемся на основной холст
Main. В элементе
Source, который генерирует корпуса, в свойстве «Новый агент» указываем созданный нами тип
Body. Теперь при запуске по конвейеру движутся объекты нужного нам вида.
Копируем первые два элемента (Source и Queue) для создания потока дверец. Переименовываем их в
SourceDoors и
DoorStorage.
SourceDoors генерирует агентов типа
Door, а
DoorStorage связан с узлом
ShapeDoorStorage.
Моделирование процесса сборки
Добавляем блок
Assembler (сборка) из библиотеки моделирования процессов. Помещаем его после конвейера корпусов, перед блоком уничтожения
Sink. Автоматически восстановится связь. Соединяем хранилище
DoorStorage с
Assembler.
Блок Assembler собирает несколько типов агентов в один новый. В его настройках:
•
Новый агент — выбираем
Product.
•
Количество элементов: для типа Body — 1, для Door — 1. (Для более сложной сборки значения можно изменить).
•
Время задержки — задаем константу
1 минута. Робот выполняет операцию всегда одинаково, поэтому вероятностное распределение не требуется.
Настраиваем анимацию блока сборки в разделе «Анимация»:
• Место агента — узел
NodeFinal.
• Место агента из очереди 1 —
NodeBody.
• Место агента из очереди 2 —
NodeDoor.
Теперь модель можно запустить: генерируются корпуса и дверцы, робот забирает их с соответствующих узлов и через минуту выдает готовую стиральную машину.
Расширение модели: конвейер упаковки и погрузка
Переходим к четвертой фазе. Рисуем новый
путь (Path) для конвейера упаковки, называем его
MoveToPacking. Создаем точечный узел
PrePack и прямоугольный узел
ShapeWorkers. Добавляем две зоны в виде прямоугольных узлов:
ShapeLoading (отгрузка) и многоугольный узел
ShapePacking (зона упаковки).
Копируем элемент
Конвейер и вставляем его после
Assembler. Переименовываем в
MoveToPacking. В его настройках выбираем путь
MoveToPacking, а место агента — узел
ShapePacking.
Теперь нужно создать эффект упаковки. Вместо создания нового агента мы будем управлять видимостью графического элемента. В холсте агента
Product добавляем изображение коробки из палитры «Картинки». Уменьшаем коробку до подходящего размера, устанавливаем ее имя
box и свойство
Видимость (Visible) в значение
нет (false).
Добавляем после конвейера
MoveToPacking блок
Service (обслуживание) и называем его
Packing. Настройки блока:
• Вместимость очереди: 1.
• Время задержки: треугольное распределение (Triangular) от 0.5 до 1.5 минут, с наиболее вероятным значением 1 минута.
• Место агентов очереди: ShapePrePack.
• Место агента: ShapePacking.
• Действие при выходе (On exit): программный код, делающий коробку видимой.
java
agent.box.setVisible(true);
Таким образом, после завершения операции упаковки вокруг стиральной машины появляется коробка.
После
Packing размещаем блок
Batch (группировка). Называем его
LoadOnTruck. Настройки:
• Место агентов: ShapeLoading.
• Размер партии: 10.
Этот блок будет накапливать по 10 упакованных машин и отправлять их на отгрузку.
Ресурсы, расписания и отказы
Добавим в модель ресурсы и график работы. Переносим на холст элемент
Расписание (Schedule) из библиотеки агентного моделирования. Задаем тип расписания
целое (integer) и настраиваем рабочее время: с понедельника по пятницу, с 9:00 до 13:00 и с 14:00 до 18:00.
В свойствах симуляции устанавливаем время начала моделирования на
9:00.
Теперь настраиваем источники
SourceDoors и
SourceBodies так, чтобы поставки зависели от расписания. В свойстве «Интенсивность прибытий» выбираем
Согласно расписанию интенсивностей и указываем наше расписание. Значение интенсивности равно 1. Когда завод не работает, интенсивность равна 0.
Создаем два
Ресурсных пула (Resource Pool):
1.
Robot. Тип ресурса:
статический. Количество: 1. В разделе «Аварии и ремонты» ставим галочку, настраиваем время до отказа и время ремонта, переведя единицы измерения в минуты. Тип ремонта — «Задержка».
2.
Workers. Тип ресурса:
динамический. Количество ресурсов: 2. Базовое местоположение:
ShapeWorkers.
Привязываем ресурсы к операциям:
• В блоке
Assembler в наборе ресурсов выбираем
Robot.
• В блоке
Packing в наборе ресурсов выбираем
Workers.
Сбор статистики и анализ модели
Добавим столбчатую диаграмму из палитры «Статистика» для мониторинга модели. Настроим ее:
• Период обновления: 1 минута.
• Заголовок: Workers Utilization.
• Данные: свойство Workers.utilization(), которое возвращает текущий уровень утилизации пула рабочих.
Запускаем модель. Мы видим движение заготовок, сборку, упаковку и отгрузку партиями. Диаграмма в реальном времени показывает загрузку рабочих. В выходные и во время обеда утилизация падает до нуля. Можно ускорить модельное время для наблюдения за динамикой на длительном промежутке.
Суть дискретно-событийного подхода
Построенная модель демонстрирует ключевые особенности дискретно-событийного подхода. Весь производственный процесс описывается как последовательность
событий (Events), происходящих в блоках. Для каждого блока задается время операции (константное или по распределению). Система автоматически выстраивает эти события на временной шкале, не требуя расчетов для каждого такта времени.
Такой подход позволяет:
• Детально описать процесс, вплоть до мельчайших операций.
• Использовать ресурсы, расписания и отказы.
• Собирать агентов в новые объекты.
• Анализировать процесс как с анимацией, так и без нее.
В отличие от системной динамики, которая работает с непрерывными тактами времени и усредненными потоками, дискретно-событийное моделирование переходит от события к событию, что делает его идеальным для детализированного описания производственных и логистических цепочек. После замены параметров по умолчанию на реальные данные модель становится инструментом для анализа узких мест, расчета утилизации и принятия административных решений.
Краткие итоги
Практическое руководство раскрывает логику построения производственной имитационной модели как последовательности двух взаимосвязанных процессов: материального потока и управления ресурсами. Начальный этап — это пространственная декомпозиция цеха. Абстрактные узлы и пути формируют топологию, по которой впоследствии будут перемещаться агенты. Такой подход позволяет отделить физическую планировку от алгоритмической логики, делая модель гибкой к изменениям планировки.
Создание агентов демонстрирует принцип композиции: сложный объект «изделие» собирается из простых геометрических примитивов, а его состояние изменяется не путем создания нового агента, а через управление свойствами существующего. Прием с переключением видимости коробки — это эффективный способ моделирования операций, которые меняют не сущность объекта, а лишь его внешний атрибут.
Ядро модели, блок Assembler, иллюстрирует ключевую концепцию дискретно-событийного подхода — синхронизацию нескольких асинхронных потоков в одной точке. Робот выступает здесь как статический ресурс, «захватывающий» агентов из разных очередей и удерживающий их в течение заданного времени. Переход от вероятностного времени операции к константному подчеркивает важность соответствия параметров физической природе исполнителя.
Интеграция расписания и ресурсных пулов переводит модель с уровня простой цепочки блоков на уровень системы с operational calendar. Привязка интенсивности поставок к расписанию гарантирует логическую целостность: остановка обработки автоматически прекращает подачу материалов. Это предотвращает бесконечный рост очередей, который был бы нереалистичным в реальных условиях.
Практическая ценность подхода раскрывается в момент добавления статистики. Утилизация ресурса перестает быть абстрактным числом и становится инструментом для выявления простоев, вызванных расписанием или узкими местами. Модель доказывает, что высокая детализация не требует усложнения вычислительного ядра: дискретно-событийный движок сам выстраивает последовательность событий, не расходуя ресурсы на просчет «пустых» промежутков времени.
1. Пространственная разметка узлами и путями задает топологию перемещения агентов, отделяя физическую планировку от логики процесса.
2. Агенты создаются как композиция графических примитивов; их визуальная сложность не влияет на вычислительную производительность.
3. Свойство Visible графического элемента позволяет имитировать изменение состояния объекта (например, упаковку) без создания нового типа агента.
4. Блок Assembler синхронизирует несколько входящих потоков, изымая агентов разных типов из соответствующих очередей.
5. При настройке времени операции тип распределения должен отражать природу исполнителя: робот выполняет работу за фиксированное, а не случайное время.
6. Привязка источника поставок к расписанию интенсивностей обеспечивает согласованность: с остановкой цеха прекращается подача материалов.
7. Статический ресурс (робот) привязан к месту, динамический (рабочие) требует указания базового местоположения в пространстве модели.
8. Раздел «Аварии и ремонты» в свойствах ресурсного пула позволяет внести в модель случайные отказы оборудования с настраиваемым временем восстановления.
9. Код в действиях блока (например, agent.box.setVisible(true)) открывает доступ к свойствам вложенных объектов агента, расширяя логику процесса.
10. Метод utilization() ресурсного пула возвращает долю занятости, что является ключевым показателем для анализа сбалансированности линии.
11. Дискретно-событийный подход оперирует переходами между блоками, не требуя вычислений для каждого такта времени в отличие от системной динамики.
12. Полученная модель позволяет анализировать производство и вырабатывать административные решения после замены параметров по умолчанию на реальные данные.
1. Какую роль в модели выполняют точечные и прямоугольные узлы?
2. Каким образом в агенте Product была достигнута визуализация дверцы на корпусе?
3. Почему для анимации операции упаковки был использован прием с переключением видимости, а не создание нового агента?
4. В чем отличие настройки блока Assembler от блока Service с точки зрения обработки входящих агентов?
5. Как привязка к расписанию интенсивностей в блоке Source предотвращает нереалистичное поведение модели в нерабочее время?
6. Чем определяется выбор между статическим (Robot) и динамическим (Workers) типом ресурса?
7. Какую информацию предоставляет метод utilization() ресурсного пула и для чего он используется?
8. Почему для робота-сборщика было задано константное время задержки, а для упаковщика — треугольное распределение?
9. Каким образом блок Batch имитирует отгрузку готовой продукции?
10. В чем заключается ключевое преимущество дискретно-событийного подхода перед системной динамикой при моделировании производственных процессов?
11. Как изменение свойства «Размер партии» в блоке Batch повлияет на поведение модели?
12. Для чего в свойствах симуляции была установлена дата начала, совпадающая с началом рабочего дня по расписанию?