我在 openSet 上使用 std::priority_queue 实现 A* 算法。在算法的某个时刻,如维基百科伪代码:
else if tentative_g_score < g_score[neighbor]
tentative_is_better := true
其次是
if tentative_is_better = true
came_from[neighbor] := current
g_score[neighbor] := tentative_g_score
f_score[neighbor] := g_score[neighbor] + h_score[neighbor]
意味着必须对 priority_queue 执行搜索并更改其中一个元素的值,这是不可能的(据我所知)。
此外,在这一行:
if neighbor not in openset
一个人不能在优先队列上搜索,所以如果不能在优先队列上实现,我通过创建一个 std::set 解决了这个问题,它只告诉我们哪些元素在 openSet 上(这样当我添加/删除一个元素到openSet,我添加/删除到 std::set 和 std::priority_queue)。
所以,我想知道如何避免第一个问题,或者应该将哪个 std::container 真正用于这个特定的(但一般的 A*)实现。
更一般地说,我想知道哪种方法是使用 std 容器的 A* 的有效方法?