КТП_5
.docxМИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
Ордена Трудового Красного Знамени
Федеральное государственное образовательное бюджетное учреждение высшего профессионального образования
МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ
Кафедра Математическая кибернетика и информационные технологии
Отчет по лабораторной работе №3: Алгоритм A* («A star»)
по дисциплине “Кроссплатформенные технологии программирования”
Выполнила
Студентка группы БСТ1904
Пантелеева К.А.
Вариант №14
Проверила
ст. преп. Мосева М.С.
Москва, 2021
1 Цель работы
Реализовать поиск кратчайшего пути на основе реализованного алгоритма А*.
2 Задание
В Location.java:
Обеспечить реализацию метода equals ().
Обеспечить реализацию метода hashcode().
В AStarState.java:
Добавить два (нестатических) поля в класс AstarState с типом HashMap<Location,Waypoint> одно для "открытых вершин" и другой для "закрытых вершин"
Реализовать метод public int numOpenWaypoints() (возвращает количество точек в наборе открытых вершин)
Реализовать метод public Waypoint getMinOpenWaypoint() (должна проверить все вершины в наборе открытых вершин, и после этого она должна вернуть ссылку на вершину с наименьшей общей стоимостью)
Реализовать метод public boolean addOpenWaypoint(Waypoint newWP) (Если в наборе «открытых вершин» в настоящее время нет вершины для данного местоположения, то необходимо просто добавить новую вершину, если в наборе «открытых вершин» уже есть вершина для этой локации, добавьте новую вершину только в том случае, если стоимость пути до новой вершины меньше стоимости пути до текущей)
Реализовать метод public boolean isLocationClosed(Location loc) (возвращать значение true, если указанное местоположение встречается в наборе закрытых вершин, и false в противном случае)
Реализовать метод public void closeWaypoint(Location loc) (перемещает вершину из набора «открытых вершин» в набор «закрытых вершин»)
3 Код
public boolean equals(Object obj) { // Проверка приналежности объекта obj к классу Location if (obj instanceof Location) { // Каст другого объекта к классу Location, // потом сравнение. Возвращает true если равны. Location other = (Location) obj; if (xCoord == other.xCoord && yCoord == other.yCoord) { return true; } } // Если мы попали сюда - координаты не равны. Возвращает false. return false; } /** Обеспечивает hashCode для каждой локации. **/ public int hashCode() { int result = 20; // Какое-то число // Используем другое число для умножения result = 30 * result + xCoord; result = 30 * result + yCoord; return result; }
private Map<Location, Waypoint> open_waypoints = new HashMap<Location, Waypoint>(); /** * Initialize a map of all closed waypoints and their locations. **/ private Map<Location, Waypoint> closed_waypoints = new HashMap<Location, Waypoint>();
public Waypoint getMinOpenWaypoint() { // Если нет открытых вершин, возвращаем null. if (numOpenWaypoints() == 0) return null; Set open_waypoint_keys = open_waypoints.keySet(); Iterator i = open_waypoint_keys.iterator(); Waypoint best = null; float best_cost = Float.MAX_VALUE; // Проверяет все вершины. while (i.hasNext()) { // Сохраняет текущую локацию. Location location = (Location) i.next(); // Сохранет текущую вершину. Waypoint waypoint = open_waypoints.get(location); // Сохраняет текущую "стоимость" вершины. float waypoint_total_cost = waypoint.getTotalCost(); // Если общая "стоимость" текущей вершины лучше (меньше) // тогда сохраненная "стоимость" сохраненной лучшей вершины заменяет // сохраненную вершину текущей вершины и сохраненную общую "стоимость" // текущей общей "стоимостью". if (waypoint_total_cost < best_cost) { best = open_waypoints.get(location); best_cost = waypoint_total_cost; } } // Возвращает вершину с минимальной общей "стоимостью". return best; } /** * This method adds a waypoint to (or potentially updates a waypoint already * in) the "open waypoints" collection. If there is not already an open * waypoint at the new waypoint's location then the new waypoint is simply * added to the collection. However, if there is already a waypoint at the * new waypoint's location, the new waypoint replaces the old one <em>only * if</em> the new waypoint's "previous cost" value is less than the current * waypoint's "previous cost" value. **/ public boolean addOpenWaypoint(Waypoint newWP) { // Находит локацию новой вершины. Location location = newWP.getLocation(); // Проверяет есть ли уже открытая вершина на месте новой вершины. if (open_waypoints.containsKey(location)) { // Если на этом месте уже есть открытая вершина, // проверяет меньше ли "предыдущая стоимость" новой вершины // "предыдущей стоимости" текущей. Waypoint current_waypoint = open_waypoints.get(location); if (newWP.getPreviousCost() < current_waypoint.getPreviousCost()) { // Если "предыдущая стоимость" новой вершины меньше // "предыдущей стоимости" текущей вершины, новая вершина // заменяет старую и возвращает true. open_waypoints.put(location, newWP); return true; } // Если "предыдущая стоимость" новой вершины не меньше "предыдущей стоимости" // текущей вершины, return false. return false; } // Если в наборе «открытых вершин» в настоящее время нет вершины для данного места, // то необходимо просто добавить новую вершину и return true. open_waypoints.put(location, newWP); return true; }
/** * Returns the current number of open waypoints. **/ public int numOpenWaypoints() { return open_waypoints.size(); } /** * This method moves the waypoint at the specified location from the * open list to the closed list. **/ public void closeWaypoint(Location loc) { Waypoint waypoint = open_waypoints.remove(loc); closed_waypoints.put(loc, waypoint); } /** * Returns true if the collection of closed waypoints contains a waypoint * for the specified location. **/ public boolean isLocationClosed(Location loc) { return closed_waypoints.containsKey(loc); }
4 Проверка выполнения программы
KsenyaSo/KTP at Laboratornay_3 (github.com)
5 Выводы
В ходе работы мы научились реализовывать поиск крайтчайшего пути на основе алгоритма А*.
6 Литература
Камаев В.А., Костерин В.В. Технологии программирования. М.: Высшая школа, 2006.