gpt4 book ai didi

java - 坚持执行维基百科的 A* ("A star") 算法

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:43 26 4
gpt4 key购买 nike

我正在维基百科的这篇文章中实现 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;

}

最佳答案

开放集最初包含您开始搜索的节点 - 起始节点。

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

至于重建路径部分——每次你处理一个节点并找到它的邻居X可以从当前节点以较低的成本到达,您应该设置 came_from输入 X到您当前正在处理的节点。找到目标节点后,您可以按照 came_from 重建路径。从目标节点开始的条目,直到到达源节点。您可以通过修改 Point 来实现这一点类有一个名为 came_from 的附加字段.

从哈希表中提取具有最低值的节点的唯一方法是遍历哈希表。另一种方法是另外有一个 TreeMap ,它可以让您快速找到具有最小值的元素(或者有一个专门的堆,例如二叉堆或斐波那契堆,它还可以让您减少堆内元素的值)。

This是我最初学习 A* 的地方。

关于java - 坚持执行维基百科的 A* ("A star") 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6158321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com