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

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

.java
Скачиваний:
2
Добавлен:
31.05.2023
Размер:
6.73 Кб
Скачать
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