ブースト グラフにカスタム エッジ プロパティ ( MyWeight
) があり、ダイクストラ最短パス検索を適用したいと考えています。
私の重みのタイプは、boost::operators の助けを借りて、加算可能、減算可能、比較可能未満、比較可能です。
検索は何かから始めなければならないことを知っているので、ゼロに相当するものが必要であり、ノードが到達可能かどうかを調べるには、非常に大きな何かが必要です。
MyWeight weight_zero(...), weight_inf(...);
// now, weight_zero is less than all other weights, weight_inf greater than all other weights.
boost::dijkstra_shortest_paths( G, target_idx, boost::predecessor_map(&predecessors[0])
.distance_map(&distances[0])
.distance_inf(weight_inf)
.distance_zero(weight_zero)
);
これが私がカスタムウェイトを使用する原則です。gcc 4.8.1 ではコンパイルされますが (正しく動作するようです)、gcc 4.7.3 では次のエラーが発生します (少し短縮されています)。
/usr/include/c++/4.7/limits:-1: In instantiation of 'static constexpr _Tp std::numeric_limits<_Tp>::max() [with _Tp = MyWeight<2, MyEvaluator>]':
/usr/include/c++/4.7/limits:313: error: no matching function for call to 'MyWeight<2, MyEvaluator>::MyWeight(int)'
(MyWeight
実際はテンプレートです)
私はこのメッセージを「あなたのタイプには std::numeric_limit がありません」と解釈しますが、一方、BGL にどの極値を使用するかを伝えますが、数値制限を呼び出そうとする理由がわかりません。numeric_limits
ここで試す最善の方法は、カスタム データ型を認識させることだと思います。
誰かがそれを達成する方法を教えてもらえますか?
ここで最初のヒントを見つけましたが、この例ではdigits
andのようなメンバーを使用しdigits10
ており、それらがどこから来たのか知りたいです。
編集
これは私のような例です。コンパイルできません。エラーについては上記を参照してください。