部分的に (?) 暗黙的なグラフで astar アルゴリズムを実行しています。これは大規模なページング データ ソースから構築されていますが、グラフは永続的です。astar アルゴリズムが完全にページインされていない領域に到達するたびに、グラフの新しい部分でページングを処理する必要があります。理想的には、astar 検索を完全にやり直す必要はありません。
私はいくつかの解決策を試しましたが、いくつかの障害にぶつかりました。明らかな何かが欠けているのか、問題に間違ってアプローチしているのか疑問に思っています。
現在ブースト 1.45 を使用していますが、1.51 にアップグレードする予定です。
最初に、astar ビジターを変更して、新しいデータをページングする必要があると判断したときに、グラフの関数を呼び出して読み込むようにしましたが、グラフは const であるため、これは不可能です。周りを見回したところ、これを可能にするために誰かが作業を行ったことを示唆するプレゼンテーションを参照するこの他の質問が暗黙のグラフと astar_search_no_init を後押ししていることがわかりましたが、実際のコードは利用できないようです。
次に、より多くのデータをページインする必要がある場所に到達したら、アルゴリズムを終了し、distance_map、predecessor_map、color_map の状態を保存して、それらを使用してデータを「再開」できるようにできるのではないかと考えました。 astar_search_no_init を使用して検索します。これが機能するかどうかはわかりません。astar_search_no_init を使用するように切り替えると、訪問者が経路探索の作業を行っているように見えますが、先行マップは空です。訪問者が完了したら、訪問者がどのようにパスを構築しているかを知る必要があります。
これが私のグラフの定義と、astar_search の呼び出し方法です。
typedef adjacency_list<
vecS,
vecS,
undirectedS,
VertexInfo, //contains geographic location
EdgeInfo, //contains weight information
no_property,
setS>
BoostGraph;
...
ColorMap cmap = get(vertex_color_t, myGraph);
astar_search(
myGraph,
source,
distance_heuristic(myGraph, destination), //geometric distance heuristic
predecessor_map(&srcPredmap[0]).
distance_map(&distMap[0]).
color_map(cmap).
visitor(astar_goal_visitor<vertex_descriptor>(destination, this)). //throws an exception when it finds the goal
weight_map(make_function_property_map<edge_descriptor>( //copied make_function_property_map functionality from boost 1.51 since I can't upgrade just yet
EdgeWeightAdjuster(&myGraph, weightFactors)))); //modifies edge weights based on weightFactors construct