21namespace shortest_path {
49 typename F1 = std::function<
typename TGraph::edge_type::weight_type(
const TNode &)>,
50 typename F2 = std::function<void(
const TNode &,
const typename TGraph::edge_type::weight_type &)>>
57 F2 f_user = [](
const TNode &,
58 const typename TGraph::edge_type::weight_type &) {});
63 typename F1 = std::function<
typename TGraph::edge_type::weight_type(
const TNode &,
const TNode &)>
71 return findPath(
graph,
start, goal, [&](
const TNode &n) {
return f_heuristic(goal, n); });
78 template<
typename TNode,
typename TWeight>
87 template<
typename FEdges,
typename TNode,
typename TWeight,
typename F1,
typename F2,
typename F3>
88 static bool relaxation(FEdges successor_edges,
89 Data<TNode, TWeight> &data,
96 template<
typename TNode,
typename TWeight,
typename F>
97 inline static void init(GreedyBestFS::Data<TNode, TWeight> &data,
const TNode &
start, F f_heuristic);
105template<
typename TGraph,
typename TNode,
typename F1,
typename F2>
112 using weight_type =
typename TGraph::edge_type::weight_type;
114 Data<TNode, weight_type> data;
117 init(data,
start, f_heuristic);
119 while (!data.queue.empty()) {
120 bool stop = relaxation([&](
const auto &
node) ->
auto {
return graph.successorEdges(
node); },
124 [&goal](
const TNode &n) ->
bool {
return goal == n; });
136template<
typename FEdges,
typename TNode,
typename TWeight,
typename F1,
typename F2,
typename F3>
138GreedyBestFS::relaxation(FEdges successor_edges,
139 GreedyBestFS::Data<TNode, TWeight> &data,
143 TNode n = data.queue.begin()->second;
144 data.queue.erase(data.queue.begin());
147 f_user(n, data.g[n]);
154 for (
const auto &s_edge: successor_edges(n)) {
158 if (s_edge.weight() < 0) {
159 throw std::out_of_range(
"GreedyBestFS: Detect negative weight on edge in graph.");
163 TWeight gscore = data.g.at(n) + s_edge.weight();
166 auto search_g = data.g.find(s);
169 if (search_g == data.g.end() || data.g.at(s) > gscore) {
171 data.p.insert_or_assign(s, n);
172 if (search_g == data.g.end()) {
183template<
typename TNode,
typename TWeight,
typename F>
184void GreedyBestFS::init(GreedyBestFS::Data<TNode, TWeight> &data,
const TNode &
start, F f_heuristic) {
Class extending the map class from the standard library. Original reason is to allow printing of the ...
Definition: map.hpp:48
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
static ext::pair< ext::vector< TNode >, TWeight > reconstructWeightedPath(const ext::map< TNode, TNode > &p, const ext::map< TNode, TWeight > &g, const TNode &start, const TNode &goal)
Definition: ReconstructPath.hpp:132
static TNode const & other(const TEdge &e, const TNode &n)
Definition: GreedyBestFS.hpp:23
static ext::pair< ext::vector< TNode >, typename TGraph::edge_type::weight_type > findPath(const TGraph &graph, const TNode &start, const TNode &goal, F1 f_heuristic, F2 f_user=[](const TNode &, const typename TGraph::edge_type::weight_type &) {})
Definition: GreedyBestFS.hpp:107
static ext::pair< ext::vector< TNode >, typename TGraph::edge_type::weight_type > findPathRegistration(const TGraph &graph, const TNode &start, const TNode &goal, F1 f_heuristic)
Definition: GreedyBestFS.hpp:67
constexpr auto make_pair(T1 &&x, T2 &&y)
Definition: pair.hpp:79
Definition: ReconstructPath.hpp:14
void start(measurements::stealth_string name, measurements::Type type)
Definition: measurements.cpp:14