I need help implementing the A * algorithm. When I run the algorithm, it finds the target, but the path is definitely not the shortest: -P
Here is my code, please help me find bugs! I think this may be the recovery path, which is my problem, but I'm not sure.
public class Pathfinder { public List<Node> aStar(Node start, Node goal, WeightedGraph graph) { Node x, y; int tentative_g_score; boolean tentative_is_better; FScoreComparator comparator = new FScoreComparator(); List<Node> closedset = new ArrayList<Node>(); Queue<Node> openset = new PriorityQueue<Node>(10, comparator); openset.add(start); start.g_score = 0; start.h_score = heuristic_cost_estimate(start, goal); start.f_score = start.h_score; while (!openset.isEmpty()) { x = openset.peek(); if (x == goal) { return reconstruct_path(goal); } x = openset.remove(); closedset.add(x); for (Edge e : graph.adj(x)) { if (ev == x) { y = ew; } else { y = ev; } if (closedset.contains(y) || y.illegal) { continue; } tentative_g_score = x.g_score + e.weight; if (!openset.contains(y)) { openset.add(y); tentative_is_better = true; } else if (tentative_g_score < y.g_score) { tentative_is_better = true; } else { tentative_is_better = false; } if (tentative_is_better) { y.g_score = tentative_g_score; y.h_score = heuristic_cost_estimate(y, goal); y.f_score = y.g_score + y.h_score; y.parent = x; } } } return null; } private int heuristic_cost_estimate(Node start, Node goal) { return Math.abs(start.x - goal.x) + Math.abs(start.y - goal.y); } private List<Node> reconstruct_path(Node current_node) { List<Node> result = new ArrayList<Node>(); while (current_node != null) { result.add(current_node); current_node = current_node.parent; } return result; } private class FScoreComparator implements Comparator<Node> { public int compare(Node n1, Node n2) { if (n1.f_score < n2.f_score) { return 1; } else if (n1.f_score > n2.f_score) { return -1; } else { return 0; } } }
}
Thanks everyone for the great answers! My A * algorithm now works great thanks to you guys! :-)
This was my first post, and this forum is really awesome!
java algorithm path a-star
Johan berg
source share