陷入困境执行维基百科的 A*(“A 星”)算法
我正在从维基百科的文章中的这个伪代码实现 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
我被要求检索 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;
}
I'm implementing the A* search algorithm from this pseudo on wikipedia's article:
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
I'm stuck on the line where I'm asked to retrive the node in openSet with the lowest f value.
When has openSet been filled? With what? Should it just have start on the first run?
I also don't undestand the reconstruct path pseudo:
ArrayList<Point> reconstructPath(Point cameFrom, Point current_node){
//if came_from[current_node] is set //what does it mean "ïs set"?
//???
return null;
}
How should that 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()){
// 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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
开集最初包含您开始搜索的节点 - 起始节点。
至于重建路径部分 - 每次处理一个节点并发现它的邻居
X
可以从当前节点以较低的成本到达时,您应该设置came_from
条目X
到您当前正在处理的节点。找到目标节点后,您可以按照来自目标节点的came_from
条目重建路径,直到到达源节点。您可以通过修改Point
类以添加一个名为came_from
的附加字段来实现此目的。从哈希表中提取具有最低值的节点的唯一方法是迭代哈希表。另一种方法是额外拥有一个树图,它允许您快速找到具有最小值的元素(或者拥有一个专门的堆,例如二元堆或斐波那契堆,它还允许您减少堆内元素的值)。
这是我最初学习 A* 的地方。
The open set initially contains the node that you start your search from - the starting node.
As for the reconstruct path part - each time you process a node and find its neighbour
X
can be reached with a lower cost from the current node, you should set thecame_from
entry ofX
to the node you're currently processing. Once you find the destination node, you reconstruct the path by following thecame_from
entries from the destination node until you reach to source node. You can implement this by modifying thePoint
class to have an additional field calledcame_from
.The only way to extract the node with the lowest value from the hash table is to iterate through the hash table. An alternative is to additionally have a tree map which will allow you to quickly find the element with the smallest value (or have a specialized heap, e.g. binary or Fibonacci heap which additionally allows you to decrease values of elements within the heap).
This is where I originally learned A*.