Теперь давайте добавим в модель грузовики, доставляющие товар от дистрибьютора ритейлерам.
Давайте создадим сразу весь автопарк как новую популяцию.
В нашей модели все грузовики изначально находятся в центре дистрибуции и ожидают поступления заказов.
Запустите модель. Вы увидите фигуру грузовика, появившуюся у центра дистрибуции.
Грузовик отображается довольно большим.
Чтобы уменьшить фигуру, откройте диаграмму агента Vehicle. Для этого дважды щелкните по элементу Vehicle в панели Проекты, затем увеличьте масштаб диаграммы и отрегулируйте размер фигуры.
Теперь зададим логику перемещения грузовика. Для этого мы воспользуемся диаграммой состояний. Диаграмма состояний — один из самых мощных и простых в использовании инструментов AnyLogic. С его помощью можно задать поведение объекта в виде последовательности состояний: например, станок может находится в рабочем состоянии или состоянии простоя.
В нашем случае диаграмма состояний будет задавать логику перемещения грузовика. Поскольку мы создаем не сложную реальную цепочку поставок, а простую модель, демонстрирующую важнейшие инструменты агентного подхода в AnyLogic, логика этой модели будет заметно проще, чем та, что используется в реальной жизни.
В нашей модели грузовики изначально находятся у центра дистрибуции и ждут заказов. После получения заказа грузовик отправляется к ритейлеру, разместившему заказ. По прибытии грузовика к ритейлеру производится разгрузка этого грузовика. После этого он отправляется назад к дистрибьютору и переходит к выполнению следующего заказа, если таковой имеется.
Чтобы переместить иконку, отображающую тип срабатывания перехода, выберите переход и перетащите иконку на новое место.
В
данный момент мы создаем простую модель, в которой грузовик будет
отправляться к случайно выбранному ритейлеру. Переходы могут
происходить после событий разных типов: по истечении таймаута, с
заданной интенсивностью, по прибытии агента на место назначения и так
далее. По умолчанию переходы срабатывают По таймауту —
именно поэтому иконка изображает часы:
. Мы изменим тип срабатывания перехода, указав, что он происходит
С заданной интенсивностью.
Введите Java код, показанный на скриншоте выше, в поле
Действие:
moveTo( main.retailers.random() );
В
соответствии с этим действием грузовик, управляемый этой диаграммой
состояний, будет отправляться к случайно выбранному ритейлеру.
moveTo( )
— это функция, начинающая перемещение агента. С помощью аргумента,
передаваемого этой функции, мы задаем пункт назначения. Вы можете
отправить агента к другому агенту, в определенный узел или
географическое место. В нашем случае мы отправляем грузовик к случайно
выбранному ритейлеру. В нашей модели ритейлеры — это популяция агентов retailers,
"живущая" внутри агента
Main.
Грузовики заданы похожим образом — как популяция агентов
vehicles.
Как вы понимаете, обе популяции находятся на одном уровне в иерархии
модели. Это значит, что для получения доступа к агенту из другой
популяции нам потребуется сначала обратиться к агенту верхнего уровня
типа Main как
main, после чего мы получаем доступ к одному из полей этого агента, добавляя точку:
main.retailers. Таким образом мы получаем доступ к популяции
retailers. Чтобы обратиться к случайному агенту из популяции, мы вызовем ее функцию random():
main.retailers.random(). Точка с запятой в конце показывает, что это окончание Java выражения.
В поле Действие для этого перехода введите
moveTo(main.distributor);.
Когда грузовик приедет к ритейлеру, состояние этого грузовика изменится на
MovingToDistributor, так как этот переход срабатывает по прибытию агента. Функция, вызываемая из поля Действие этого перехода, заставляет грузовик покинуть ритейлера и возвращаться в центр дистрибуции.
Контрольная модель: Supply Chain GIS - Phase 3