Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабораторная 3 / AStarState

.java
Скачиваний:
2
Добавлен:
31.05.2023
Размер:
7 Кб
Скачать
import java.util.HashMap;
/** Этот класс хранит базовое состояние, необходимое алгоритму A* для вычисления пути по карте. Это состояние включает
 * в себя набор "открытых путевых точек" и другой набор "закрытых путевых точек". Кроме того, этот класс предоставляет
 * основные операции, необходимые алгоритму поиска пути A* для выполнения его обработки. **/
public class AStarState {
    /** Это ссылка на карту, по которой перемещается алгоритм A*. **/
    private Map2D map;
    private HashMap<Location, Waypoint> openWaypoints = new HashMap<>();
    private HashMap<Location, Waypoint> closeWaypoints = new HashMap<>();
    /** Инициализируйте новый объект состояния для использования алгоритма поиска пути A* **/
    public AStarState(Map2D map) {
        if (map == null)
            throw new NullPointerException("map cannot be null");
        this.map = map;
    }
    /** Возвращает карту, по которой перемещается навигатор A*. **/
    public Map2D getMap() {
        return map;
    }
    /** Этот метод сканирует все открытые путевые точки и возвращает путевую точку с минимальной общей стоимостью.
     * Если открытых путевых точек нет, этот метод возвращает <код>null</code>. **/
    public Waypoint getMinOpenWaypoint() {
        //Если в "открытом" наборе нет вершин (вызываем метод)
        if (numOpenWaypoints() == 0)
            return null;
        // ссылка на вершину с наименьшей общей стоимостью.
        Waypoint linkWithLowestCost = null;
        // переменная для хранения наименьшего значения
        float lowestCost = Float.MAX_VALUE;
        // проходим по всем вершинам Метод values() возвращает коллекцию всех значений
        for (Waypoint points : openWaypoints.values()) {
            // сравниваем значение стоимости вершины с переменной для хранения
            // getTotalCost() - метод из класса Waypoint, который Возвращает общую смету затрат для этой путевой точки.
            if (points.getTotalCost() < lowestCost) {
                linkWithLowestCost = points;
                lowestCost = points.getTotalCost();
            }
        }
        return linkWithLowestCost;
        }
    /** Этот метод добавляет путевую точку в коллекцию "открытые путевые точки" (или потенциально обновляет уже имеющуюся путевую точку).
     * Если в местоположении новой путевой точки еще нет открытой путевой точки, то новая путевая точка просто
     * добавлено в коллекцию. Однако, если в местоположении новой путевой точки уже есть путевая точка,
     * новая путевая точка заменяет старую <em> только в том случае, если </em> значение "предыдущей стоимости" новой путевой
     точки * меньше значения "предыдущей стоимости" текущей путевой точки. **/
    public boolean addOpenWaypoint(Waypoint newWP) {
        // Если в наборе «открытых вершин» в настоящее время нет вершины
        //для данного местоположения, то необходимо просто добавить новую вершину.
        if (!openWaypoints.containsKey(newWP.loc)) {
            openWaypoints.put(newWP.loc,newWP);
            return true;
        }
        else{
            // Возвращает значение, которому сопоставлен указанный ключ
            Waypoint openWP = openWaypoints.get(newWP.loc);
            // getPreviousCost() - метод из класса Waypoint, который Возвращает фактическую стоимость проезда
            // до этой точки из исходного местоположения через ряд путевых точек в этой цепочке.
            if (newWP.getPreviousCost() < openWP.getPreviousCost()) {
                openWaypoints.put(newWP.loc, newWP);
                return true;
            }
        }
        return false;
    }


    /** Возвращает текущее количество открытых путевых точек. **/
    public int numOpenWaypoints() {
        // size() - возвращает число элементов в словаре на текущий момент,
        return openWaypoints.size();
    }
    /** Этот метод перемещает путевую точку в указанном местоположении из открытого списка в закрытый список. **/
    public void closeWaypoint(Location loc) {
        // удаляем элемент из набора открытых вершин по ключу loc
        Waypoint point = openWaypoints.remove(loc);
        if (openWaypoints != null) {
            // добавляем в набор закрытых вершин элемент с ключом loc и значением point.
            closeWaypoints.put(loc, point);
        }
    }
    /**Возвращает значение true, если коллекция закрытых путевых точек содержит путевую точку для указанного местоположения. **/
    public boolean isLocationClosed(Location loc) {
        // метод containsKey(Object key) - Возвращает true, если эта карта содержит сопоставление для указанного ключа
        return closeWaypoints.containsKey(loc);
    }
}

Соседние файлы в папке лабораторная 3