This repo provides implementation for three Path-Planning Algorithms: A* with strict visited list, Lifelong Planning A* and D* Lite final version A* with strict visited list
q priority queue
max_q_size unsigned int
expansions hash table
final_path string
run_time long long
is_found bool
q.push start
while q is not empty and q.top != goal
curr = q.pop
if curr has not been visited
expansions.insert curr.state
foreach neighbour of curr
if neighbour has not been visited
if q does not contain neighbour
q.push neighbour
else
update q with neighbour
if q.empty
final_path = ""
else
final_path = q.top.path
matrix 2D dynamic array
start, goal tuple
hfunc function object
q priority queue
max_q_size unsigned int
expansions hash table
path string
run_time long long
initialize
q.reset
at(start).r = 0
q.push start
update_vertex(s)
if s.cell != start
minimum = huge
foreach neighbour of s.cell
minimum = min(minimum, (at(neighbour).g + cost()))
s.r = minimum
q.remove s.cell
if s.g != s.r
q.push s.cell
update_neighbours_of(cell)
foreach neighbour of cell
if !at(neighbour).bad
update_vertex(at(neighbour));
compute_shortest_path
while (!q.empty and key(at(q.top)) < key(at(goal)) or at(goal).r != at(goal).g
c = q.pop
if at(c).g > at(c).r
at(c).g = at(c).r
else
at(c).g = huge
update_vertex at c
update_neighbours_of c
max_q_size = max(max_q_size, q.size())
expansions.insert c
path = build_path
plan
initialize
compute_shortest_path
replan(cells_to_toggle)
foreach cell of cells_to_toggle
at(cell).bad = !at(cell).bad
if !at(cell).bad
update_vertex at cell
else
at(cell).g = at(cell).r = huge
update_neighbours_of cell
compute_shortest_path
matrix 2D dynamic array
start, goal tuple
hfunc function object
km int
q priority queue
old_keys hash table
max_q_size unsigned int
expansions hash table
path string
run_time long long
initialize
q.reset
km = at(goal).r = 0
q.push goal
old_keys.insert key(goal, { at(goal), km } )
update_vertex(s)
if s.cell != goal
minimum = huge
foreach neighbour of s.cell
minimum = min(minimum, (at(neighbour).g + cost()))
s.r = minimum
q.remove s.cell
if s.g != s.)
q.push s.cell
old_keys.update_with tuple({ s.cell, Key{ s, km })
update_neighbours_of(cell)
foreach neighbour of cell
if !at(neighbour).bad
update_vertex(at(neighbour))
compute_shortest_path
while !q.empty() && ((key(at(q.top)) < key(at(start)) || at(start).r != at(start).g))
c = q.pop
if old_keys.at(c) < key(at(c), km)
q.push c
old_keys.update_with tuple( c, Key{ at(c), km })
else if at(c).g > at(c).r
at(c).g = at(c).r
update_neighbours_of c
else
at(c).g = huge
update_vertex at c
update_neighbours_of c
max_q_size = max(max_q_size, q.size)
expansions.insert c
initial_plan
initialize
compute_shortest_path
plan(changes, move_to, use_path)
initial_plan
last = start
curr = start
i = 0
while curr != goal
curr = min(neighbours of curr)
move_to curr
if i != changes.length
km += hfunc(this_loop.last, this_loop.curr)
last = curr
foreach cell of changes[i]
at(cell).bad = !at(cell).bad
if !at(cell).bad
update_vertex at cell
else
at(cell).g = at(cell).r = huge
update_neighbours_of cell
++i
compute_shortest_path
use_path build_path(this_loop.curr, goal)