На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Лабиринты 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, лабиринт

Читайте также:




Заливка и извлечение изображений из базы sqlite на C#
Фасадные работы


© upread.ru 2013-2022
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.