Теперь давайте добавим в модель грузовики, доставляющие товар от дистрибьютора ритейлерам.
Давайте создадим сразу весь автопарк как новую популяцию.
Создайте парк грузовиков
- Перетащите элемент Агент из палитры Агент на диаграмму Main. Укажите, что хотите создать Популяцию агентов.
- На следующем шаге мастера выберите пункт Я хочу создать новый тип агента. Щелкните по кнопке Далее.
- Введите Имя нового типа: Vehicle. После этого значение поля Имя популяции изменится на vehicles.
- Поставьте флажок напротив опции Агент будет использоваться в диаграммах процессов как. Оставьте предложенное по умолчанию значение Агент. Щелкните по кнопке Далее, чтобы перейти к настройке анимации агента.
- Выберите фигуру анимации так же, как сделали это для других агентов: выберите пункт 2D и фигуру Грузовик из списка. Щелкните по кнопке Далее.
- Мы пропустим шаг Параметры агента. Щелкните по кнопке Далее.
- Теперь мы укажем число агентов, относящихся к этой популяции. Предположим, что в нашей цепочке поставок 15 грузовиков: укажите, что хотите Создать популяцию с 15 агентами.
- Щелкните по кнопке Готово. Вы увидите популяцию vehicles на диаграмме Main и фигуру анимации грузовика на карте.
В нашей модели все грузовики изначально находятся в центре дистрибуции и ожидают поступления заказов.
Разместите парк грузовиков в центре дистрибуции
- Выберите популяцию vehicles и выберите узел, заданный нами для агента distributor, в качестве начального местоположения грузовиков.
Запустите модель. Вы увидите фигуру грузовика, появившуюся у центра дистрибуции.
Грузовик отображается довольно большим.
Чтобы уменьшить фигуру, откройте диаграмму агента Vehicle. Для этого дважды щелкните по элементу Vehicle в панели Проекты, затем увеличьте масштаб диаграммы и отрегулируйте размер фигуры.
Теперь зададим логику перемещения грузовика. Для этого мы воспользуемся диаграммой состояний. Диаграмма состояний — один из самых мощных и простых в использовании инструментов AnyLogic. С его помощью можно задать поведение объекта в виде последовательности состояний: например, станок может находится в рабочем состоянии или состоянии простоя.
В нашем случае диаграмма состояний будет задавать логику перемещения грузовика. Поскольку мы создаем не сложную реальную цепочку поставок, а простую модель, демонстрирующую важнейшие инструменты агентного подхода в AnyLogic, логика этой модели будет заметно проще, чем та, что используется в реальной жизни.
В нашей модели грузовики изначально находятся у центра дистрибуции и ждут заказов. После получения заказа грузовик отправляется к ритейлеру, разместившему заказ. По прибытии грузовика к ритейлеру производится разгрузка этого грузовика. После этого он отправляется назад к дистрибьютору и переходит к выполнению следующего заказа, если таковой имеется.
Задайте логику передвижения грузовика
- Откройте диаграмму типа агента Vehicle. Для этого дважды щелкните по элементу Vehicle в панели Проекты.
- Откройте палитру Диаграмма состояний в панели Палитра.
- Чтобы начать рисовать диаграмму состояний, перетащите элемент Начало диаграммы состояний на диаграмму Vehicle. Этот элемент задает стартовую точку для всей диаграммы состояний. У каждой диаграммы состояний должен быть один и только один элемент Начало диаграммы состояний. Сразу после добавления на диаграмму элемент будет подсвечен красным: это значит, что он не связан с другими элементами диаграммы, и поэтому AnyLogic распознает его как ошибочный элемент.
- Теперь добавим состояния. Перетащите элемент Состояние из палитры и соедините его с началом диаграммы. Назовите состояние AtDistributor. Это будет начальное состояние грузовика.
- Добавьте еще одно состояние, разместив его под первым. Это состояние будет моделировать движение грузовика к ритейлеру. Назовите его MovingToRetailer.
-
Мы нарисовали два состояния. Зададим, как именно агент (грузовик) будет переключаться между ними. Для этого мы воспользуемся переходом - еще одним ключевым элементом диаграммы состояний. Чтобы нарисовать переход, дважды щелкните по элементу Переход в панели Палитра. Вы перейдете в режим рисования. Нарисуйте переход: сначала щелкните мышью внутри начального состояния, затем — по границе целевого состояния. Если элементы соединены правильно, точка в месте соединения будет подсвечена зеленым.
Чтобы переместить иконку, отображающую тип срабатывания перехода, выберите переход и перетащите иконку на новое место. - В данный момент мы создаем простую модель, в которой грузовик будет отправляться к случайно выбранному ритейлеру. Переходы могут происходить после событий разных типов: по истечении таймаута, с заданной интенсивностью, по прибытии агента на место назначения и так далее. По умолчанию переходы срабатывают По таймауту — именно поэтому иконка изображает часы: . Мы изменим тип срабатывания перехода, указав, что он происходит С заданной интенсивностью.
-
Введите Java код, показанный на скриншоте выше, в поле Действие: moveTo(main.retailers.random());
В соответствии с этим действием грузовик, управляемый этой диаграммой состояний, будет отправляться к случайно выбранному ритейлеру.При вводе Java-кода пользуйтесь Мастером подстановки кода, доступным по нажатию в поле ввода клавиш Ctrl + пробел (macOS: Alt + пробел). С его помощью вы узнаете список доступных функций и элементов модели и сможете просто выбрать нужное вам имя из списка, тем самым избежав возможных ошибок при написании имени.moveTo() — это функция, начинающая перемещение агента. С помощью аргумента, передаваемого этой функции, мы задаем пункт назначения. Вы можете отправить агента к другому агенту, в определенный узел или географическое место. В нашем случае мы отправляем грузовик к случайно выбранному ритейлеру. В нашей модели ритейлеры — это популяция агентов retailers, «живущая» внутри агента Main.
Грузовики заданы похожим образом — как популяция агентов vehicles. Как вы понимаете, обе популяции находятся на одном уровне в иерархии модели. Это значит, что для получения доступа к агенту из другой популяции нам потребуется сначала обратиться к агенту верхнего уровня типа Main как main, после чего мы получаем доступ к одному из полей этого агента, добавляя точку: main.retailers. Таким образом мы получаем доступ к популяции retailers. Чтобы обратиться к случайному агенту из популяции, мы вызовем ее функцию random(): main.retailers.random(). Точка с запятой в конце показывает, что это окончание Java-выражения.
- В рамках этого учебного материала мы начнем с простой логики: после прибытия к ритейлеру грузовик отправится назад к дистрибьютору. Мы смоделируем этот процесс, используя тот же подход, что и ранее, когда моделировали движение грузовика к ритейлеру. Добавьте еще одно состояние на диаграмму и назовите его MovingToDistributor.
- Добавьте переход, ведущий от состояния MovingToRetailer к состоянию MovingToDistributor. Грузовик перейдет в это состояние, прибыв к ритейлеру. Откройте свойства перехода и установите значение параметра Происходит: По прибытию агента. Иконка перехода изменится на .
-
В поле Действие для этого перехода введите moveTo(main.distributor);.
Когда грузовик приедет к ритейлеру, состояние этого грузовика изменится на MovingToDistributor, так как этот переход срабатывает по прибытию агента. Функция, вызываемая из поля Действие этого перехода, заставляет грузовик покинуть ритейлера и возвращаться в центр дистрибуции. - Добавьте еще один переход от состояния MovingToDistributor к состоянию AtDistributor.
- Установите для этого перехода значение параметра Происходит: По прибытию агента. После возвращения к дистрибьютору грузовик снова переходит в состояние AtDistributor — то есть готов принять и доставить следующий заказ.
Запустите модель. Посмотрите, как грузовики отправляются к ритейлерам и возвращаются обратно в Париж, к дистрибьютору.
Демо-модель: Supply Chain GIS - Phase 3 Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.-
Как мы можем улучшить эту статью?
-