问题描述
||
我正在从Wikipedia的文章中的此伪代码实现A *搜索算法:
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
我被困在要求检索setSet中具有最低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> f_score =new HashMap<Point,Integer>();
g_score.put(start,0);
h_score.put(start,heuristic_cost_estimate(start,goal));
f_score.put(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;
}
解决方法
开放集最初包含您从中开始搜索的节点-起始节点。
openset := set containing the initial node // The set of tentative nodes to be evaluated.
至于重构路径部分-每次处理一个节点并发现可以从当前节点以较低的成本到达其邻居X
时,应将X
的came_from
条目设置为当前正在处理的节点。找到目标节点后,可以按照目标节点中的“ 5”条目来重建路径,直到到达源节点为止。您可以通过修改Point
类以使其具有一个名为ѭ5additional的附加字段来实现此目的。
从哈希表中提取具有最低值的节点的唯一方法是迭代哈希表。另一种选择是另外有一个树形图,它使您可以快速找到具有最小值的元素(或有一个专门的堆,例如二进制或斐波那契堆,它还允许您减少堆中元素的值)。
这是我最初学习A *的地方。