6 #ifndef MPL_GRAPH_SEARCH_H 7 #define MPL_GRAPH_SEARCH_H 19 template <
int Dim,
typename Coord>
44 if (ENV->is_goal(start_coord))
return 0;
48 if (ss_ptr->pq_.empty()) {
51 currNode_ptr = std::make_shared<State<Coord>>(start_coord);
53 currNode_ptr->h = ss_ptr->eps_ == 0 ? 0 : ENV->get_heur(start_coord);
54 decimal_t fval = currNode_ptr->g + ss_ptr->eps_ * currNode_ptr->h;
55 currNode_ptr->heapkey =
56 ss_ptr->pq_.push(std::make_pair(fval, currNode_ptr));
57 currNode_ptr->iterationopened =
true;
58 currNode_ptr->iterationclosed =
false;
59 ss_ptr->hm_[start_coord] = currNode_ptr;
62 int expand_iteration = 0;
66 currNode_ptr = ss_ptr->pq_.top().second;
68 currNode_ptr->iterationclosed =
true;
72 std::vector<decimal_t> succ_cost;
73 std::vector<int> succ_act_id;
75 ENV->get_succ(currNode_ptr->coord, succ_coord, succ_cost, succ_act_id);
79 for (
unsigned s = 0; s < succ_coord.size(); ++s) {
81 if (std::isinf(succ_cost[s]))
continue;
86 succNode_ptr = std::make_shared<State<Coord>>(succ_coord[s]);
88 ss_ptr->eps_ == 0 ? 0 : ENV->get_heur(succNode_ptr->coord);
100 succNode_ptr->pred_coord.push_back(currNode_ptr->coord);
101 succNode_ptr->pred_action_cost.push_back(succ_cost[s]);
102 succNode_ptr->pred_action_id.push_back(succ_act_id[s]);
107 decimal_t tentative_gval = currNode_ptr->g + succ_cost[s];
109 if (tentative_gval < succNode_ptr->g) {
117 succNode_ptr->g = tentative_gval;
119 decimal_t fval = succNode_ptr->g + (ss_ptr->eps_) * succNode_ptr->h;
122 if (succNode_ptr->iterationopened && !succNode_ptr->iterationclosed) {
124 if ((*succNode_ptr->heapkey).first < fval) {
125 std::cout <<
"UPDATE fval(old) = " 126 << (*succNode_ptr->heapkey).first << std::endl;
127 std::cout <<
"UPDATE fval = " << fval << std::endl;
131 (*succNode_ptr->heapkey).first = fval;
133 ss_ptr->pq_.increase(succNode_ptr->heapkey);
138 succNode_ptr->heapkey =
139 ss_ptr->pq_.push(std::make_pair(fval, succNode_ptr));
140 succNode_ptr->iterationopened =
true;
146 if (ENV->is_goal(currNode_ptr->coord))
break;
149 if (max_expand > 0 && expand_iteration >= max_expand) {
153 return std::numeric_limits<decimal_t>::infinity();
157 if (ss_ptr->pq_.empty()) {
160 return std::numeric_limits<decimal_t>::infinity();
165 decimal_t fval = ss_ptr->calculateKey(currNode_ptr);
167 fval, currNode_ptr->g);
172 if (ENV->is_goal(currNode_ptr->coord)) {
177 ss_ptr->expand_iteration_ = expand_iteration;
178 if (
recoverTraj(currNode_ptr, ss_ptr, ENV, start_coord, traj))
179 return currNode_ptr->g;
181 return std::numeric_limits<decimal_t>::infinity();
199 if (ENV->is_goal(start_coord)) {
211 currNode_ptr = std::make_shared<State<Coord>>(start_coord);
212 currNode_ptr->g = std::numeric_limits<decimal_t>::infinity();
213 currNode_ptr->rhs = 0;
214 currNode_ptr->h = ss_ptr->eps_ == 0 ? 0 : ENV->get_heur(start_coord);
215 currNode_ptr->heapkey = ss_ptr->pq_.push(
216 std::make_pair(ss_ptr->calculateKey(currNode_ptr), currNode_ptr));
217 currNode_ptr->iterationopened =
true;
218 currNode_ptr->iterationclosed =
false;
219 ss_ptr->hm_[start_coord] = currNode_ptr;
223 StatePtr<Coord> goalNode_ptr = std::make_shared<State<Coord>>(Coord());
224 if (!ss_ptr->best_child_.empty() &&
225 ENV->is_goal(ss_ptr->best_child_.back()->coord)) {
226 goalNode_ptr = ss_ptr->best_child_.back();
230 "goalNode fval: %f, g: %f, rhs: %f!\n" ANSI_COLOR_RESET,
231 ss_ptr->calculateKey(goalNode_ptr), goalNode_ptr->g,
235 goalNode_ptr->g = std::numeric_limits<decimal_t>::infinity();
236 goalNode_ptr->rhs = std::numeric_limits<decimal_t>::infinity();
239 printf(
"goalNode key: %f\n", ss_ptr->calculateKey(goalNode_ptr));
242 int expand_iteration = 0;
243 while (ss_ptr->pq_.top().first < ss_ptr->calculateKey(goalNode_ptr) ||
244 goalNode_ptr->rhs != goalNode_ptr->g) {
247 currNode_ptr = ss_ptr->pq_.top().second;
249 currNode_ptr->iterationclosed =
true;
251 if (currNode_ptr->g > currNode_ptr->rhs)
252 currNode_ptr->g = currNode_ptr->rhs;
254 currNode_ptr->g = std::numeric_limits<decimal_t>::infinity();
255 ss_ptr->updateNode(currNode_ptr);
261 std::vector<decimal_t> succ_cost = currNode_ptr->succ_action_cost;
262 std::vector<int> succ_act_id = currNode_ptr->succ_action_id;
264 bool explored = !currNode_ptr->succ_coord.empty();
266 ENV->get_succ(currNode_ptr->coord, succ_coord, succ_cost, succ_act_id);
267 currNode_ptr->succ_coord.resize(succ_coord.size());
268 currNode_ptr->succ_action_id.resize(succ_coord.size());
269 currNode_ptr->succ_action_cost.resize(succ_coord.size());
274 std::vector<decimal_t> succ_cost;
275 std::vector<int> succ_act_id;
277 ENV->get_succ(currNode_ptr->coord, succ_coord, succ_cost, succ_act_id);
278 currNode_ptr->succ_coord.resize(succ_coord.size());
279 currNode_ptr->succ_action_id.resize(succ_coord.size());
280 currNode_ptr->succ_action_cost.resize(succ_coord.size());
284 for (
size_t s = 0; s < succ_coord.size(); ++s) {
288 succNode_ptr = std::make_shared<State<Coord>>(succ_coord[s]);
290 ss_ptr->eps_ == 0 ? 0 : ENV->get_heur(succNode_ptr->coord);
294 currNode_ptr->succ_coord[s] = succ_coord[s];
295 currNode_ptr->succ_action_id[s] = succ_act_id[s];
296 currNode_ptr->succ_action_cost[s] = succ_cost[s];
299 for (
unsigned int i = 0; i < succNode_ptr->pred_coord.size(); i++) {
300 if (succNode_ptr->pred_coord[i] == currNode_ptr->coord) {
306 succNode_ptr->pred_coord.push_back(currNode_ptr->coord);
307 succNode_ptr->pred_action_cost.push_back(succ_cost[s]);
308 succNode_ptr->pred_action_id.push_back(succ_act_id[s]);
311 ss_ptr->updateNode(succNode_ptr);
315 if (ENV->is_goal(currNode_ptr->coord)) goalNode_ptr = currNode_ptr;
318 if (max_expand > 0 && expand_iteration >= max_expand) {
323 return std::numeric_limits<decimal_t>::infinity();
327 if (ss_ptr->pq_.empty()) {
331 return std::numeric_limits<decimal_t>::infinity();
339 ss_ptr->calculateKey(goalNode_ptr), goalNode_ptr->g,
351 if (ENV->is_goal(goalNode_ptr->coord))
355 "Terminated for unknown reason!!!!!!\n\n" ANSI_COLOR_RESET);
358 ss_ptr->expand_iteration_ = expand_iteration;
361 if (
recoverTraj(goalNode_ptr, ss_ptr, ENV, start_coord, traj))
362 return goalNode_ptr->g - ss_ptr->start_g_;
364 return std::numeric_limits<decimal_t>::infinity();
374 ss_ptr->best_child_.clear();
375 bool find_traj =
false;
378 while (!currNode_ptr->pred_coord.empty()) {
380 std::cout <<
"t: " << currNode_ptr->coord.t
381 <<
" pos: " << currNode_ptr->coord.pos.transpose()
382 <<
" vel: " << currNode_ptr->coord.vel.transpose()
384 printf(
"g: %f, rhs: %f, h: %f\n", currNode_ptr->g, currNode_ptr->rhs,
387 ss_ptr->best_child_.push_back(currNode_ptr);
389 decimal_t min_rhs = std::numeric_limits<decimal_t>::infinity();
390 decimal_t min_g = std::numeric_limits<decimal_t>::infinity();
391 for (
unsigned int i = 0; i < currNode_ptr->pred_coord.size(); i++) {
392 Coord key = currNode_ptr->pred_coord[i];
393 if (min_rhs > ss_ptr->hm_[key]->g + currNode_ptr->pred_action_cost[i]) {
394 min_rhs = ss_ptr->hm_[key]->g + currNode_ptr->pred_action_cost[i];
395 min_g = ss_ptr->hm_[key]->g;
397 }
else if (!std::isinf(currNode_ptr->pred_action_cost[i]) &&
398 min_rhs == ss_ptr->hm_[key]->g +
399 currNode_ptr->pred_action_cost[i]) {
400 if (min_g < ss_ptr->hm_[key]->g) {
401 min_g = ss_ptr->hm_[key]->g;
408 Coord key = currNode_ptr->pred_coord[min_id];
409 int action_idx = currNode_ptr->pred_action_id[min_id];
410 currNode_ptr = ss_ptr->hm_[key];
412 ENV->forward_action(currNode_ptr->coord, action_idx, pr);
417 "Trace back failure, the number of " 419 currNode_ptr->pred_coord.size());
420 for (
size_t i = 0; i < currNode_ptr->pred_coord.size(); i++) {
421 Coord key = currNode_ptr->pred_coord[i];
423 "i: %zu, t: %f, g: %f, rhs: %f, action cost: " 424 "%f\n" ANSI_COLOR_RESET,
425 i, key.t, ss_ptr->hm_[key]->g, ss_ptr->hm_[key]->rhs,
426 currNode_ptr->pred_action_cost[i]);
433 if (currNode_ptr->coord == start_key) {
434 ss_ptr->best_child_.push_back(currNode_ptr);
437 std::cout <<
"t: " << currNode_ptr->coord.t
438 <<
" pos: " << currNode_ptr->coord.pos.transpose()
440 printf(
"g: %f, rhs: %f, h: %f\n", currNode_ptr->g, currNode_ptr->rhs,
448 std::reverse(prs.begin(), prs.end());
449 std::reverse(ss_ptr->best_child_.begin(), ss_ptr->best_child_.end());
Definition: map_util.h:12
#define ANSI_COLOR_RED
Set red font in printf funtion.
Definition: data_type.h:16
#define ANSI_COLOR_GREEN
Set green font in printf funtion.
Definition: data_type.h:20
GraphSearch class.
Definition: graph_search.h:20
Trajectory class.
Definition: trajectory.h:43
bool verbose_
Verbose flag.
Definition: graph_search.h:457
std::vector< T, Eigen::aligned_allocator< T > > vec_E
Pre-allocated std::vector for Eigen using vec_E.
Definition: data_type.h:53
decimal_t Astar(const Coord &start_coord, const std::shared_ptr< env_base< Dim >> &ENV, std::shared_ptr< StateSpace< Dim, Coord >> &ss_ptr, Trajectory< Dim > &traj, int max_expand=-1)
Astar graph search.
Definition: graph_search.h:39
GraphSearch(bool verbose=false)
Simple empty constructor.
Definition: graph_search.h:27
State space.
Definition: state_space.h:83
double decimal_t
Rename the float type used in lib.
Definition: data_type.h:49
bool recoverTraj(StatePtr< Coord > currNode_ptr, std::shared_ptr< StateSpace< Dim, Coord >> ss_ptr, const std::shared_ptr< env_base< Dim >> &ENV, const Coord &start_key, Trajectory< Dim > &traj)
Recover trajectory.
Definition: graph_search.h:369
decimal_t LPAstar(const Coord &start_coord, const std::shared_ptr< env_base< Dim >> &ENV, std::shared_ptr< StateSpace< Dim, Coord >> &ss_ptr, Trajectory< Dim > &traj, int max_expand=-1)
Lifelong Planning Astar graph search.
Definition: graph_search.h:194
state space class for graph search
#define ANSI_COLOR_RESET
Reset font color in printf funtion.
Definition: data_type.h:40
Base environment class.
Definition: env_base.h:17
std::shared_ptr< State< Coord > > StatePtr
Declare StatePtr.
Definition: state_space.h:74
Primitive class.
Definition: primitive.h:206