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 で検索を実行し、その要素の 1 つの値を変更する必要がありますが、これは不可能です (私が理解している限り)。
また、この行で:
if neighbor not in openset
優先度キューで検索できないため、これをpriority_queueで実装できない場合は、openSetにある要素のみを通知するstd::setを作成することで解決しました(そのため、1つの要素を追加/削除するとstd::set と std::priority_queue の両方に追加/削除します)。
したがって、最初の問題をどのように回避できるか、またはこの特定の (まだ一般的な A*) 実装にどの std::container を実際に使用する必要があるのか 疑問に思います。
より一般的に言えば、std コンテナーを使用した A* への効率的なアプローチはどれでしょうか?