Непрерывное пространство

Агенты могут обитать в различных типах пространств. AnyLogic Advanced поддерживает два типа пространств: двумерное непрерывное и двумерное дискретное. AnyLogic Professional также поддерживает геопространственный тип ГИС

В непрерывном пространстве есть возможность изменять местоположение агента и получать информацию о его текущем местоположении, перемещать агента с заданной скоростью из одного места в другое, выполнять действия по его прибытии в место назначения, рисовать анимацию (статического или движущегося) агента, устанавливать соединения согласно выбранному шаблону расположения агентов, и многие другие возможности. Чтобы иметь доступ к этой функциональности, Вы должны объявить Ваш класс активного объекта агентом (см. Агент). Часть функциональности непрерывного пространства даже не требует того, чтобы агенты принадлежали явно заданной среде - если среда не указана, то по умолчанию будет приниматься, что пространство именно непрерывное (но если агенты принадлежат среде, то тип пространства должен быть задан явно).

  Чтобы сделать пространство среды непрерывным

  1. На странице Дополнительные панели свойств среды выберите Непрерывное из выпадающего списка Тип пространства.
  2. Затем перейдите на страницу свойств Агент класса активного объекта, задающего агента в Вашей модели, и также выберите опцию Непрерывное из группы кнопок Тип пространства.

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

Местоположение агента в непрерывном пространстве определяется двумя координатами (x,y) типа double.

Начальное расположение агентов. Шаблоны расположения

Начальное расположение агентов может задаваться либо в классе агента, либо "централизованно" средой. 

  Чтобы задать начальное расположение агентов в среде

  1. На странице Дополнительные панели свойств среды выберите Тип расположения и, если Вы выберете не тип Задается пользователем, то установите флажок Применить при запуске.
  2. На странице Агент панели свойств класса агента установите флажок Начальное расположение задается средой.

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

Случайное (Environment.LAYOUT_RANDOM) - агенты случайно и равномерно распределяются в пределах размерностей пространства

Упорядоченное (Environment.LAYOUT_ARRANGED) - агенты упорядоченно распределяются в пределах размерностей пространства

Кольцо (Environment.LAYOUT_RING) - агенты равномерно распределяются по кольцу, диаметр которого меньше меньшей размерности пространства

Пружинящая масса (Environment.LAYOUT_SPRING_MASS)- агенты располагаются аналогично системе с пружинящими массами, где агенты представляют собой массы, а их соединения - пружины. Этот тип зависит от выбранного типа сети

Тип расположения агентов в пространстве может быть также изменен динамически во время выполнения модели посредством программного интерфейса среды, например, с помощью методов:

environment.setLayoutType( type ); //устанавливает принятый по умолчанию тип расположения, агенты при этом не изменяют своих местоположений
environment.applyLayout(); //производит перестановку агентов согласно текущему типу сети

Значение параметра type может быть равно одной из вышеописанных констант, либо Environment.LAYOUT_USER_DEFINED.

  Чтобы задать начальное местоположение агента в классе агента
  1. На странице Агент панели свойств класса агента сбросьте флажок Начальное расположение задается средой.
  2. Задайте координаты местоположения X и Y на той же странице.

Передвижение и перемещение "скачком"

Класс Agent предоставляет богатый программный интерфейс для перемещения агентов в двумерном непрерывном пространстве. Во-первых, есть методы для получения информации о текущем местоположении и расстоянии (эти методы применимы во время движения агента):

double getX() - возвращает текущую X-координату агента

double getY() - возвращает текущую Y-координату агента

setXY(double x, double y)- задает координаты местоположения агента. Должен использоваться только для начальной расстановки агентов. Подразумевает, что агент не движется. 
Параметры:

x - x-координата местоположения
y - y-координата местоположения

double distanceTo( Agent other ) - возвращает расстояние до указанного агента

Кроме того, есть набор методов, позволяющий производить перемещение агентов:

jumpTo( double x, double y ) - немедленно помещает агента в заданное место

moveTo( double x, double y )- инициирует перемещение агента в место с заданными координатами. Движение будет производиться по кратчайшему пути с заданной скоростью (которая при необходимости может быть изменена динамически). По прибытии будет выполнено Действие при достижении места назначения

stop() - останавливает агента (если он двигался); агент остается при этом в том же месте, и Действие при достижении места назначения не выполняется

boolean isMoving() - проверяет, движется ли агент в данный момент времени

double getTargetX() - возвращает x-координату места назначения движения агента, если он движется, или его текущую x-координату, если нет

double getTargetY() - возвращает y-координату места назначения движения агента, если он движется, или его текущую y-координату, если нет

double getVelocity() - возвращает скорость агента (скорость является параметром агента, это та скорость, с которой он обычно передвигается, и ненулевая скорость еще не означает, что этот агент движется в данный момент времени)

double getRotation() - возвращает текущий угол поворота агента (в радианах, по часовой стрелке, нулевому углу соответствует положение часовой стрелки, показываюшей на три часа). Если вращение не запрещено с помощью метода setRotation(double, boolean), то этот угол меняется при начале каждого нового перемещения агента.

double timeToArrival()- если агент движется, то возвращает время (в единицах модельного времени), нужное ему для того, чтобы прибыть в место назначения, с учетом того, что скорость не изменится. Если агент не движется, возвращает 0

setVelocity( double newVelocity ) - задает скорость (в пикселах в секунду), с которой агент будет передвигаться. Если на момент вызова метода агент движется, то он продолжит движение с новой скоростью. Если агент не движется, то он не начнет движение, пока Вы не вызовете метод moveTo()

setRotation( double rotation )- задает угол поворота анимации агента (в радианах, по часовой стрелке). Этот угол поворота будет переопределен при следующем вызове метода moveTo(). Если Вы не планируете в дальнейшем изменять угол поворота анимации агента то используйте метод setRotation(double, boolean), передав в качестве значения второго параметра true. 
    rotation - угол поворота анимации агента (в радианах)

setRotation(double rotation, boolean freezeRotation) - Задает угол поворота (в радианах) анимации агента. Этот угол поворота будет переопределен при следующем вызове метода moveTo().
Параметры:

rotation - угол поворота агента (в радианах)
freezeRotation - если true, то угол поворота не будет изменяться при вызовах метода moveTo(double, double) 

boolean isRotationFrozen() - возвращает true, если угол поворота этого агента зафиксирован, т.e. вызовы метода moveTo(double, double) не изменяют текущий угол поворота. По умолчанию угол поворота не зафиксирован.

  Чтобы задать начальную скорость и угол поворота агента
  1. На странице Агент панели свойств класса агента задайте Скорость и Поворот агента.

  Чтобы задать действие, которое должно выполняться при достижении агентом точки назначения (после того, как выполнится метод moveTo())

  1. На странице Агент панели свойств класса агента введите соответствующий код в поле Действие при достижении места назначения.

Во время движения агента его презентация будет также отображаться движущейся и всегда будет находиться в точке (x,y) относительно своего начала координат. Это означает, что если во время разработки модели презентация агента была помещена в в точку (50,100) на диаграмме класса объекта-владельца (например,.Main) и текущее местоположение агента будет (17,64), то агент будет отображен в точке (67,164). Обратите внимание, что если у Вас несколько вложенных объектов, моделирующих агентов, живущих в одном пространстве, то для того, чтобы получить согласованную презентацию, Вам нужно будет поместить их вложенные презентации в одно и то же место на диаграмме объекта-владельца.