17#include "absl/container/flat_hash_map.h"
18#include "absl/container/flat_hash_set.h"
29 : heap_index_(-1), distance_(0), distance_with_heuristic_(0), node_(-1) {}
33 bool operator<(
const Element& other)
const {
34 return distance_with_heuristic_ > other.distance_with_heuristic_;
36 void SetHeapIndex(
int h) { heap_index_ = h; }
37 int GetHeapIndex()
const {
return heap_index_; }
39 void set_distance_with_heuristic(int64_t distance_with_heuristic) {
40 distance_with_heuristic_ = distance_with_heuristic;
42 int64_t distance_with_heuristic() {
return distance_with_heuristic_; }
44 int64_t
distance()
const {
return distance_; }
45 void set_node(
int node) { node_ = node; }
46 int node()
const {
return node_; }
51 int64_t distance_with_heuristic_;
60 AStarSP(
int node_count,
int start_node, std::function<int64_t(
int,
int)> graph,
61 std::function<int64_t(
int)> heuristic, int64_t disconnected_distance)
62 : node_count_(node_count),
63 start_node_(start_node),
64 graph_(
std::move(graph)),
65 heuristic_(
std::move(heuristic)),
66 disconnected_distance_(disconnected_distance),
67 predecessor_(new int[node_count]),
68 elements_(node_count) {}
73 int SelectClosestNode(int64_t*
distance);
74 void Update(
int label);
75 void FindPath(
int dest, std::vector<int>*
nodes);
77 const int node_count_;
78 const int start_node_;
79 std::function<int64_t(
int,
int)> graph_;
80 std::function<int64_t(
int)> heuristic_;
81 const int64_t disconnected_distance_;
82 std::unique_ptr<int[]> predecessor_;
84 std::vector<Element> elements_;
85 absl::flat_hash_set<int> not_visited_;
86 absl::flat_hash_set<int> added_to_the_frontier_;
89void AStarSP::Initialize() {
90 for (
int i = 0; i < node_count_; i++) {
91 elements_[i].set_node(i);
92 if (i == start_node_) {
94 elements_[i].set_distance(0);
95 elements_[i].set_distance_with_heuristic(heuristic_(i));
96 frontier_.Add(&elements_[i]);
99 elements_[i].set_distance_with_heuristic(
kInfinity);
100 predecessor_[i] = start_node_;
101 not_visited_.insert(i);
106int AStarSP::SelectClosestNode(int64_t*
distance) {
107 const int node = frontier_.Top()->node();
108 *
distance = frontier_.Top()->distance();
110 not_visited_.erase(node);
111 added_to_the_frontier_.erase(node);
115void AStarSP::Update(
int node) {
116 for (absl::flat_hash_set<int>::const_iterator it = not_visited_.begin();
117 it != not_visited_.end(); ++it) {
118 const int other_node = *it;
119 const int64_t graph_node_i = graph_(node, other_node);
120 if (graph_node_i != disconnected_distance_) {
121 if (added_to_the_frontier_.find(other_node) ==
122 added_to_the_frontier_.end()) {
123 frontier_.Add(&elements_[other_node]);
124 added_to_the_frontier_.insert(other_node);
127 const int64_t other_distance = elements_[node].distance() + graph_node_i;
128 if (elements_[other_node].
distance() > other_distance) {
129 elements_[other_node].set_distance(other_distance);
130 elements_[other_node].set_distance_with_heuristic(
131 other_distance + heuristic_(other_node));
132 frontier_.NoteChangedPriority(&elements_[other_node]);
133 predecessor_[other_node] = node;
139void AStarSP::FindPath(
int dest, std::vector<int>*
nodes) {
142 while (predecessor_[j] != -1) {
143 nodes->push_back(predecessor_[j]);
151 while (!frontier_.IsEmpty()) {
153 int node = SelectClosestNode(&
distance);
157 }
else if (node == end_node) {
164 FindPath(end_node,
nodes);
170 std::function<int64_t(
int,
int)> graph,
171 std::function<int64_t(
int)> heuristic,
172 int64_t disconnected_distance, std::vector<int>*
nodes) {
173 AStarSP bf(node_count, start_node, std::move(graph), std::move(heuristic),
174 disconnected_distance);
bool ShortestPath(int end_node, std::vector< int > *nodes)
static const int64_t kInfinity
AStarSP(int node_count, int start_node, std::function< int64_t(int, int)> graph, std::function< int64_t(int)> heuristic, int64_t disconnected_distance)
static const int64_t kint64max
Collection of objects used to extend the Constraint Solver library.
bool AStarShortestPath(int node_count, int start_node, int end_node, std::function< int64_t(int, int)> graph, std::function< int64_t(int)> heuristic, int64_t disconnected_distance, std::vector< int > *nodes)