Google OR-Tools: ortools/constraint_solver/routing_index_manager.cc Source File
20#include "absl/container/flat_hash_set.h"
22#include "absl/types/span.h"
36 const std::vector<NodeIndex>& starts,
37 const std::vector<NodeIndex>& ends) {
40 std::vector<std::pair<NodeIndex, NodeIndex>> starts_ends(num_vehicles);
53void RoutingIndexManager::Initialize(
54 int num_nodes, int num_vehicles,
55 const std::vector<std::pair<NodeIndex, NodeIndex>>& starts_ends) {
56 static const NodeIndex kZeroNode(0);
60 CHECK_EQ(num_vehicles_, starts_ends.size());
61 absl::flat_hash_set<NodeIndex> starts;
62 absl::flat_hash_set<NodeIndex> ends;
63 absl::flat_hash_set<NodeIndex> unique_depots;
64 for (const std::pair<NodeIndex, NodeIndex>& start_end : starts_ends) {
65 const NodeIndex start = start_end.first;
68 CHECK_GE(end, 0);
69 CHECK_LE(start, num_nodes_);
70 CHECK_LE(end, num_nodes_);
72 ends.insert(end);
73 unique_depots.insert(start);
74 unique_depots.insert(end);
76 num_unique_depots_ = unique_depots.size();
77 const int size = num_nodes_ + num_vehicles_ - num_unique_depots_;
79 index_to_node_.resize(size + num_vehicles_);
81 vehicle_to_start_.resize(num_vehicles_);
82 vehicle_to_end_.resize(num_vehicles_);
84 for (NodeIndex i = kZeroNode; i < num_nodes_; ++i) {
85 if (starts.contains(i) || !ends.contains(i)) {
91 absl::flat_hash_set<NodeIndex> seen_starts;
92 for (int i = 0; i < num_vehicles_; ++i) {
93 const NodeIndex start = starts_ends[i].first;
94 if (!seen_starts.contains(start)) {
96 const int64_t start_index = node_to_index_[start];
97 vehicle_to_start_[i] = start_index;
100 vehicle_to_start_[i] = index;
101 index_to_node_[index] = start;
105 for (int i = 0; i < num_vehicles_; ++i) {
107 index_to_node_[index] = end;
108 vehicle_to_end_[i] = index;
114 VLOG(1) << "Number of nodes: " << num_nodes_;
115 VLOG(1) << "Number of vehicles: " << num_vehicles_;
116 for (int64_t index = 0; index < index_to_node_.size(); ++index) {
117 VLOG(2) << "Variable index " << index << " -> Node index "
120 for (NodeIndex node = kZeroNode; node < node_to_index_.size(); ++node) {
121 VLOG(2) << "Node index " << node << " -> Variable index "
127 const std::vector<NodeIndex>& nodes) const {
128 std::vector<int64_t> indices;
129 indices.reserve(nodes.size());
130 for (const NodeIndex node : nodes) {
139 absl::Span<const int64_t> indices) const {
140 std::vector<NodeIndex> nodes;
141 nodes.reserve(indices.size());
static const int64_t kUnassigned
std::vector< NodeIndex > IndicesToNodes(absl::Span< const int64_t > indices) const
Definition routing_index_manager.cc:138
RoutingNodeIndex NodeIndex
int64_t NodeToIndex(NodeIndex node) const
RoutingIndexManager(int num_nodes, int num_vehicles, NodeIndex depot)
Creates a NodeIndex to variable index mapping for a problem containing 'num_nodes',...
Definition routing_index_manager.cc:29
std::vector< int64_t > NodesToIndices(const std::vector< NodeIndex > &nodes) const
Definition routing_index_manager.cc:126
NodeIndex IndexToNode(int64_t index) const
void resize(size_type new_size)
BlossomGraph::NodeIndex NodeIndex
ClosedInterval::Iterator end(ClosedInterval interval)