AnyLogic
Развернуть
Размер шрифта

Движение в непрерывном пространстве

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

Вызов функций движения агента

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

Иногда вызов той или иной функции может вызвать код действия агента При достижении точки назначения.

Сначала, вам может понадобиться получить информацию о текущем местоположении агента и определить координаты места назначения.

Определение текущих координат агента
Функция Описание
double getX() Возвращает текущую X-координату агента.
double getY() Возвращает текущую Y-координату агента.
double getZ() Возвращает текущую Z-координату агента в 3D пространстве.
Определение координат цели
Функция Описание
double getTargetX() Возвращает X-координату места назначения движения агента, если он движется, или его текущую X-координату, если нет.
double getTargetY() Возвращает Y-координату места назначения движения агента, если он движется, или его текущую Y-координату, если нет.
double getTargetZ() Возвращает Z-координату места назначения движения агента, если он движется, или его текущую Z-координату, если нет.
Расчет расстояния
Функция Описание
double distanceTo(Agent other) Возвращает расстояние от этого агента до указанного агента other.
double distanceTo(Agent other, LengthUnits units) Возвращает расстояние от этого агента до указанного агента other в заданных единицах измерения.
double distanceTo(Point point) Возвращает расстояние от этого агента до указанной точки.
double distanceTo(Point point, LengthUnits units) Возвращает расстояние от этого агента до указанной точки в заданных единицах измерения.
double distanceTo(double x, double y) Возвращает расстояние от этого агента до указанной точки (x, y) в пространстве.
double distanceTo(double x, double y, LengthUnits units) Возвращает расстояние от этого агента до указанной точки (x, y) в непрерывном 3D пространстве в заданных единицах измерения.
double distanceTo(level level, double x, double y) Возвращает расстояние от этого агента до указанной точки за указанном уровне.
double distanceTo(Level level, double x, double y, LengthUnits units) Возвращает расстояние от этого агента до указанной точки на указанном уровне в заданных единицах измерения.
double distanceTo(double x, double y, double z) Возвращает расстояние до указанной точки (x, y, z) в непрерывном 3D пространстве.

Движение агента

Эти функции инициируют перемещение агента в место с заданными координатами. Движение будет производиться с определенной скоростью (которая при необходимости может быть изменена динамически). По прибытии будет выполнено действие агента При достижении точки назначения.

Агенты будут перемещаться по кратчайшему пути к место назначения, которое задается как точка с координатами (x, y, z) в непрерывном 2D или 3D пространстве:

Вы можете задавать движение агента к какому-либо элементу модели, используя имя элемента как цель движения. Имеется три основных типа таких объектов:

Движение
Функция Описание
void moveTo(double x, double y) Начинает перемещение агента в место с заданными координатами.

x, y — X, Y-координаты местоположения
void moveToStraight(double x, double y) Начинает перемещение агента по прямой (без учета существующих сетей или маршрутов) в место с заданными координатами.

x, y — X, Y-координаты местоположения
void moveTo(double x, double y, double z) Инициирует перемещение агента в место с заданными координатами.

x, y, z — X, Y, Z-координаты местоположения
void moveToStraight(double x, double y, double z) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) в место с заданными координатами.

x, y, z — X, Y, Z-координаты местоположения
void moveTo(Agent agent) Инициирует перемещение агента к другому агенту.

agent — другой агент
void moveStraightTo(Agent agent) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) к другому агенту.

agent — другой агент
void moveTo(Point location) Инициирует перемещение агента к заданной точке.

location — место назначения
void moveToStraight(Point location) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) к заданному местоположению.

location — место назначения
void moveTo(INode node) Инициирует перемещение агента в заданный узел.

node — узел сети
void moveTo(INode node, Point location) Инициирует перемещение агента в заданную точку внутри указанного узла.

node — узел сети
location — (дополнительно) местоположение внутри узла, может быть null
void moveTo(Attractor attractor) Инициирует перемещение агента в заданный аттрактор.

attractor — аттрактор
void moveToNearestAgent(java.lang.Iterable agents) Инициирует перемещение агента к ближайшему агенту из данной коллекции (или популяции).

agents — коллекция (или популяция) агентов

Мгновенное перемещение

Эти функции немедленно помещают агента в заданное место или узел в непрерывном 3D пространстве. Они прекращают любое движение и не вызывают действие При достижении точки назначения.

Эти параметры вам уже знакомы:

Перемещение за заданное время

Следующие функции изменяют скорость агента так, чтобы он достигал цели за tripTime единиц модельного времени. Вы знакомы со всеми параметрами, кроме tripTime — времени перемещения.

Каждая функция moveToInTime() имеет другую нотацию с еще одним аргументом: units. Используйте эту нотацию, когда хотите задать время перемещения в отличных от модельных единицах времени. Передайте одну из констант, задающих единицу измерения времени (к примеру, MINUTE, HOUR, DAY) в качестве значения аргумента. Предположим, что единицы модельного времени — секунды, а время перемещения 2 дня, поэтому проще будет написать truck.moveToInTime(city, 2, DAY), после чего агент truck начнет движение к городу city. Агенту truck понадобится 2 дня, чтобы добраться до города city.

Перемещение за указанное время
Все приведенные в этом разделе функции изменяют скорость агента так, чтобы достичь цели за заданное время (не позже и не раньше). При достижении точки назначения вызывается Действие при достижении места назначения.
Функция Описание
void moveToInTime(double x, double y, double tripTime) Инициирует перемещение агента в точку с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

x, y — X-, Y-координаты местоположения
tripTime — время перемещения, в единицах модельного времени
void moveToInTime(double x, double y, double tripTime, TimeUnits units) Инициирует перемещение агента в точку с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.

x — X-координата местоположения. В случае ГИС пространства это широта, измеренная в градусах (-90 ... (Юг) ... 0 ... (Север) ... +90).
y — Y-координата местоположения. В случае ГИС пространства это долгота, измеренная в градусах (-180 ... (Запад) ... 0 ... (Восток) ... +180).
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времени
void moveToInTime(double x, double y, double z, double tripTime) Инициирует перемещение агента в место с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

x, y, z: X-, Y-, Z- координаты местоположения
tripTime — время перемещения, в единицах модельного времени
void moveToInTime(double x, double y, double z, double tripTime, TimeUnits units) Инициирует перемещение агента в место с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.

x, y, z: X-, Y-, Z- координаты местоположения
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времени
void moveToInTime(Agent agent, double tripTime) Инициирует перемещение агента к другому агенту. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

agent — другой агент
tripTime — время перемещения, в единицах модельного времени
void moveToInTime(Agent agent, double tripTime, TimeUnits units) Инициирует перемещение агента к другому агенту. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.

agent — другой агент
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времени
void moveToInTime(Attractor attractor, double tripTime) Инициирует перемещение агента в заданный аттрактор. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

attractor — аттрактор
tripTime — время перемещения, в единицах модельного времени
void moveToInTime(Attractor attractor, double tripTime, TimeUnits units) Инициирует перемещение агента в заданный аттрактор. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.

attractor — аттрактор
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времени
void moveToInTime(INode node, double tripTime) Инициирует перемещение агента в заданный узел. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

node — узел
tripTime — время перемещения, в единицах модельного времени
void moveToInTime(INode node, double tripTime, TimeUnits units) Инициирует перемещение агента в заданный узел. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.

node — узел
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времени
void moveToInTime(INode node, Point location, double tripTime) Инициирует перемещение агента в заданную точку внутри указанного узла. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

node — узел
location — место внутри узла, может быть null
tripTime — время перемещения, в единицах модельного времени
void moveToInTime(INode node, Point location, double tripTime, TimeUnits units) Инициирует перемещение агента в заданную точку внутри указанного узла. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.

node — узел
location — место внутри узла, может быть null
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времени
void moveToInTime(Point location, double tripTime) Инициирует перемещение агента в направлении заданного местоположения. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

location — место назначения
tripTime — время перемещения, в единицах модельного времени
void moveToInTime(Point location, double tripTime, TimeUnits units) Инициирует перемещение агента в направлении заданного местоположения. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.

location — место назначения
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времени
void moveToNearestAgent (java.lang.Iterable agents, double tripTime) Инициирует перемещение агента к ближайшему агенту из данной коллекции (или популяции агентов). Прекращает какое-либо движение в этот момент. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

agents — коллекция (или популяция) агентов
tripTime — время перемещения
void moveToStraightInTime(double x, double y, double z, double tripTime) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) в место с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

x, y, z: X-, Y-, Z- координаты местоположения
tripTime — время перемещения, в единицах модельного времени
void moveToStraightInTime(double x, double y, double z, double tripTime, TimeUnits units) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) в место с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.

x, y, z: X-, Y-, Z- координаты местоположения
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времени
void moveToStraightInTime(Point location, double tripTime) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) в направлении заданного местоположения. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

location — место назначения
tripTime — время перемещения, в единицах модельного времени
void moveToStraightInTime(Point location, double tripTime, TimeUnits units) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) в направлении заданного местоположения. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.

location — место назначения
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времени

Дополнительные функции

Функция Описание
boolean isMoving() Проверяет, движется ли агент в данный момент времени.
double timeToArrival() Если агент движется, то возвращает время (в единицах модельного времени), нужное ему для того, чтобы прибыть в место назначения, с учетом того, что скорость не изменится. Если агент не движется, возвращает 0.
double timeToArrival(TimeUnits units) Если агент движется, возвращает оставшееся время до приезда, при условии, что скорость не изменится. Если агент не движется, возвращает 0. Функция возвращает время в заданных константой единицах времени. Единицы измерения времени задаются аргументом функции units, который передает константу единиц измерения времени (к примеру, MINUTE, HOUR) в качестве значения аргумента.
void stop() Останавливает агента (если он двигался); агент остается при этом в том же месте, и действие При достижении точки назначения не выполняется

Задание движения блоком MoveTo

Имеется еще один способ инициировать движение агентов: задать движение в свойствах объекта диаграммы процесса. Для этого обычно используются Блоки Библиотеки Моделирования Процессов.

Специальный объект Библиотеки моделирования процессов, который задает движение, называется MoveTo.

В его свойствах вы можете выбрать, хотите ли вы, чтобы объект перемещался с определенной скоростью или хотите переместить его мгновенным "скачком" в место назначения (первый параметр блока, Агент). Параметр Место назначения здесь имеет несколько опций:

Как вы видите на картинке выше, если вы выбираете Узел сети в качестве места назначения, ниже появится параметр Узел сети, в котором вы можете задать узел, выбрав его из выпадающего списка или в графическом редакторе. Таким же образом, вы можете выбрать другие элементы, задающие цель движения.

Также вы можете задать нестандартную скорость движения агента, или время его перемещения, как при использовании функций moveToInTime().

Больше информации о параметрах этого объекта вы можете найти в Справочном руководстве по библиотеке.

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

Кроме того, вы можете задавать конкретное положение внутри узла с помощью аттракторов, или использовать сам аттрактор в качестве места назначения.

Как мы можем улучшить эту статью?