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

КТП_5

.docx
Скачиваний:
5
Добавлен:
04.03.2022
Размер:
33.98 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

Ордена Трудового Красного Знамени

Федеральное государственное образовательное бюджетное учреждение высшего профессионального образования

МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ

Кафедра Математическая кибернетика и информационные технологии

Отчет по лабораторной работе №3: Алгоритм A* («A star»)

по дисциплине “Кроссплатформенные технологии программирования”

Выполнила

Студентка группы БСТ1904

Пантелеева К.А.

Вариант №14

Проверила

ст. преп. Мосева М.С.

Москва, 2021

1 Цель работы

Реализовать поиск кратчайшего пути на основе реализованного алгоритма А*.

2 Задание

В Location.java:

  1. Обеспечить реализацию метода equals ().

  2. Обеспечить реализацию метода hashcode().

В AStarState.java:

  1. Добавить два (нестатических) поля в класс AstarState с типом HashMap<Location,Waypoint> одно для "открытых вершин" и другой для "закрытых вершин"

  2. Реализовать метод public int numOpenWaypoints() (возвращает количество точек в наборе открытых вершин)

  3. Реализовать метод public Waypoint getMinOpenWaypoint() (должна проверить все вершины в наборе открытых вершин, и после этого она должна вернуть ссылку на вершину с наименьшей общей стоимостью)

  4. Реализовать метод public boolean addOpenWaypoint(Waypoint newWP) (Если в наборе «открытых вершин» в настоящее время нет вершины для данного местоположения, то необходимо просто добавить новую вершину, если в наборе «открытых вершин» уже есть вершина для этой локации, добавьте новую вершину только в том случае, если стоимость пути до новой вершины меньше стоимости пути до текущей)

  5. Реализовать метод public boolean isLocationClosed(Location loc) (возвращать значение true, если указанное местоположение встречается в наборе закрытых вершин, и false в противном случае)

  6. Реализовать метод 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.

Соседние файлы в предмете Кросс-платформенное программирование