我正在尝试在Javascript中实现A star算法。但我面临的问题是在heuristic_cost_estimate函数中。我不知道如何实现这一点。因为在哪里定义了这个函数。我不想要整个代码,只需要函数。
function A*(start,goal)
closedset := the empty set // The set of nodes already evaluated.
openset := {start} // The set of tentative nodes to be evaluated, initially containing the start node
came_from := the empty map // The map of navigated nodes.
g_score[start] := 0 // Cost from start along best known path.
// Estimated total cost from start to goal through y.
*************************************************** heurisctic function******************
f_score[start] := g_score[start] + ***heuristic_cost_estimate(start, goal)***
while openset is not empty
current := the node in openset having the lowest f_score[] value
if current = goal
return reconstruct_path(came_from, goal)
remove current from openset
add current to closedset
for each neighbor in neighbor_nodes(current)
if neighbor in closedset
continue
tentative_g_score := g_score[current] + dist_between(current,neighbor)
if neighbor not in openset or tentative_g_score < g_score[neighbor]
add neighbor to openset
came_from[neighbor] := current
g_score[neighbor] := tentative_g_score
f_score[neighbor] := g_score[neighbor] + heuristic_cost_estimate(neighbor, goal)
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
答案 0 :(得分:2)
该功能未预先定义,因为它根据您使用A*
的内容进行更改。启发式必须适合您实际尝试解决的问题,并且必须遵循一定的规则(志浩链接的答案似乎拼写出来)。
所以基本上:你必须决定什么是有意义的启发式用于你的实际问题,然后在函数中实现它。不只有一个。
请注意,启发式“更好”接近真实费用,搜索速度就越快。
答案 1 :(得分:1)
This post在A *搜索的上下文中对适当的启发式函数提供了很好的解释。
根据我的理解,它应该提供一种快速的方法来估算从开始到结束节点的成本(无论你定义的成本是什么),同时通过你正在考虑的节点。它用于帮助确定到达终端节点应该采用的最佳路径。
以下是有关heuristic functions的更多信息。
答案 2 :(得分:0)
A *的启发式功能取决于您使用的图形的类型以及在其中移动的适用规则。 我知道的最简单的功能之一适合在基本网格中进行4方向移动(上,下,左,右),称为Manhattan distance,看起来可能很简单:
function manhattan (pos0, pos1) {
var d1 = Math.abs(pos1.x - pos0.x);
var d2 = Math.abs(pos1.y - pos0.y);
return d1 + d2;
}
但是,如果您的环境允许对角线移动,那么您需要另一种启发式类型,该类型可以支持8个方向:
function diagonal (pos0, pos1) {
var D = 1;
var D2 = Math.sqrt(2);
var d1 = Math.abs(pos1.x - pos0.x);
var d2 = Math.abs(pos1.y - pos0.y);
return (D * (d1 + d2)) + ((D2 - (2 * D)) * Math.min(d1, d2));
}
当然,这些只是示例,还有其他答案中指出的其他例子。
通常来说,很好地解释此算法似乎很简单。但是编码是另一项任务,对于初学者来说可能是一个很大的挑战。我建议检查一些以您选择的语言编写的工作库。然后,您可以根据需要对其进行调整,或者从头开始编写自己的内容。
更多链接: