将 A* 与目标外部图一起使用
Using A* with target ouside graph
我的目标是找到 A 和 B 之间的最短路径,但 B 可能在已知图形之外。目前我的成本函数运行良好,启发式函数是 3D euclidean。
为了解决target可能在图外的问题,我试过在优先级值停止变化一定时间后退出算法,但没有成功。算法吐出了一条随机路径。
我之所以没有 select 一个最接近目标的节点,是因为如果我 select 该算法肯定会尝试到达该点。在我的应用程序中,我将在新信息出现时重新运行算法(即更新可能包含目标的图表)。
所以我需要的是找到一条最接近目标外部图且成本最低的路径。我不希望得到代码或任何答案,但非常感谢任何关于如何解决此类问题的评论。
下面,我添加了我的 A* 实现,PriorityQueue 只是 heapq 的包装器。
def a_star_search(mesh, start, goal):
frontier = PriorityQueue()
frontier.put(start, 0)
came_from = {}
cost_so_far = {}
came_from[start] = None
cost_so_far[start] = 0
while not frontier.empty():
current = frontier.get()
if current == goal:
break
for i, next in enumerate(list(mesh.neighbors(current))):
new_cost = cost_so_far[current] + mesh.cost(current, next)
if next not in cost_so_far or new_cost < cost_so_far[next]:
cost_so_far[next] = new_cost
priority = new_cost + mesh.heuristic(next, goal) / mesh.unit
frontier.put(next, priority)
came_from[next] = current
return came_from, cost_so_far
目标在图表内部时的示例结果
甚至意味着“接近”图表中没有的东西是什么意思?如果目标节点可以出现在任何地方,那么预先计算任何东西都是没有意义的,因为你必须在它出现后重新开始。如果您知道它最终会出现在哪里,那么现在就将它添加到图形中并计算您的路径,然后在(当前)已知图形的边缘截断结果。
您能否将 goal
添加到您的图形中(连接到每个其他节点,大概使用您的网格使用的任何距离度量)?或者,如果您不想修改网格数据结构,则可以循环 list(mesh.neighbors(current))+goal
(在更新 new_cost = …
以处理该情况后)。
如果我误解了什么,我深表歉意,这根本不适用……
您可以最小化到达节点的成本加上从该节点到达目标的估计成本。一旦您知道完整的网格,就不能保证它是最佳的,但根据您的启发式,它应该是一个合理的猜测。
我的目标是找到 A 和 B 之间的最短路径,但 B 可能在已知图形之外。目前我的成本函数运行良好,启发式函数是 3D euclidean。
为了解决target可能在图外的问题,我试过在优先级值停止变化一定时间后退出算法,但没有成功。算法吐出了一条随机路径。
我之所以没有 select 一个最接近目标的节点,是因为如果我 select 该算法肯定会尝试到达该点。在我的应用程序中,我将在新信息出现时重新运行算法(即更新可能包含目标的图表)。
所以我需要的是找到一条最接近目标外部图且成本最低的路径。我不希望得到代码或任何答案,但非常感谢任何关于如何解决此类问题的评论。
下面,我添加了我的 A* 实现,PriorityQueue 只是 heapq 的包装器。
def a_star_search(mesh, start, goal):
frontier = PriorityQueue()
frontier.put(start, 0)
came_from = {}
cost_so_far = {}
came_from[start] = None
cost_so_far[start] = 0
while not frontier.empty():
current = frontier.get()
if current == goal:
break
for i, next in enumerate(list(mesh.neighbors(current))):
new_cost = cost_so_far[current] + mesh.cost(current, next)
if next not in cost_so_far or new_cost < cost_so_far[next]:
cost_so_far[next] = new_cost
priority = new_cost + mesh.heuristic(next, goal) / mesh.unit
frontier.put(next, priority)
came_from[next] = current
return came_from, cost_so_far
目标在图表内部时的示例结果
甚至意味着“接近”图表中没有的东西是什么意思?如果目标节点可以出现在任何地方,那么预先计算任何东西都是没有意义的,因为你必须在它出现后重新开始。如果您知道它最终会出现在哪里,那么现在就将它添加到图形中并计算您的路径,然后在(当前)已知图形的边缘截断结果。
您能否将 goal
添加到您的图形中(连接到每个其他节点,大概使用您的网格使用的任何距离度量)?或者,如果您不想修改网格数据结构,则可以循环 list(mesh.neighbors(current))+goal
(在更新 new_cost = …
以处理该情况后)。
如果我误解了什么,我深表歉意,这根本不适用……
您可以最小化到达节点的成本加上从该节点到达目标的估计成本。一旦您知道完整的网格,就不能保证它是最佳的,但根据您的启发式,它应该是一个合理的猜测。