I implement the A * search algorithm from this pseudo in a wikipedia article:
function A*(start,goal)
closedset := the empty set
openset := set containing the initial node
came_from := the empty map
g_score[start] := 0
h_score[start] := heuristic_cost_estimate(start, goal)
f_score[start] := h_score[start]
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
I am stuck on a line where I will be asked to extract a node in openSet with the lowest f value. When is the OpenSet option open? With what? Should it only start on first start?
I also don't unravel the path of recovery aliases:
ArrayList<Point> reconstructPath(Point cameFrom, Point current_node){
return null;
}
How should these pseudo instructions be implemented?
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()){
}
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){
return null;
}