Застрял в реализации алгоритма A * ("Звезды") из Википедии - PullRequest
3 голосов
/ 28 мая 2011

Я реализую алгоритм поиска A * из этой псевдо статьи Wikipedia:

function A*(start,goal)
     closedset := the empty set    // The set of nodes already evaluated.
     openset := set containing the initial node    // The set of tentative nodes to be evaluated.
     came_from := the empty map    // The map of navigated nodes.

     g_score[start] := 0    // Cost from start along best known path.
     h_score[start] := heuristic_cost_estimate(start, goal)
     f_score[start] := h_score[start]    // Estimated total cost from start to goal through y.

     while openset is not empty
         x := the node in openset having the lowest f_score[] value
         if x = goal
             return reconstruct_path(came_from, came_from[goal])

         remove x from openset
         add x to closedset
         foreach y in neighbor_nodes(x)
             if y in closedset
                 continue
             tentative_g_score := g_score[x] + dist_between(x,y)

             if y not in openset
                 add y to openset
                 tentative_is_better := true
             else if tentative_g_score < g_score[y]
                 tentative_is_better := true
             else
                 tentative_is_better := false

             if tentative_is_better = true
                 came_from[y] := x
                 g_score[y] := tentative_g_score
                 h_score[y] := heuristic_cost_estimate(y, goal)
                 f_score[y] := g_score[y] + h_score[y]

     return failure


 function reconstruct_path(came_from, current_node)
     if came_from[current_node] is set
         p = reconstruct_path(came_from, came_from[current_node])
         return (p + current_node)
     else
         return current_node

Я застрял на линии, где меня просят извлечь узел в openSet с самым низким значением f. Когда был заполнен openSet? С чем? Должен ли он просто запускаться при первом запуске?

Я также не понимаю псевдо-путь восстановления:

 ArrayList<Point> reconstructPath(Point cameFrom, Point current_node){

        //if came_from[current_node] is set //what does it mean "ïs set"?
        //???
        return null;

    }

Как реализовать эти псевдоинструкции?

 boolean AStar (Point start, Point goal){

        HashSet <Point>closedSet = new HashSet<Point>();
        HashSet <Point>openSet = new HashSet<Point>();
        HashMap <Point,Point> came_from = new HashMap<Point, Point>();

        HashMap <Point, Integer> g_score = new HashMap<Point, Integer>();
        HashMap <Point, Integer> h_score =new HashMap<Point,Integer>();
        HashMap <Point,Integer> f_score =new HashMap<Point,Integer>();

        g_score.put(start, 0);
        h_score.put(start, heuristic_cost_estimate(start,goal));
        f_score.put(start, heuristic_cost_estimate(start,goal));


        openSet.add(start);
        while(!openSet.isEmpty()){

            // x := the node in openset having the lowest f_score[] value
            //????
        }

        return false;

    }

 Integer heuristic_cost_estimate(Point start, Point goal){

        double minusI = (start.I-goal.I);
        int minusIi =(int)Math.pow(minusI,2.0D);

        double minusJ = (start.J-goal.J);
        int minusIj =(int)Math.pow(minusJ,2.0D);

        int ri = minusIj + minusIi;

        Integer result = new Integer(ri); 

        return result;


    }



ArrayList<Point> reconstructPath(Point cameFrom, Point current_node){

        //if came_from[current_node] is set //what does it mean "ïs set"?
        //???
        return null;

    }

1 Ответ

1 голос
/ 28 мая 2011

Открытый набор изначально содержит узел, с которого вы начинаете поиск - начальный узел.

openset := set containing the initial node    // The set of tentative nodes to be evaluated.

Что касается части пути восстановления - каждый раз, когда вы обрабатываете узел и находите его соседа, X может быть достигнут с более низкой стоимостью от текущего узла, вы должны установить запись came_from для X для узла вы сейчас обрабатываете. Найдя узел назначения, вы восстанавливаете путь, следуя записям came_from от узла назначения, пока не достигнете узла источника. Вы можете реализовать это, изменив класс Point, добавив в него дополнительное поле с именем came_from.

Единственный способ извлечь узел с наименьшим значением из хеш-таблицы - это перебрать хеш-таблицу. Альтернативой является наличие дополнительной карты дерева, которая позволит вам быстро найти элемент с наименьшим значением (или иметь специальную кучу, например, двоичную или кучу Фибоначчи, которая дополнительно позволяет уменьшить значения элементов в куче).

Это , где я первоначально изучил A *.

...