← Назад к статьям
туториалanylogicтуториалjava

Как создать 2D дискретное пространство и выполнять случайный поиск пути

Как создать 2D дискретное пространство и выполнять случайный поиск пути

**Сложность:** ПРОДВИНУТЫЙ **Время:** 00:24 **Категория:** Агентное моделирование

---

Вопрос

Как создать 2D дискретное пространство и выполнять случайный поиск пути в AnyLogic?

---

Проблема

Вы хотите создать мир в виде 2D шахматной доски, но тип пространства AnyLogic "Discrete" не дает достаточного контроля над каждой ячейкой. Каждая ячейка должна быть полностью доступным объектом/агентом.

---

Решение

Создание 2D пространства

Cell[][] grid = new Cell[10][10];

Добавьте клетки в пространство:

for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        Cell c = new Cell(i, j);
        grid[i][j] = c;
    }
}

Класс Cell должен наследоваться от Agent:

class Cell extends Agent {
    int row, col;
    boolean visited;
}

Случайный поиск пути

public List<Cell> randomPathFind(Cell start, Cell end) {
    List<Cell> path = new ArrayList<>();
    Cell current = start;
    path.add(current);
    
    while (!current.equals(end)) {
        List<Cell> neighbors = new ArrayList<>();
        
        if (current.row > 0) neighbors.add(getCell(current.row - 1, current.col));
        if (current.row < 9) neighbors.add(getCell(current.row + 1, current.col));
        if (current.col > 0) neighbors.add(getCell(current.row, current.col - 1));
        if (current.col < 9) neighbors.add(getCell(current.row, current.col + 1));
        
        List<Cell> unvisited = new ArrayList<>();
        for (Cell n : neighbors) {
            if (!n.visited) unvisited.add(n);
        }
        
        if (unvisited.isEmpty()) {
            if (path.size() > 1) {
                path.remove(path.size() - 1);
                current = path.get(path.size() - 1);
            } else {
                return null;
            }
        } else {
            Cell next = unvisited.get((int)(Math.random() * unvisited.size()));
            next.visited = true;
            path.add(next);
            current = next;
        }
    }
    
    return path;
}

Cell getCell(int row, int col) {
    if (row >= 0 && row < 10 && col >= 0 && col < 10) {
        return grid[row][col];
    }
    return null;
}

Перемещение по пути

public void moveAlongPath(List<Cell> path) {
    for (Cell target : path) {
        moveTo(target);
        delay(100);
    }
}

---

Пример модели

Пример модели с 2D сеткой, показывающий поиск пути
Пример модели с 2D сеткой, показывающий поиск пути