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

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

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

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

AnyLogic предоставляет следующий API для перемещения агентов в двумерном дискретном пространстве.

Движение и мгновенное перемещение

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

Function Description
void jumpToCell(int r, int c) Помещает агента в ячейку с заданными координатами, если эта ячейка занята, то выдает ошибку.

r$3строка ячейки
c$3столбец ячейки
void moveToNextCell(CellDirection dir) Помещает агента в соседнюю ячейку, располагающуюся в заданном направлении от его текущей ячейки. Параметр направления dir может иметь следующие значения в зависимости от типа соседства, Мурова или Евклидова:

Термин "псевдослучайная", используемый в описанных ниже методах, означает, что для повышения производительности алгоритм нахождения свободной ячейки может выбирать свободные ячейки с неравными долями вероятностями. Чем менее населено пространство, тем более справедливым будет этот выбор.

Function Description
int[] findRandomEmptyCell() Возвращает координаты {строка, столбец} псевдослучайно выбранной свободной ячейки или null, если все ячейки заняты.
boolean jumpToRandomEmptyCell() Помещает агента в псевдослучайно выбранную свободную ячейку, возвращает false, если все ячейки заняты.

Обмен агентами между ячейками

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

Функция Описание
void swapWithCell(int r, int c) Меняет местами агента с агентом в ячейке заданных строки и столбца. Если эта ячейка пуста, то просто перемещает туда этого агента.
void swapWithNextCell(CellDirection dir) Меняет местами агента с агентом в соседней ячейке в заданном направлении.

dir$3направление (NORTH, SOUTH, ..., NORTHEAST, ...)
void swapWithAgent(Agent anotherAgent) Агент меняется ячейками с заданным агентом.

anotherAgent$3агент, с которым меняются ячейками. Должен быть расположен в той же среде.
Как мы можем улучшить эту статью?