Лабиринты Java, часть 3: класс AstarState


Сегодня будет разобран еще один подготовительный класс – AstarState. Этот класс хранит базовое состояние, необходимое для алгоритма A* для вычисления пути по карте. Это состояние включает в себя набор «открытых путевых точек» и «закрытых путевых точек». Кроме того, этот класс предоставляет основные операции, необходимые алгоритму поиска пути A* для его реализации.

import java.util.*;


public class AStarState
{
	
	HashMap<Location, Waypoint> open_waypoints = new HashMap();//открытые точки
	HashMap<Location, Waypoint> closed_waypoints = new HashMap();//закрытые точки
	
	
    /** Это ссылка на карту, по которой алгоритм A* перемещается. **/
    private Map2D map;


    /**
     * Инициализируем новый объект состояния для использования алгоритма поиска пути A*.
     **/
    public AStarState(Map2D map)
    {
        if (map == null)
            throw new NullPointerException("map cannot be null");

        this.map = map;
    }

    /** Возвращает карту, по которой перемещается навигатор A*. **/
    public Map2D getMap()
    {
        return map;
    }

    /**
     * Этот метод сканирует все открытые путевые точки и возвращает путевую точку
     * с минимальной общей стоимостью.  Если открытых путевых точек нет, этот метод
     * возвращает <code>null</code>.
     **/
    public Waypoint getMinOpenWaypoint()
    {
    	if (numOpenWaypoints() == 0)
            return null;
        
        // инициализируем набор ключей всех открытых waypoint, 
    	//итератор для итерации по набору 
    	//и переменную для хранения лучшей waypoint и стоимости этой путевой точки.  
        Set open_waypoint_keys = open_waypoints.keySet();
        Iterator i = open_waypoint_keys.iterator();
        Waypoint best = null;
        float best_cost = Float.MAX_VALUE;
        
        // сканируем все открытые waypoints.
        while (i.hasNext())
        {
            // сохраняет текущее местоположение.
            Location location = (Location)i.next();
            // сохраняет текущий waypoint.
            Waypoint waypoint = open_waypoints.get(location);
            // сохраняет общую стоимость текущего waypoint.
            float waypoint_total_cost = waypoint.getTotalCost();
            
            // если общая стоимость для текущей waypoint  лучше (ниже)
            // чем сохраненная стоимость для сохраненной лучшей waypoint, то обменяем их
            if (waypoint_total_cost < best_cost)
            {
                best = open_waypoints.get(location);
                best_cost = waypoint_total_cost;
            }
            
        }
        // возвращает путевую точку с минимальной общей стоимостью.
        return best;
    }

    /**
     * Этот метод добавляет путевую точку к (или потенциально обновляет уже имеющуюся путевую точку
     * в) коллекции "открытые путевые точки".  Если еще нет открытой
     * путевой точки в местоположении новой путевой точки, тогда новая путевая точка просто
     * добавляется в коллекцию.  Однако, если в местоположении
     * новой путевой точки уже есть путевая точка, новая путевая точка заменяет только старую <em>
     * если</em> значение "предыдущей стоимости" новой путевой точки меньше текущего
     * значение "предыдущей стоимости" путевой точки.
     **/
    public boolean addOpenWaypoint(Waypoint newWP)
    {
    	// Находит местонахождение нового waypoint.
        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;
            }
         // Если значение "предыдущей стоимости" новой путевой точки не меньше, чем
            // значение "предыдущей стоимости" текущей путевой точки, возврат false.
            return false;
        }
     // Если в новой путевой точке еще нет открытой путевой точки
        // местоположения, добавляем новую путевую точку в коллекцию открытых путевых точек
        // и вернем true.
        open_waypoints.put(location, newWP);
        return true;
    }


    /** Возвращает текущее количество открытых путевых точек.**/
    public int numOpenWaypoints()
    {
    	return open_waypoints.size();
    }


    /**
     * Этот метод перемещает путевую точку в указанном месте из открытого в список закрыто.
     **/
    public void closeWaypoint(Location loc)
    {
    	Waypoint waypoint = open_waypoints.remove(loc);
        closed_waypoints.put(loc, waypoint);
    }

    /**
     * Возвращает значение true, если коллекция закрытых путевых точек содержит путевую точку
     * для указанного местоположения.
     **/
    public boolean isLocationClosed(Location loc)
    {
    	return closed_waypoints.containsKey(loc);
    }
}
Кстати, обратите внимание, что мы не используем каких-то специальных библиотек или экзотических методов. Все стандартное.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, программирование, java, лабиринт




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Уроки по параллельному программированию C#
Фасадные работы
Задача с массой на Java