Фаза 3. Добавление грузовиков

Теперь давайте добавим в модель грузовики, доставляющие товар от дистрибьютора ритейлерам.

Давайте создадим сразу весь автопарк как новую популяцию.

Создайте парк грузовиков

  1. Перетащите элемент Агент из палитры Агент на диаграмму Main. Укажите, что хотите создать Популяцию агентов.
  2. На следующем шаге мастера выберите пункт Я хочу создать новый тип агента. Щелкните по кнопке Далее.
  3. Введите Имя нового типа: Vehicle. После этого значение поля Имя популяции изменится на vehicles.
  4. Поставьте флажок напротив опции Агент будет использоваться в диаграммах процессов как. Оставьте предложенное по умолчанию значение Агент. Щелкните по кнопке Далее, чтобы перейти к настройке анимации агента.


  5. Выберите фигуру анимации так же, как сделали это для других агентов: выберите пункт 2D и фигуру Грузовик из списка. Щелкните по кнопке Далее.


  6. Мы пропустим шаг Параметры агента. Щелкните по кнопке Далее.
  7. Теперь мы укажем число агентов, относящихся к этой популяции. Предположим, что в нашей цепочке поставок 15 грузовиков: укажите, что хотите Создать популяцию с 15 агентами.


  8. Щелкните по кнопке Готово. Вы увидите популяцию vehicles на диаграмме Main и фигуру анимации грузовика на карте.

Разместите парк грузовиков в центре дистрибуции

В нашей модели все грузовики изначально находятся в центре дистрибуции и ожидают поступления заказов.

  1. Выберите популяцию vehicles и выберите узел, заданный нами для агента distributor, в качестве начального местоположения грузовиков.

    Запустите модель. Вы увидите фигуру грузовика, появившуюся у центра дистрибуции.

    Грузовик отображается довольно большим.

    Чтобы уменьшить фигуру, откройте диаграмму агента Vehicle. Для этого дважды щелкните по элементу Vehicle в панели Проекты, затем увеличьте масштаб диаграммы и отрегулируйте размер фигуры.

    Теперь зададим логику перемещения грузовика. Для этого мы воспользуемся диаграммой состояний. Диаграмма состояний — один из самых мощных и простых в использовании инструментов AnyLogic. С его помощью можно задать поведение объекта в виде последовательности состояний: например, станок может находится в рабочем состоянии или состоянии простоя.

    В нашем случае диаграмма состояний будет задавать логику перемещения грузовика. Поскольку мы создаем не сложную реальную цепочку поставок, а простую модель, демонстрирующую важнейшие инструменты агентного подхода в AnyLogic, логика этой модели будет заметно проще, чем та, что используется в реальной жизни.

    В нашей модели грузовики изначально находятся у центра дистрибуции и ждут заказов. После получения заказа грузовик отправляется к ритейлеру, разместившему заказ. По прибытии грузовика к ритейлеру производится разгрузка этого грузовика. После этого он отправляется назад к дистрибьютору и переходит к выполнению следующего заказа, если таковой имеется.

    Задайте логику передвижения грузовика

    1. Откройте диаграмму типа агента Vehicle. Для этого дважды щелкните по элементу Vehicle в панели Проекты.
    2. Откройте палитру Диаграмма состояний в панели Палитра.
    3. Чтобы начать рисовать диаграмму состояний, перетащите элемент Начало диаграммы состояний на диаграмму Vehicle. Этот элемент задает стартовую точку для всей диаграммы состояний. У каждой диаграммы состояний должен быть один и только один элемент Начало диаграммы состояний. Сразу после добавления на диаграмму элемент будет подсвечен красным: это значит, что он не связан с другими элементами диаграммы, и поэтому AnyLogic распознает его как ошибочный элемент.

    1. Теперь добавим состояния. Перетащите элемент Состояние из палитры и соедините его с началом диаграммы. Назовите состояние AtDistributor. Это будет начальное состояние грузовика.

    1. Добавьте еще одно состояние, разместив его под первым. Это состояние будет моделировать движение грузовика к ритейлеру. Назовите его MovingToRetailer.

    1. Мы нарисовали два состояния. Зададим, как именно агент (грузовик) будет переключаться между ними. Для этого мы воспользуемся переходом - еще одним ключевым элементом диаграммы состояний. Чтобы нарисовать переход, дважды щелкните по элементу Переход в панели Палитра. Вы перейдете в режим рисования. Нарисуйте переход: сначала щелкните мышью внутри начального состояния, затем — по границе целевого состояния. Если элементы соединены правильно, точка в месте соединения будет подсвечена зеленым.

      Чтобы переместить иконку, отображающую тип срабатывания перехода, выберите переход и перетащите иконку на новое место.

    1. В данный момент мы создаем простую модель, в которой грузовик будет отправляться к случайно выбранному ритейлеру. Переходы могут происходить после событий разных типов: по истечении таймаута, с заданной интенсивностью, по прибытии агента на место назначения и так далее. По умолчанию переходы срабатывают По таймауту — именно поэтому иконка изображает часы: . Мы изменим тип срабатывания перехода, указав, что он происходит С заданной интенсивностью.

    1. Введите Java код, показанный на скриншоте выше, в поле Действие: moveTo( main.retailers.random() );
      В соответствии с этим действием грузовик, управляемый этой диаграммой состояний, будет отправляться к случайно выбранному ритейлеру.

      moveTo( )
      — это функция, начинающая перемещение агента. С помощью аргумента, передаваемого этой функции, мы задаем пункт назначения. Вы можете отправить агента к другому агенту, в определенный узел или географическое место. В нашем случае мы отправляем грузовик к случайно выбранному ритейлеру. В нашей модели ритейлеры — это популяция агентов retailers, "живущая" внутри агента Main. Грузовики заданы похожим образом — как популяция агентов vehicles. Как вы понимаете, обе популяции находятся на одном уровне в иерархии модели. Это значит, что для получения доступа к агенту из другой популяции нам потребуется сначала обратиться к агенту верхнего уровня типа Main как main, после чего мы получаем доступ к одному из полей этого агента, добавляя точку: main.retailers. Таким образом мы получаем доступ к популяции retailers. Чтобы обратиться к случайному агенту из популяции, мы вызовем ее функцию random(): main.retailers.random(). Точка с запятой в конце показывает, что это окончание Java выражения.

    2. В рамках этого учебного материала мы начнем с простой логики: после прибытия к ритейлеру грузовик отправится назад к дистрибьютору. Мы смоделируем этот процесс, используя тот же подход, что и ранее, когда моделировали движение грузовика к ритейлеру. Добавьте еще одно состояние на диаграмму и назовите его MovingToDistributor.
    1. Добавьте переход, ведущий от состояния MovingToRetailer к состоянию MovingToDistributor. Грузовик перейдет в это состояние, прибыв к ритейлеру. Откройте свойства перехода и установите значение параметра Происходит: По прибытию агента. Иконка перехода изменится на .

    1. В поле Действие для этого перехода введите moveTo(main.distributor);.
      Когда грузовик приедет к ритейлеру, состояние этого грузовика изменится на MovingToDistributor, так как этот переход срабатывает по прибытию агента. Функция, вызываемая из поля Действие этого перехода, заставляет грузовик покинуть ритейлера и возвращаться в центр дистрибуции.

    2. Добавьте еще один переход от состояния MovingToDistributor к состоянию AtDistributor.
    3. Установите для этого перехода значение параметра Происходит: По прибытию агента. После возвращения к дистрибьютору грузовик снова переходит в состояние AtDistributor - то есть готов принять и доставить следующий заказ.
      Запустите модель. Посмотрите, как грузовики отправляются к ритейлерам и возвращаются обратно в Париж, к дистрибьютору.

      Контрольная модель: Supply Chain GIS - Phase 3


      Фаза 2. Создание ритейлеров

      Фаза 4. Моделирование заказа товара