
factory_layout.png
Ранее мы обзорно рассмотрели три метода имитационного моделирования, подробно остановившись на
дискретно-событийном подходе. Сейчас мы приступаем к созданию первой модели в рамках именно этого подхода. Наш пример —
модель завода.
Она представляет собой
конвейер заводского цеха, который производит стиральные машины. Вместо них мог быть любой продукт — это не имеет значения. Моделируемый цех выполняет финальную стадию производства: собирает стиральную машину из двух частей —
корпуса и
дверцы.
После сборки происходит еще ряд событий:
•
Робот собирает машину, присоединяя дверцу к корпусу.
• Собранная машина транспортируется
конвейером в зону упаковки.
•
Рабочие упаковывают машину в коробку.
• Каждая 10-я упакованная машина формирует
партию, которую забирает
грузовик.
В отличие от системной динамики, где мы оперировали бы усредненной «интенсивностью производства», дискретно-событийный подход работает на самом низком уровне абстракции. Мы получаем полную детализацию процесса сборки, упаковки и отгрузки каждой конкретной единицы продукта.
Вот схема конвейера:
1. Из
зоны хранения корпуса двигаются к месту сборки.
2. Туда же, но отдельно, подаются
дверцы.
3. Собранная машина отправляется в зону упаковки, а затем — в
зону погрузки.
4. Грузовик забирает партию из зоны погрузки.
В процессе задействовано два типа ресурсов:
робот для сборки и
персонал для упаковки.
Также у нас есть три типа заявок (
агентов), которые перемещаются по процессу:
1.
Корпус
2.
Дверца
3.
Собранная стиральная машина
Первые два процесса идут независимо. Затем они соединяются в блоке
сборки (Assembler). После этого движение продолжает уже один объединенный агент — собранная машина.
Этап 1. Создание базовой модели и интерфейса
Начнем с моделирования поступления корпусов на конвейер.
Создаем новую модель. В стартовом окне задаем:
•
Имя модели: Factory
•
Единица модельного времени: минуты
После создания открывается рабочее пространство главного агента
Main. Это основная среда, где будет существовать вся модель. В папку проекта добавляем заранее подготовленный рисунок завода.
В
палитре элементов нас интересует библиотека
«Моделирование процессов» (Process Modeling Library), созданная для поддержки дискретно-событийного подхода. Также в нашем распоряжении есть множество других библиотек, включая
«Разметку пространства» (Space Markup).
Рассмотрим интерфейс. У нас есть:
• Проект (Project): содержит Main, эксперимент Simulation и файлы ресурсов.
• Эксперимент (Simulation): здесь настраивается тип эксперимента (простой, Монте-Карло, анализ чувствительности и др.), выделяемая память, модельное время (виртуальное или реальное) и генератор случайных чисел (для воспроизводимости стохастических прогонов).
• Main: рабочее поле с сеткой. По умолчанию здесь уже есть
масштабная линейка (Scale) и элемент
Connections (инструмент для обмена сообщениями между агентами, в этой модели не понадобится).
Настраиваем масштаб: 20 маленьких клеток сетки соответствуют 10 метрам. Следовательно, каждая маленькая клетка — это 0,5 метра.
Этап 2. Построение первого процесса
Из библиотеки «Моделирование процессов» перетаскиваем на поле Main блоки и сразу их переименовываем для ясности. Собираем такую логическую цепочку:
1.
Source (Источник) — «SourceBasis». Генерирует агентов-корпусы.
2.
Queue (Очередь) — «BodyStorage». Моделирует зону хранения корпусов перед конвейером.
3.
Conveyor (Конвейер) — «ConveyorBody». Имитирует движение корпуса.
4.
Sink (Удаление) — удаляет агента из модели.
Запускаем модель. Мы видим, как агенты (по умолчанию — цветные кружки) генерируются, накапливаются в очереди, затем по одному поступают на конвейер и в конце удаляются. Базовый процесс работает.
Этап 3. Привязка к анимации и настройка параметров
Теперь нам нужно привязать сухую логику процесса к визуальной схеме завода.
1.
Добавляем изображение завода из раздела «Презентация» (Presentation) на рабочее поле.
2.
Создаем пространственную разметку с помощью палитры «Разметка пространства»:
o Рисуем
прямоугольный узел (Rectangular Node) в зоне хранения корпусов. Переименовываем его в
ShapeBodyStorage.
o Рисуем
путь (Path), точно повторяющий линию конвейера от зоны хранения до места сборки. В свойствах пути выбираем тип
«Конвейер» (Conveyor). Переименовываем в
ShapeConveyorBody.
3.
Настраиваем логические блоки, связывая их с разметкой:
o В блоке
SourceBasis устанавливаем
интенсивность прибытия (Interarrival time) равной «1 корпус в минуту».
o В блоке
BodyStorage ставим галочку
«Максимальная вместимость» (Maximum capacity), что означает отсутствие ограничений на длину очереди. В свойстве
«Место агента» (Agent location) указываем наш узел ShapeBodyStorage. Теперь сгенерированные агенты будут визуально появляться в этой зоне.
o В блоке
ConveyorBody задаем
скорость (Speed) — 0.02 метра в секунду. Это скорость анимации. Устанавливаем
длину агента (Agent length) — 1 метр. Это нужно для того, чтобы модель рассчитывала расстояние между агентами на ленте. В свойстве «
Место агента» выбираем наш путь
ShapeConveyorBody, а длину конвейера задаем
«Согласно пути» (According to path).
Запускаем модель снова. Теперь агенты появляются в отведенной для них зоне хранения, реалистично движутся по конвейерной ленте, выдерживая дистанцию, и исчезают в конце. Единственный визуальный недостаток — сами агенты все еще отображаются как разноцветные кружки, а не как стиральные машины. Этим мы займемся позже.
Краткие итоги
Построение модели началось с отказа от абстрактных категорий системной динамики в пользу дискретно-событийной парадигмы, где каждый материальный объект существует как независимая сущность со своей историей перемещений. Это фундаментальное решение позволило в дальнейшем детализировать процесс до уровня отдельных операций.
Первая фаза работы продемонстрировала, что любая, даже самая сложная система, начинается с элементарной линейной последовательности блоков. Цепочка «Генерация — Очередь — Движение — Удаление» составила минимально жизнеспособный скелет модели. Здесь был заложен ключевой инженерный принцип: сначала создается и проверяется логическая схема процесса, и только затем на нее накладывается визуальная интерпретация. Это позволяет отладить поведение системы до того, как она будет привязана к сложной графике.
Следующим шагом стала синхронизация логики и анимации через пространственную разметку. Привязка блока
Queue к узлу
Node, а
Conveyor к
Path — это не просто косметическая операция. Это моделирование реального ограничения физического пространства: задержки в очереди теперь определяются не только временными параметрами, но и занимаемой площадью, а движение по конвейеру подчиняется длине пути в метрах. Настройка масштабной линейки сыграла роль моста между пиксельным изображением и математическим аппаратом модели, гарантируя, что расстояния на экране имеют точное метрологическое соответствие.
В контексте практического применения полученный результат ценен тем, что модель уже на этом этапе позволяет анализировать пропускную способность конвейерной ленты и динамику очереди. Можно увидеть, как накопление корпусов в зоне хранения зависит от скорости конвейера и интервалов их поступления. Выбор минут в качестве единицы модельного времени и настройка параметра «интенсивность прибытия» задают дискретность управляющих воздействий, приближая симуляцию к такту реального производства. Созданный каркас является универсальной заготовкой для любого конвейерного процесса, будь то сборка, фасовка или транспортировка, и готов к дальнейшему усложнению.
Ранее мы рассмотрели три метода имитационного моделирования и теперь создаем первую модель, используя дискретно-событийный подход. В качестве примера возьмем модель завода по сборке стиральных машин. Цех выполняет финальную операцию: сборку изделия из корпуса и дверцы с помощью робота, дальнейшую транспортировку конвейером в зону упаковки, упаковку рабочими и отгрузку партиями по 10 штук на грузовике.
Главное отличие от системной динамики — в уровне детализации. Мы оперируем не усредненным потоком, а каждым конкретным объектом. В модели будет три типа агентов (заявок): корпус, дверца и собранная машина. Два независимых процесса их движения объединяются на стадии сборки.
Начало работы и интерфейс
Создаем новую модель с именем Factory и единицей модельного времени — минуты. Рабочая область — это главный агент Main, среда для всех остальных элементов. Нам важны две палитры: «Моделирование процессов» (Process Modeling Library) с логическими блоками и «Разметка пространства» (Space Markup) для визуализации.
На Main уже есть масштабная линейка (Scale), которая связывает пиксели экрана с реальными метрами. По умолчанию 20 клеток = 10 метров, то есть 1 клетка = 0.5 метра.
Эксперимент и модельное время
В настройках эксперимента Simulation задаются ключевые параметры запуска модели:
• Модельное время: может быть «виртуальным» (максимально быстрый обсчет без привязки к реальному времени) или «реальным со скоростью» (например, 1 секунда реального времени = 1 минута модели).
• Случайность: фиксация начального числа (seed) генератора случайных чисел гарантирует точную воспроизводимость каждого прогона модели.
• Память: можно увеличить лимит использования оперативной памяти, так как симуляция — ресурсоемкий процесс.
Построение логики процесса (Фаза 1)
Создаем первую цепочку для движения корпусов из блоков библиотеки моделирования процессов:
1. Source (Источник) — «SourceBasis». Генерирует агентов.
2. Queue (Очередь) — «BodyStorage». Служит буфером-накопителем.
3. Conveyor (Конвейер) — «ConveyorBody». Имитирует движение.
4. Sink (Удаление) — удаляет агента, завершая его жизненный цикл.
Запустив эту «голую» логику, мы видим, как разноцветные кружки (агенты по умолчанию) появляются, накапливаются в очереди и движутся по конвейеру. Каркас работает.
Привязка логики к анимации (Фаза 2)
Теперь «оживляем» схему, связывая блоки с графическим изображением завода.
1. Из палитры «Презентация» добавляем рисунок плана цеха.
2. Элементами из палитры «Разметка пространства» создаем топологию:
o Прямоугольный узел (Rectangular Node) в зоне хранения. Переименовываем в ShapeBodyStorage.
o Путь (Path) от зоны хранения до места сборки. В его свойствах выбираем тип «Конвейер». Переименовываем в ShapeConveyorBody.
3. Настраиваем параметры логических блоков для синхронизации с анимацией:
o В SourceBasis задаем интенсивность прибытия — 1 корпус в минуту.
o В BodyStorage включаем максимальную вместимость (безлимитная очередь) и в свойстве «Место агента» указываем узел ShapeBodyStorage. Теперь новые агенты визуально появляются прямо в нарисованной зоне.
o В ConveyorBody устанавливаем: скорость — 0.02 м/с, длину агента — 1 м (для соблюдения дистанции на ленте). Местом агента назначаем путь ShapeConveyorBody, а длину конвейера задаем «Согласно пути» (модель рассчитает длину автоматически по масштабу).
После запуска агенты ведут себя реалистично: появляются в зоне хранения, с соблюдением дистанции движутся по ленте и удаляются. Модель готова к дальнейшему усложнению: добавлению агентов-дверц, ресурсов (роботов и людей) и блока сборки Assembler.
1. Дискретно-событийный подход оперирует индивидуальными агентами, в отличие от системной динамики, работающей с усредненными потоками.
2. Модель строится от простой логической цепочки блоков (процесса) к ее привязке к визуальной анимационной схеме.
3. Блоки Source, Queue, Conveyor и Sink формируют минимальный каркас любого линейного производственного процесса.
4. Палитра «Разметка пространства» позволяет создать физическую топологию завода, которая связывается с логическими блоками.
5. Прямоугольный узел (Rectangular Node) определяет зону накопления агентов, а путь (Path) с типом «Конвейер» — траекторию и способ их движения.
6. Для корректной работы и анимации необходимо задать и синхронизировать масштаб (Scale) на схеме и в свойствах пути.
7. Параметр «длина агента» критически важен для расчета интервалов между движущимися объектами на конвейере.
8. Свойство «Максимальная вместимость» в блоке Queue управляет наличием или отсутствием ограничения на размер очереди.
9. Среда AnyLogic позволяет комбинировать предопределенные блоки библиотек с написанием произвольного кода на Java для нестандартных задач.
10. Генератор случайных чисел по умолчанию инициализирован фиксированным значением (seed) для обеспечения полной воспроизводимости экспериментов.
1. В чем заключается ключевое отличие дискретно-событийного моделирования от системной динамики при описании одного и того же производственного процесса?
2. Опишите назначение каждого из четырех базовых блоков (Source, Queue, Conveyor, Sink) в построенной логической цепочке.
3. Какие три типа агентов необходимо создать для полной модели сборочного цеха и на каком этапе они объединяются?
4. Для чего используется масштабная линейка (Scale) и как неправильный масштаб влияет на поведение модели?
5. Какова цель создания пространственной разметки (прямоугольных узлов и путей) и как она связывается с логикой процесса?
6. Объясните разницу между настройками «виртуального» и «реального» времени в эксперименте модели.
7. Зачем блоку Conveyor нужно задавать параметр «длина агента» (Agent length) помимо скорости движения ленты?
8. Какой параметр блока Queue определяет, сможет ли система принять бесконечное число заявок или будет давать отказы при переполнении?
9. Каким образом фиксация начального числа (seed) генератора случайных чисел влияет на повторяемость результатов моделирования?
10. Какие два типа ресурсов (помимо агентов-заявок) были упомянуты в лекции и для выполнения каких операций они предназначены?