OR-Tools  8.1
routing.h
Go to the documentation of this file.
1 // Copyright 2010-2018 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
68 // TODO(user): Add a section on costs (vehicle arc costs, span costs,
69 // disjunctions costs).
70 //
156 
157 #ifndef OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_H_
158 #define OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_H_
159 
160 #include <cstddef>
161 #include <functional>
162 #include <memory>
163 #include <queue>
164 #include <string>
165 #include <utility>
166 #include <vector>
167 
168 #include "absl/container/flat_hash_map.h"
169 #include "absl/container/flat_hash_set.h"
170 #include "absl/hash/hash.h"
171 #include "absl/time/time.h"
175 #include "ortools/base/hash.h"
177 #include "ortools/base/logging.h"
178 #include "ortools/base/macros.h"
185 #include "ortools/glop/lp_solver.h"
187 #include "ortools/graph/graph.h"
188 #include "ortools/lp_data/lp_data.h"
190 #include "ortools/sat/theta_tree.h"
193 
194 namespace operations_research {
195 
196 class GlobalDimensionCumulOptimizer;
197 class LocalDimensionCumulOptimizer;
198 class LocalSearchOperator;
199 #ifndef SWIG
200 class IntVarFilteredDecisionBuilder;
201 class IntVarFilteredHeuristic;
202 class IndexNeighborFinder;
203 #endif
204 class RoutingDimension;
205 #ifndef SWIG
207 class SweepArranger;
208 #endif
209 struct SweepIndex;
210 
212  public:
214  enum Status {
225  };
226 
235  };
236  typedef RoutingCostClassIndex CostClassIndex;
237  typedef RoutingDimensionIndex DimensionIndex;
238  typedef RoutingDisjunctionIndex DisjunctionIndex;
239  typedef RoutingVehicleClassIndex VehicleClassIndex;
242 
243 // TODO(user): Remove all SWIG guards by adding the @ignore in .i.
244 #if !defined(SWIG)
247 #endif // SWIG
248 
249 #if !defined(SWIG)
250  struct StateDependentTransit {
265  };
266  typedef std::function<StateDependentTransit(int64, int64)>
268 #endif // SWIG
269 
270 #if !defined(SWIG)
271  struct CostClass {
274 
289 
295  struct DimensionCost {
299  bool operator<(const DimensionCost& cost) const {
300  if (transit_evaluator_class != cost.transit_evaluator_class) {
301  return transit_evaluator_class < cost.transit_evaluator_class;
302  }
303  return cost_coefficient < cost.cost_coefficient;
304  }
305  };
306  std::vector<DimensionCost>
308 
311 
313  static bool LessThan(const CostClass& a, const CostClass& b) {
314  if (a.evaluator_index != b.evaluator_index) {
315  return a.evaluator_index < b.evaluator_index;
316  }
317  return a.dimension_transit_evaluator_class_and_cost_coefficient <
318  b.dimension_transit_evaluator_class_and_cost_coefficient;
319  }
320  };
321 
322  struct VehicleClass {
331  // TODO(user): Find equivalent start/end nodes wrt dimensions and
332  // callbacks.
347 
349  static bool LessThan(const VehicleClass& a, const VehicleClass& b);
350  };
351 #endif // defined(SWIG)
352 
360 
361  bool operator<(const VehicleClassEntry& other) const {
362  return std::tie(fixed_cost, vehicle_class) <
363  std::tie(other.fixed_cost, other.vehicle_class);
364  }
365  };
366 
367  int NumTypes() const { return sorted_vehicle_classes_per_type.size(); }
368 
369  int Type(int vehicle) const {
370  DCHECK_LT(vehicle, type_index_of_vehicle.size());
371  return type_index_of_vehicle[vehicle];
372  }
373 
374  std::vector<int> type_index_of_vehicle;
375  // clang-format off
376  std::vector<std::set<VehicleClassEntry> > sorted_vehicle_classes_per_type;
377  std::vector<std::deque<int> > vehicles_per_vehicle_class;
378  // clang-format on
379  };
380 
382  static const int64 kNoPenalty;
383 
387 
391 
395  explicit RoutingModel(const RoutingIndexManager& index_manager);
396  RoutingModel(const RoutingIndexManager& index_manager,
397  const RoutingModelParameters& parameters);
398  ~RoutingModel();
399 
406  const TransitCallback2& TransitCallback(int callback_index) const {
407  CHECK_LT(callback_index, transit_evaluators_.size());
408  return transit_evaluators_[callback_index];
409  }
410  const TransitCallback1& UnaryTransitCallbackOrNull(int callback_index) const {
411  CHECK_LT(callback_index, unary_transit_evaluators_.size());
412  return unary_transit_evaluators_[callback_index];
413  }
415  int callback_index) const {
416  CHECK_LT(callback_index, state_dependent_transit_evaluators_.size());
417  return state_dependent_transit_evaluators_[callback_index];
418  }
419 
421 
433 
442  bool AddDimension(int evaluator_index, int64 slack_max, int64 capacity,
443  bool fix_start_cumul_to_zero, const std::string& name);
445  const std::vector<int>& evaluator_indices, int64 slack_max,
446  int64 capacity, bool fix_start_cumul_to_zero, const std::string& name);
447  bool AddDimensionWithVehicleCapacity(int evaluator_index, int64 slack_max,
448  std::vector<int64> vehicle_capacities,
449  bool fix_start_cumul_to_zero,
450  const std::string& name);
452  const std::vector<int>& evaluator_indices, int64 slack_max,
453  std::vector<int64> vehicle_capacities, bool fix_start_cumul_to_zero,
454  const std::string& name);
462  int64 slack_max,
463  bool fix_start_cumul_to_zero,
464  const std::string& name);
466  bool fix_start_cumul_to_zero,
467  const std::string& name) {
469  fix_start_cumul_to_zero, name);
470  }
478  bool AddVectorDimension(std::vector<int64> values, int64 capacity,
479  bool fix_start_cumul_to_zero,
480  const std::string& name);
488  bool AddMatrixDimension(
489  std::vector<std::vector<int64> /*needed_for_swig*/> values,
490  int64 capacity, bool fix_start_cumul_to_zero, const std::string& name);
498  const std::vector<int>& pure_transits,
499  const std::vector<int>& dependent_transits,
500  const RoutingDimension* base_dimension, int64 slack_max,
501  std::vector<int64> vehicle_capacities, bool fix_start_cumul_to_zero,
502  const std::string& name) {
503  return AddDimensionDependentDimensionWithVehicleCapacityInternal(
504  pure_transits, dependent_transits, base_dimension, slack_max,
505  std::move(vehicle_capacities), fix_start_cumul_to_zero, name);
506  }
507 
510  const std::vector<int>& transits, const RoutingDimension* base_dimension,
511  int64 slack_max, std::vector<int64> vehicle_capacities,
512  bool fix_start_cumul_to_zero, const std::string& name);
515  int transit, const RoutingDimension* base_dimension, int64 slack_max,
516  int64 vehicle_capacity, bool fix_start_cumul_to_zero,
517  const std::string& name);
519  int pure_transit, int dependent_transit,
520  const RoutingDimension* base_dimension, int64 slack_max,
521  int64 vehicle_capacity, bool fix_start_cumul_to_zero,
522  const std::string& name);
523 
526  const std::function<int64(int64)>& f, int64 domain_start,
527  int64 domain_end);
528 
539  std::vector<IntVar*> spans,
540  std::vector<IntVar*> total_slacks);
541 
543  // TODO(user): rename.
544  std::vector<std::string> GetAllDimensionNames() const;
546  const std::vector<RoutingDimension*>& GetDimensions() const {
547  return dimensions_.get();
548  }
550  std::vector<RoutingDimension*> GetDimensionsWithSoftOrSpanCosts() const;
551  // clang-format off
554  const std::vector<std::unique_ptr<GlobalDimensionCumulOptimizer> >&
556  return global_dimension_optimizers_;
557  }
558  const std::vector<std::unique_ptr<LocalDimensionCumulOptimizer> >&
560  return local_dimension_optimizers_;
561  }
562  const std::vector<std::unique_ptr<LocalDimensionCumulOptimizer> >&
564  return local_dimension_mp_optimizers_;
565  }
566  // clang-format on
567 
571  const RoutingDimension& dimension) const;
573  const RoutingDimension& dimension) const;
575  const RoutingDimension& dimension) const;
576 
578  bool HasDimension(const std::string& dimension_name) const;
581  const std::string& dimension_name) const;
585  const std::string& dimension_name) const;
590  void SetPrimaryConstrainedDimension(const std::string& dimension_name) {
591  DCHECK(dimension_name.empty() || HasDimension(dimension_name));
592  primary_constrained_dimension_ = dimension_name;
593  }
595  const std::string& GetPrimaryConstrainedDimension() const {
596  return primary_constrained_dimension_;
597  }
614  DisjunctionIndex AddDisjunction(const std::vector<int64>& indices,
615  int64 penalty = kNoPenalty,
616  int64 max_cardinality = 1);
618  const std::vector<DisjunctionIndex>& GetDisjunctionIndices(
619  int64 index) const {
620  return index_to_disjunctions_[index];
621  }
625  template <typename F>
627  int64 index, int64 max_cardinality, F f) const {
628  for (const DisjunctionIndex disjunction : GetDisjunctionIndices(index)) {
629  if (disjunctions_[disjunction].value.max_cardinality == max_cardinality) {
630  for (const int64 d_index : disjunctions_[disjunction].indices) {
631  f(d_index);
632  }
633  }
634  }
635  }
636 #if !defined(SWIGPYTHON)
637  const std::vector<int64>& GetDisjunctionIndices(
640  DisjunctionIndex index) const {
641  return disjunctions_[index].indices;
642  }
643 #endif // !defined(SWIGPYTHON)
646  return disjunctions_[index].value.penalty;
647  }
651  return disjunctions_[index].value.max_cardinality;
652  }
654  int GetNumberOfDisjunctions() const { return disjunctions_.size(); }
659  std::vector<std::pair<int64, int64>> GetPerfectBinaryDisjunctions() const;
666 
670  void AddSoftSameVehicleConstraint(const std::vector<int64>& indices,
671  int64 cost);
672 
677  void SetAllowedVehiclesForIndex(const std::vector<int>& vehicles,
678  int64 index);
679 
681  bool IsVehicleAllowedForIndex(int vehicle, int64 index) {
682  return allowed_vehicles_[index].empty() ||
683  allowed_vehicles_[index].find(vehicle) !=
684  allowed_vehicles_[index].end();
685  }
686 
701  // TODO(user): Remove this when model introspection detects linked nodes.
702  void AddPickupAndDelivery(int64 pickup, int64 delivery);
706  void AddPickupAndDeliverySets(DisjunctionIndex pickup_disjunction,
707  DisjunctionIndex delivery_disjunction);
708  // clang-format off
712  const std::vector<std::pair<int, int> >&
713  GetPickupIndexPairs(int64 node_index) const;
715  const std::vector<std::pair<int, int> >&
716  GetDeliveryIndexPairs(int64 node_index) const;
717  // clang-format on
718 
723  int vehicle);
725  int vehicle) const;
728 
729  int GetNumOfSingletonNodes() const;
730 
731 #ifndef SWIG
732  const IndexPairs& GetPickupAndDeliveryPairs() const {
734  return pickup_delivery_pairs_;
735  }
736  const std::vector<std::pair<DisjunctionIndex, DisjunctionIndex>>&
738  return pickup_delivery_disjunctions_;
739  }
745  DCHECK(closed_);
746  return implicit_pickup_delivery_pairs_without_alternatives_;
747  }
748 #endif // SWIG
749  enum VisitTypePolicy {
776  };
777  // TODO(user): Support multiple visit types per node?
778  void SetVisitType(int64 index, int type, VisitTypePolicy type_policy);
779  int GetVisitType(int64 index) const;
780  const std::vector<int>& GetSingleNodesOfType(int type) const;
781  const std::vector<int>& GetPairIndicesOfType(int type) const;
785  // TODO(user): Reconsider the logic and potentially remove the need to
787  void CloseVisitTypes();
788  int GetNumberOfVisitTypes() const { return num_visit_types_; }
789 #ifndef SWIG
790  const std::vector<std::vector<int>>& GetTopologicallySortedVisitTypes()
791  const {
792  DCHECK(closed_);
793  return topologically_sorted_visit_types_;
794  }
795 #endif // SWIG
796  void AddHardTypeIncompatibility(int type1, int type2);
801  void AddTemporalTypeIncompatibility(int type1, int type2);
803  const absl::flat_hash_set<int>& GetHardTypeIncompatibilitiesOfType(
804  int type) const;
805  const absl::flat_hash_set<int>& GetTemporalTypeIncompatibilitiesOfType(
806  int type) const;
810  return has_hard_type_incompatibilities_;
811  }
813  return has_temporal_type_incompatibilities_;
814  }
826  int dependent_type, absl::flat_hash_set<int> required_type_alternatives);
832  int dependent_type, absl::flat_hash_set<int> required_type_alternatives);
839  int dependent_type, absl::flat_hash_set<int> required_type_alternatives);
840  // clang-format off
843  const std::vector<absl::flat_hash_set<int> >&
846  const std::vector<absl::flat_hash_set<int> >&
849  const std::vector<absl::flat_hash_set<int> >&
851  // clang-format on
855  return has_same_vehicle_type_requirements_;
856  }
858  return has_temporal_type_requirements_;
859  }
860 
863  bool HasTypeRegulations() const {
867  }
868 
873  int64 UnperformedPenalty(int64 var_index) const;
877  int64 UnperformedPenaltyOrValue(int64 default_value, int64 var_index) const;
881  int64 GetDepot() const;
882 
887  void SetMaximumNumberOfActiveVehicles(int max_active_vehicles) {
888  max_active_vehicles_ = max_active_vehicles;
889  }
891  int GetMaximumNumberOfActiveVehicles() const { return max_active_vehicles_; }
895  void SetArcCostEvaluatorOfAllVehicles(int evaluator_index);
897  void SetArcCostEvaluatorOfVehicle(int evaluator_index, int vehicle);
902  void SetFixedCostOfVehicle(int64 cost, int vehicle);
906  int64 GetFixedCostOfVehicle(int vehicle) const;
907 
923  void SetAmortizedCostFactorsOfAllVehicles(int64 linear_cost_factor,
924  int64 quadratic_cost_factor);
926  void SetAmortizedCostFactorsOfVehicle(int64 linear_cost_factor,
927  int64 quadratic_cost_factor,
928  int vehicle);
929 
930  const std::vector<int64>& GetAmortizedLinearCostFactorOfVehicles() const {
931  return linear_cost_factor_of_vehicle_;
932  }
933  const std::vector<int64>& GetAmortizedQuadraticCostFactorOfVehicles() const {
934  return quadratic_cost_factor_of_vehicle_;
935  }
936 
937  void ConsiderEmptyRouteCostsForVehicle(bool consider_costs, int vehicle) {
938  DCHECK_LT(vehicle, vehicles_);
939  consider_empty_route_costs_[vehicle] = consider_costs;
940  }
941 
942  bool AreEmptyRouteCostsConsideredForVehicle(int vehicle) const {
943  DCHECK_LT(vehicle, vehicles_);
944  return consider_empty_route_costs_[vehicle];
945  }
946 
949 #ifndef SWIG
951  return first_solution_evaluator_;
952  }
953 #endif
956  first_solution_evaluator_ = std::move(evaluator);
957  }
960  void AddLocalSearchOperator(LocalSearchOperator* ls_operator);
962  void AddSearchMonitor(SearchMonitor* const monitor);
966  void AddAtSolutionCallback(std::function<void()> callback);
971  void AddVariableMinimizedByFinalizer(IntVar* var);
974  void AddVariableMaximizedByFinalizer(IntVar* var);
980  void AddVariableTargetToFinalizer(IntVar* var, int64 target);
987  void CloseModel();
991  const RoutingSearchParameters& search_parameters);
998  const Assignment* Solve(const Assignment* assignment = nullptr);
1006  const Assignment* SolveWithParameters(
1007  const RoutingSearchParameters& search_parameters,
1008  std::vector<const Assignment*>* solutions = nullptr);
1009  const Assignment* SolveFromAssignmentWithParameters(
1010  const Assignment* assignment,
1011  const RoutingSearchParameters& search_parameters,
1012  std::vector<const Assignment*>* solutions = nullptr);
1019  Assignment* target_assignment, const RoutingModel* source_model,
1020  const Assignment* source_assignment);
1026  // TODO(user): Add support for non-homogeneous costs and disjunctions.
1029  Status status() const { return status_; }
1038  IntVar* ApplyLocks(const std::vector<int64>& locks);
1047  bool ApplyLocksToAllVehicles(const std::vector<std::vector<int64>>& locks,
1048  bool close_routes);
1053  const Assignment* const PreAssignment() const { return preassignment_; }
1054  Assignment* MutablePreAssignment() { return preassignment_; }
1058  bool WriteAssignment(const std::string& file_name) const;
1062  Assignment* ReadAssignment(const std::string& file_name);
1065  Assignment* RestoreAssignment(const Assignment& solution);
1072  const std::vector<std::vector<int64>>& routes,
1073  bool ignore_inactive_indices);
1090  bool RoutesToAssignment(const std::vector<std::vector<int64>>& routes,
1091  bool ignore_inactive_indices, bool close_routes,
1092  Assignment* const assignment) const;
1096  void AssignmentToRoutes(const Assignment& assignment,
1097  std::vector<std::vector<int64>>* const routes) const;
1102 #ifndef SWIG
1103  std::vector<std::vector<int64>> GetRoutesFromAssignment(
1104  const Assignment& assignment);
1105 #endif
1106  Assignment* CompactAssignment(const Assignment& assignment) const;
1127  Assignment* CompactAndCheckAssignment(const Assignment& assignment) const;
1129  void AddToAssignment(IntVar* const var);
1142  const Assignment* original_assignment, absl::Duration duration_limit);
1143 #ifndef SWIG
1144  // TODO(user): Revisit if coordinates are added to the RoutingModel class.
1146  sweep_arranger_.reset(sweep_arranger);
1147  }
1149  SweepArranger* sweep_arranger() const { return sweep_arranger_.get(); }
1150 #endif
1151  void AddLocalSearchFilter(LocalSearchFilter* filter) {
1157  CHECK(filter != nullptr);
1158  if (closed_) {
1159  LOG(WARNING) << "Model is closed, filter addition will be ignored.";
1160  }
1161  extra_filters_.push_back({filter, LocalSearchFilterManager::kRelax});
1162  extra_filters_.push_back({filter, LocalSearchFilterManager::kAccept});
1163  }
1164 
1167  int64 Start(int vehicle) const { return starts_[vehicle]; }
1169  int64 End(int vehicle) const { return ends_[vehicle]; }
1171  bool IsStart(int64 index) const;
1173  bool IsEnd(int64 index) const { return index >= Size(); }
1176  int VehicleIndex(int index) const { return index_to_vehicle_[index]; }
1180  int64 Next(const Assignment& assignment, int64 index) const;
1182  bool IsVehicleUsed(const Assignment& assignment, int vehicle) const;
1183 
1184 #if !defined(SWIGPYTHON)
1185  const std::vector<IntVar*>& Nexts() const { return nexts_; }
1190  const std::vector<IntVar*>& VehicleVars() const { return vehicle_vars_; }
1191 #endif
1192  IntVar* NextVar(int64 index) const { return nexts_[index]; }
1195  IntVar* ActiveVar(int64 index) const { return active_[index]; }
1199  IntVar* ActiveVehicleVar(int vehicle) const {
1200  return vehicle_active_[vehicle];
1201  }
1204  IntVar* VehicleCostsConsideredVar(int vehicle) const {
1205  return vehicle_costs_considered_[vehicle];
1206  }
1209  IntVar* VehicleVar(int64 index) const { return vehicle_vars_[index]; }
1211  IntVar* CostVar() const { return cost_; }
1212 
1215  int64 GetArcCostForVehicle(int64 from_index, int64 to_index,
1216  int64 vehicle) const;
1219  return costs_are_homogeneous_across_vehicles_;
1220  }
1223  int64 GetHomogeneousCost(int64 from_index, int64 to_index) const {
1224  return GetArcCostForVehicle(from_index, to_index, /*vehicle=*/0);
1225  }
1228  int64 GetArcCostForFirstSolution(int64 from_index, int64 to_index) const;
1235  int64 GetArcCostForClass(int64 from_index, int64 to_index,
1236  int64 /*CostClassIndex*/ cost_class_index) const;
1239  DCHECK(closed_);
1240  DCHECK_GE(vehicle, 0);
1241  DCHECK_LT(vehicle, cost_class_index_of_vehicle_.size());
1242  DCHECK_GE(cost_class_index_of_vehicle_[vehicle], 0);
1243  return cost_class_index_of_vehicle_[vehicle];
1244  }
1247  bool HasVehicleWithCostClassIndex(CostClassIndex cost_class_index) const {
1248  DCHECK(closed_);
1249  if (cost_class_index == kCostClassIndexOfZeroCost) {
1250  return has_vehicle_with_zero_cost_class_;
1251  }
1252  return cost_class_index < cost_classes_.size();
1253  }
1255  int GetCostClassesCount() const { return cost_classes_.size(); }
1258  return std::max(0, GetCostClassesCount() - 1);
1259  }
1261  DCHECK(closed_);
1262  return vehicle_class_index_of_vehicle_[vehicle];
1263  }
1265  int GetVehicleClassesCount() const { return vehicle_classes_.size(); }
1267  const std::vector<int>& GetSameVehicleIndicesOfIndex(int node) const {
1268  DCHECK(closed_);
1269  return same_vehicle_groups_[same_vehicle_group_[node]];
1270  }
1271 
1273  DCHECK(closed_);
1274  return vehicle_type_container_;
1275  }
1276 
1295  bool ArcIsMoreConstrainedThanArc(int64 from, int64 to1, int64 to2);
1300  std::string DebugOutputAssignment(
1301  const Assignment& solution_assignment,
1302  const std::string& dimension_to_print) const;
1308 #ifndef SWIG
1309  std::vector<std::vector<std::pair<int64, int64>>> GetCumulBounds(
1310  const Assignment& solution_assignment, const RoutingDimension& dimension);
1311 #endif
1312  Solver* solver() const { return solver_.get(); }
1315 
1317  bool CheckLimit() {
1318  DCHECK(limit_ != nullptr);
1319  return limit_->Check();
1320  }
1321 
1323  absl::Duration RemainingTime() const {
1324  DCHECK(limit_ != nullptr);
1325  return limit_->AbsoluteSolverDeadline() - solver_->Now();
1326  }
1327 
1330  int nodes() const { return nodes_; }
1332  int vehicles() const { return vehicles_; }
1334  int64 Size() const { return nodes_ + vehicles_ - start_end_count_; }
1335 
1339  const RoutingSearchParameters& search_parameters) const;
1341  const RoutingSearchParameters& search_parameters) const;
1345  return automatic_first_solution_strategy_;
1346  }
1347 
1349  bool IsMatchingModel() const;
1350 
1351 #ifndef SWIG
1352  using GetTabuVarsCallback =
1355  std::function<std::vector<operations_research::IntVar*>(RoutingModel*)>;
1356 
1357  void SetTabuVarsCallback(GetTabuVarsCallback tabu_var_callback);
1358 #endif // SWIG
1359 
1361  // TODO(user): Find a way to test and restrict the access at the same time.
1374  const RoutingDimension* dimension,
1375  std::function<int64(int64)> initializer);
1376 #ifndef SWIG
1377  // TODO(user): MakeGreedyDescentLSOperator is too general for routing.h.
1382  static std::unique_ptr<LocalSearchOperator> MakeGreedyDescentLSOperator(
1383  std::vector<IntVar*> variables);
1384 #endif
1385  DecisionBuilder* MakeSelfDependentDimensionFinalizer(
1399  const RoutingDimension* dimension);
1400 
1401  private:
1403  enum RoutingLocalSearchOperator {
1404  RELOCATE = 0,
1405  RELOCATE_PAIR,
1406  LIGHT_RELOCATE_PAIR,
1407  RELOCATE_NEIGHBORS,
1408  EXCHANGE,
1409  EXCHANGE_PAIR,
1410  CROSS,
1411  CROSS_EXCHANGE,
1412  TWO_OPT,
1413  OR_OPT,
1414  GLOBAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS,
1415  LOCAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS,
1416  GLOBAL_CHEAPEST_INSERTION_PATH_LNS,
1417  LOCAL_CHEAPEST_INSERTION_PATH_LNS,
1418  RELOCATE_PATH_GLOBAL_CHEAPEST_INSERTION_INSERT_UNPERFORMED,
1419  GLOBAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS,
1420  LOCAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS,
1421  RELOCATE_EXPENSIVE_CHAIN,
1422  LIN_KERNIGHAN,
1423  TSP_OPT,
1424  MAKE_ACTIVE,
1425  RELOCATE_AND_MAKE_ACTIVE,
1426  MAKE_ACTIVE_AND_RELOCATE,
1427  MAKE_INACTIVE,
1428  MAKE_CHAIN_INACTIVE,
1429  SWAP_ACTIVE,
1430  EXTENDED_SWAP_ACTIVE,
1431  NODE_PAIR_SWAP,
1432  PATH_LNS,
1433  FULL_PATH_LNS,
1434  TSP_LNS,
1435  INACTIVE_LNS,
1436  EXCHANGE_RELOCATE_PAIR,
1437  RELOCATE_SUBTRIP,
1438  EXCHANGE_SUBTRIP,
1439  LOCAL_SEARCH_OPERATOR_COUNTER
1440  };
1441 
1445  template <typename T>
1446  struct ValuedNodes {
1447  std::vector<int64> indices;
1448  T value;
1449  };
1450  struct DisjunctionValues {
1451  int64 penalty;
1452  int64 max_cardinality;
1453  };
1454  typedef ValuedNodes<DisjunctionValues> Disjunction;
1455 
1458  struct CostCacheElement {
1463  int index;
1464  CostClassIndex cost_class_index;
1465  int64 cost;
1466  };
1467 
1469  void Initialize();
1470  void AddNoCycleConstraintInternal();
1471  bool AddDimensionWithCapacityInternal(
1472  const std::vector<int>& evaluator_indices, int64 slack_max,
1473  std::vector<int64> vehicle_capacities, bool fix_start_cumul_to_zero,
1474  const std::string& name);
1475  bool AddDimensionDependentDimensionWithVehicleCapacityInternal(
1476  const std::vector<int>& pure_transits,
1477  const std::vector<int>& dependent_transits,
1478  const RoutingDimension* base_dimension, int64 slack_max,
1479  std::vector<int64> vehicle_capacities, bool fix_start_cumul_to_zero,
1480  const std::string& name);
1481  bool InitializeDimensionInternal(
1482  const std::vector<int>& evaluator_indices,
1483  const std::vector<int>& state_dependent_evaluator_indices,
1484  int64 slack_max, bool fix_start_cumul_to_zero,
1485  RoutingDimension* dimension);
1486  DimensionIndex GetDimensionIndex(const std::string& dimension_name) const;
1487 
1515  void StoreDimensionCumulOptimizers(const RoutingSearchParameters& parameters);
1516 
1517  void ComputeCostClasses(const RoutingSearchParameters& parameters);
1518  void ComputeVehicleClasses();
1526  void ComputeVehicleTypes();
1536  void FinalizeVisitTypes();
1537  // Called by FinalizeVisitTypes() to setup topologically_sorted_visit_types_.
1538  void TopologicallySortVisitTypes();
1539  int64 GetArcCostForClassInternal(int64 from_index, int64 to_index,
1540  CostClassIndex cost_class_index) const;
1541  void AppendHomogeneousArcCosts(const RoutingSearchParameters& parameters,
1542  int node_index,
1543  std::vector<IntVar*>* cost_elements);
1544  void AppendArcCosts(const RoutingSearchParameters& parameters, int node_index,
1545  std::vector<IntVar*>* cost_elements);
1546  Assignment* DoRestoreAssignment();
1547  static const CostClassIndex kCostClassIndexOfZeroCost;
1548  int64 SafeGetCostClassInt64OfVehicle(int64 vehicle) const {
1549  DCHECK_LT(0, vehicles_);
1550  return (vehicle >= 0 ? GetCostClassIndexOfVehicle(vehicle)
1551  : kCostClassIndexOfZeroCost)
1552  .value();
1553  }
1554  int64 GetDimensionTransitCostSum(int64 i, int64 j,
1555  const CostClass& cost_class) const;
1557  IntVar* CreateDisjunction(DisjunctionIndex disjunction);
1559  void AddPickupAndDeliverySetsInternal(const std::vector<int64>& pickups,
1560  const std::vector<int64>& deliveries);
1563  IntVar* CreateSameVehicleCost(int vehicle_index);
1566  int FindNextActive(int index, const std::vector<int64>& indices) const;
1567 
1570  bool RouteCanBeUsedByVehicle(const Assignment& assignment, int start_index,
1571  int vehicle) const;
1579  bool ReplaceUnusedVehicle(int unused_vehicle, int active_vehicle,
1580  Assignment* compact_assignment) const;
1581 
1582  void QuietCloseModel();
1583  void QuietCloseModelWithParameters(
1584  const RoutingSearchParameters& parameters) {
1585  if (!closed_) {
1587  }
1588  }
1589 
1591  bool SolveMatchingModel(Assignment* assignment,
1592  const RoutingSearchParameters& parameters);
1593 #ifndef SWIG
1594  bool AppendAssignmentIfFeasible(
1596  const Assignment& assignment,
1597  std::vector<std::unique_ptr<Assignment>>* assignments);
1598 #endif
1599  void LogSolution(const RoutingSearchParameters& parameters,
1601  const std::string& description, int64 solution_cost,
1602  int64 start_time_ms);
1605  Assignment* CompactAssignmentInternal(const Assignment& assignment,
1606  bool check_compact_assignment) const;
1611  std::string FindErrorInSearchParametersForModel(
1612  const RoutingSearchParameters& search_parameters) const;
1614  void SetupSearch(const RoutingSearchParameters& search_parameters);
1616  // TODO(user): Document each auxiliary method.
1617  Assignment* GetOrCreateAssignment();
1618  Assignment* GetOrCreateTmpAssignment();
1619  RegularLimit* GetOrCreateLimit();
1620  RegularLimit* GetOrCreateLocalSearchLimit();
1621  RegularLimit* GetOrCreateLargeNeighborhoodSearchLimit();
1622  RegularLimit* GetOrCreateFirstSolutionLargeNeighborhoodSearchLimit();
1623  LocalSearchOperator* CreateInsertionOperator();
1624  LocalSearchOperator* CreateMakeInactiveOperator();
1625  void CreateNeighborhoodOperators(const RoutingSearchParameters& parameters);
1626  LocalSearchOperator* ConcatenateOperators(
1627  const RoutingSearchParameters& search_parameters,
1628  const std::vector<LocalSearchOperator*>& operators) const;
1629  LocalSearchOperator* GetNeighborhoodOperators(
1630  const RoutingSearchParameters& search_parameters) const;
1631  std::vector<LocalSearchFilterManager::FilterEvent>
1632  GetOrCreateLocalSearchFilters(const RoutingSearchParameters& parameters,
1633  bool filter_cost = true);
1634  LocalSearchFilterManager* GetOrCreateLocalSearchFilterManager(
1635  const RoutingSearchParameters& parameters);
1636  std::vector<LocalSearchFilterManager::FilterEvent>
1637  GetOrCreateFeasibilityFilters(const RoutingSearchParameters& parameters);
1638  LocalSearchFilterManager* GetOrCreateFeasibilityFilterManager(
1639  const RoutingSearchParameters& parameters);
1640  LocalSearchFilterManager* GetOrCreateStrongFeasibilityFilterManager(
1641  const RoutingSearchParameters& parameters);
1642  DecisionBuilder* CreateSolutionFinalizer(SearchLimit* lns_limit);
1643  DecisionBuilder* CreateFinalizerForMinimizedAndMaximizedVariables();
1644  void CreateFirstSolutionDecisionBuilders(
1645  const RoutingSearchParameters& search_parameters);
1646  DecisionBuilder* GetFirstSolutionDecisionBuilder(
1647  const RoutingSearchParameters& search_parameters) const;
1648  IntVarFilteredDecisionBuilder* GetFilteredFirstSolutionDecisionBuilderOrNull(
1649  const RoutingSearchParameters& parameters) const;
1650  LocalSearchPhaseParameters* CreateLocalSearchParameters(
1651  const RoutingSearchParameters& search_parameters);
1652  DecisionBuilder* CreateLocalSearchDecisionBuilder(
1653  const RoutingSearchParameters& search_parameters);
1654  void SetupDecisionBuilders(const RoutingSearchParameters& search_parameters);
1655  void SetupMetaheuristics(const RoutingSearchParameters& search_parameters);
1656  void SetupAssignmentCollector(
1657  const RoutingSearchParameters& search_parameters);
1658  void SetupTrace(const RoutingSearchParameters& search_parameters);
1659  void SetupImprovementLimit(const RoutingSearchParameters& search_parameters);
1660  void SetupSearchMonitors(const RoutingSearchParameters& search_parameters);
1661  bool UsesLightPropagation(
1662  const RoutingSearchParameters& search_parameters) const;
1663  GetTabuVarsCallback tabu_var_callback_;
1664 
1665  // Detects implicit pickup delivery pairs. These pairs are
1666  // non-pickup/delivery pairs for which there exists a unary dimension such
1667  // that the demand d of the implicit pickup is positive and the demand of the
1668  // implicit delivery is equal to -d.
1669  void DetectImplicitPickupAndDeliveries();
1670 
1671  int GetVehicleStartClass(int64 start) const;
1672 
1673  void InitSameVehicleGroups(int number_of_groups) {
1674  same_vehicle_group_.assign(Size(), 0);
1675  same_vehicle_groups_.assign(number_of_groups, {});
1676  }
1677  void SetSameVehicleGroup(int index, int group) {
1678  same_vehicle_group_[index] = group;
1679  same_vehicle_groups_[group].push_back(index);
1680  }
1681 
1683  std::unique_ptr<Solver> solver_;
1684  int nodes_;
1685  int vehicles_;
1686  int max_active_vehicles_;
1687  Constraint* no_cycle_constraint_ = nullptr;
1689  std::vector<IntVar*> nexts_;
1690  std::vector<IntVar*> vehicle_vars_;
1691  std::vector<IntVar*> active_;
1692  // The following vectors are indexed by vehicle index.
1693  std::vector<IntVar*> vehicle_active_;
1694  std::vector<IntVar*> vehicle_costs_considered_;
1699  std::vector<IntVar*> is_bound_to_end_;
1700  mutable RevSwitch is_bound_to_end_ct_added_;
1702  absl::flat_hash_map<std::string, DimensionIndex> dimension_name_to_index_;
1704  // clang-format off
1708  std::vector<std::unique_ptr<GlobalDimensionCumulOptimizer> >
1709  global_dimension_optimizers_;
1710  gtl::ITIVector<DimensionIndex, int> global_optimizer_index_;
1711  std::vector<std::unique_ptr<LocalDimensionCumulOptimizer> >
1712  local_dimension_optimizers_;
1713  std::vector<std::unique_ptr<LocalDimensionCumulOptimizer> >
1714  local_dimension_mp_optimizers_;
1715  // clang-format off
1716  gtl::ITIVector<DimensionIndex, int> local_optimizer_index_;
1717  std::string primary_constrained_dimension_;
1719  IntVar* cost_ = nullptr;
1720  std::vector<int> vehicle_to_transit_cost_;
1721  std::vector<int64> fixed_cost_of_vehicle_;
1722  std::vector<CostClassIndex> cost_class_index_of_vehicle_;
1723  bool has_vehicle_with_zero_cost_class_;
1724  std::vector<int64> linear_cost_factor_of_vehicle_;
1725  std::vector<int64> quadratic_cost_factor_of_vehicle_;
1726  bool vehicle_amortized_cost_factors_set_;
1737  std::vector<bool> consider_empty_route_costs_;
1738 #ifndef SWIG
1740 #endif // SWIG
1741  bool costs_are_homogeneous_across_vehicles_;
1742  bool cache_callbacks_;
1743  mutable std::vector<CostCacheElement> cost_cache_;
1744  std::vector<VehicleClassIndex> vehicle_class_index_of_vehicle_;
1745 #ifndef SWIG
1747 #endif // SWIG
1748  VehicleTypeContainer vehicle_type_container_;
1749  std::function<int(int64)> vehicle_start_class_callback_;
1752  std::vector<std::vector<DisjunctionIndex> > index_to_disjunctions_;
1754  std::vector<ValuedNodes<int64> > same_vehicle_costs_;
1756 #ifndef SWIG
1757  std::vector<absl::flat_hash_set<int>> allowed_vehicles_;
1758 #endif // SWIG
1759  IndexPairs pickup_delivery_pairs_;
1761  IndexPairs implicit_pickup_delivery_pairs_without_alternatives_;
1762  std::vector<std::pair<DisjunctionIndex, DisjunctionIndex> >
1763  pickup_delivery_disjunctions_;
1764  // clang-format off
1765  // If node_index is a pickup, index_to_pickup_index_pairs_[node_index] is the
1766  // vector of pairs {pair_index, pickup_index} such that
1767  // (pickup_delivery_pairs_[pair_index].first)[pickup_index] == node_index
1768  std::vector<std::vector<std::pair<int, int> > > index_to_pickup_index_pairs_;
1769  // Same as above for deliveries.
1770  std::vector<std::vector<std::pair<int, int> > >
1771  index_to_delivery_index_pairs_;
1772  // clang-format on
1773  std::vector<PickupAndDeliveryPolicy> vehicle_pickup_delivery_policy_;
1774  // Same vehicle group to which a node belongs.
1775  std::vector<int> same_vehicle_group_;
1776  // Same vehicle node groups.
1777  std::vector<std::vector<int>> same_vehicle_groups_;
1778  // Node visit types
1779  // Variable index to visit type index.
1780  std::vector<int> index_to_visit_type_;
1781  // Variable index to VisitTypePolicy.
1782  std::vector<VisitTypePolicy> index_to_type_policy_;
1783  // clang-format off
1784  std::vector<std::vector<int> > single_nodes_of_type_;
1785  std::vector<std::vector<int> > pair_indices_of_type_;
1786 
1787  std::vector<absl::flat_hash_set<int> >
1788  hard_incompatible_types_per_type_index_;
1789  bool has_hard_type_incompatibilities_;
1790  std::vector<absl::flat_hash_set<int> >
1791  temporal_incompatible_types_per_type_index_;
1792  bool has_temporal_type_incompatibilities_;
1793 
1794  std::vector<std::vector<absl::flat_hash_set<int> > >
1795  same_vehicle_required_type_alternatives_per_type_index_;
1796  bool has_same_vehicle_type_requirements_;
1797  std::vector<std::vector<absl::flat_hash_set<int> > >
1798  required_type_alternatives_when_adding_type_index_;
1799  std::vector<std::vector<absl::flat_hash_set<int> > >
1800  required_type_alternatives_when_removing_type_index_;
1801  bool has_temporal_type_requirements_;
1802  absl::flat_hash_map</*type*/int, absl::flat_hash_set<VisitTypePolicy> >
1803  trivially_infeasible_visit_types_to_policies_;
1804 
1805  // Visit types sorted topologically based on required-->dependent requirement
1806  // arcs between the types (if the requirement/dependency graph is acyclic).
1807  // Visit types of the same topological level are sorted in each sub-vector
1808  // by decreasing requirement "tightness", computed as the pair of the two
1809  // following criteria:
1810  //
1811  // 1) How highly *dependent* this type is, determined by
1812  // (total number of required alternative sets for that type)
1813  // / (average number of types in the required alternative sets)
1814  // 2) How highly *required* this type t is, computed as
1815  // SUM_{S required set containing t} ( 1 / |S| ),
1816  // i.e. the sum of reverse number of elements of all required sets
1817  // containing the type t.
1818  //
1819  // The higher these two numbers, the tighter the type is wrt requirements.
1820  std::vector<std::vector<int> > topologically_sorted_visit_types_;
1821  // clang-format on
1822  int num_visit_types_;
1823  // Two indices are equivalent if they correspond to the same node (as given
1824  // to the constructors taking a RoutingIndexManager).
1825  std::vector<int> index_to_equivalence_class_;
1826  std::vector<int> index_to_vehicle_;
1827  std::vector<int64> starts_;
1828  std::vector<int64> ends_;
1829  // TODO(user): b/62478706 Once the port is done, this shouldn't be needed
1830  // anymore.
1831  RoutingIndexManager manager_;
1832  int start_end_count_;
1833  // Model status
1834  bool closed_ = false;
1835  Status status_ = ROUTING_NOT_SOLVED;
1836  bool enable_deep_serialization_ = true;
1837 
1838  // Search data
1839  std::vector<DecisionBuilder*> first_solution_decision_builders_;
1840  std::vector<IntVarFilteredDecisionBuilder*>
1841  first_solution_filtered_decision_builders_;
1842  Solver::IndexEvaluator2 first_solution_evaluator_;
1843  FirstSolutionStrategy::Value automatic_first_solution_strategy_ =
1844  FirstSolutionStrategy::UNSET;
1845  std::vector<LocalSearchOperator*> local_search_operators_;
1846  std::vector<SearchMonitor*> monitors_;
1847  SolutionCollector* collect_assignments_ = nullptr;
1848  SolutionCollector* collect_one_assignment_ = nullptr;
1849  SolutionCollector* packed_dimensions_assignment_collector_ = nullptr;
1850  DecisionBuilder* solve_db_ = nullptr;
1851  DecisionBuilder* improve_db_ = nullptr;
1852  DecisionBuilder* restore_assignment_ = nullptr;
1853  DecisionBuilder* restore_tmp_assignment_ = nullptr;
1854  Assignment* assignment_ = nullptr;
1855  Assignment* preassignment_ = nullptr;
1856  Assignment* tmp_assignment_ = nullptr;
1857  std::vector<IntVar*> extra_vars_;
1858  std::vector<IntervalVar*> extra_intervals_;
1859  std::vector<LocalSearchOperator*> extra_operators_;
1860  LocalSearchFilterManager* local_search_filter_manager_ = nullptr;
1861  LocalSearchFilterManager* feasibility_filter_manager_ = nullptr;
1862  LocalSearchFilterManager* strong_feasibility_filter_manager_ = nullptr;
1863  std::vector<LocalSearchFilterManager::FilterEvent> extra_filters_;
1864 #ifndef SWIG
1865  std::vector<std::pair<IntVar*, int64>> finalizer_variable_cost_pairs_;
1866  std::vector<std::pair<IntVar*, int64>> finalizer_variable_target_pairs_;
1867  absl::flat_hash_map<IntVar*, int> finalizer_variable_cost_index_;
1868  absl::flat_hash_set<IntVar*> finalizer_variable_target_set_;
1869  std::unique_ptr<SweepArranger> sweep_arranger_;
1870 #endif
1871 
1872  RegularLimit* limit_ = nullptr;
1873  RegularLimit* ls_limit_ = nullptr;
1874  RegularLimit* lns_limit_ = nullptr;
1875  RegularLimit* first_solution_lns_limit_ = nullptr;
1876 
1877  typedef std::pair<int64, int64> CacheKey;
1878  typedef absl::flat_hash_map<CacheKey, int64> TransitCallbackCache;
1879  typedef absl::flat_hash_map<CacheKey, StateDependentTransit>
1880  StateDependentTransitCallbackCache;
1881 
1882  std::vector<TransitCallback1> unary_transit_evaluators_;
1883  std::vector<TransitCallback2> transit_evaluators_;
1884  // The following vector stores a boolean per transit_evaluator_, indicating
1885  // whether the transits are all positive.
1886  // is_transit_evaluator_positive_ will be set to true only when registering a
1887  // callback via RegisterPositiveTransitCallback(), and to false otherwise.
1888  // The actual positivity of the transit values will only be checked in debug
1889  // mode, when calling RegisterPositiveTransitCallback().
1890  // Therefore, RegisterPositiveTransitCallback() should only be called when the
1891  // transits are known to be positive, as the positivity of a callback will
1892  // allow some improvements in the solver, but will entail in errors if the
1893  // transits are falsely assumed positive.
1894  std::vector<bool> is_transit_evaluator_positive_;
1895  std::vector<VariableIndexEvaluator2> state_dependent_transit_evaluators_;
1896  std::vector<std::unique_ptr<StateDependentTransitCallbackCache>>
1897  state_dependent_transit_evaluators_cache_;
1898 
1899  friend class RoutingDimension;
1901 
1903 };
1904 
1907  public:
1909  static const char kLightElement[];
1910  static const char kLightElement2[];
1911  static const char kRemoveValues[];
1912 };
1913 
1914 #if !defined(SWIG)
1915 class DisjunctivePropagator {
1918  public:
1924  struct Tasks {
1926  std::vector<int64> start_min;
1927  std::vector<int64> start_max;
1928  std::vector<int64> duration_min;
1929  std::vector<int64> duration_max;
1930  std::vector<int64> end_min;
1931  std::vector<int64> end_max;
1932  std::vector<bool> is_preemptible;
1933  std::vector<const SortedDisjointIntervalList*> forbidden_intervals;
1934  std::vector<std::pair<int64, int64>> distance_duration;
1937 
1938  void Clear() {
1939  start_min.clear();
1940  start_max.clear();
1941  duration_min.clear();
1942  duration_max.clear();
1943  end_min.clear();
1944  end_max.clear();
1945  is_preemptible.clear();
1946  forbidden_intervals.clear();
1947  distance_duration.clear();
1948  span_min = 0;
1949  span_max = kint64max;
1950  num_chain_tasks = 0;
1951  }
1952  };
1953 
1956  bool Propagate(Tasks* tasks);
1957 
1959  bool Precedences(Tasks* tasks);
1962  bool MirrorTasks(Tasks* tasks);
1964  bool EdgeFinding(Tasks* tasks);
1967  bool DetectablePrecedencesWithChain(Tasks* tasks);
1969  bool ForbiddenIntervals(Tasks* tasks);
1971  bool DistanceDuration(Tasks* tasks);
1974  bool ChainSpanMin(Tasks* tasks);
1979  bool ChainSpanMinDynamic(Tasks* tasks);
1980 
1981  private:
1984  sat::ThetaLambdaTree<int64> theta_lambda_tree_;
1986  std::vector<int> tasks_by_start_min_;
1987  std::vector<int> tasks_by_end_max_;
1988  std::vector<int> event_of_task_;
1989  std::vector<int> nonchain_tasks_by_start_max_;
1991  std::vector<int64> total_duration_before_;
1992 };
1993 
1995  std::vector<int64> min_travels;
1996  std::vector<int64> max_travels;
1997  std::vector<int64> pre_travels;
1998  std::vector<int64> post_travels;
1999 };
2000 
2001 void AppendTasksFromPath(const std::vector<int64>& path,
2002  const TravelBounds& travel_bounds,
2003  const RoutingDimension& dimension,
2005 void AppendTasksFromIntervals(const std::vector<IntervalVar*>& intervals,
2007 void FillPathEvaluation(const std::vector<int64>& path,
2008  const RoutingModel::TransitCallback2& evaluator,
2009  std::vector<int64>* values);
2010 void FillTravelBoundsOfVehicle(int vehicle, const std::vector<int64>& path,
2011  const RoutingDimension& dimension,
2012  TravelBounds* travel_bounds);
2013 #endif // !defined(SWIG)
2014 
2026  public:
2027  explicit GlobalVehicleBreaksConstraint(const RoutingDimension* dimension);
2028  std::string DebugString() const override {
2029  return "GlobalVehicleBreaksConstraint";
2030  }
2031 
2032  void Post() override;
2033  void InitialPropagate() override;
2034 
2035  private:
2036  void PropagateNode(int node);
2037  void PropagateVehicle(int vehicle);
2038  void PropagateMaxBreakDistance(int vehicle);
2039 
2040  const RoutingModel* model_;
2041  const RoutingDimension* const dimension_;
2042  std::vector<Demon*> vehicle_demons_;
2043  std::vector<int64> path_;
2044 
2049  void FillPartialPathOfVehicle(int vehicle);
2050  void FillPathTravels(const std::vector<int64>& path);
2051 
2062  class TaskTranslator {
2063  public:
2064  TaskTranslator(IntVar* start, int64 before_start, int64 after_start)
2065  : start_(start),
2066  before_start_(before_start),
2067  after_start_(after_start) {}
2068  explicit TaskTranslator(IntervalVar* interval) : interval_(interval) {}
2069  TaskTranslator() {}
2070 
2071  void SetStartMin(int64 value) {
2072  if (start_ != nullptr) {
2073  start_->SetMin(CapAdd(before_start_, value));
2074  } else if (interval_ != nullptr) {
2075  interval_->SetStartMin(value);
2076  }
2077  }
2078  void SetStartMax(int64 value) {
2079  if (start_ != nullptr) {
2080  start_->SetMax(CapAdd(before_start_, value));
2081  } else if (interval_ != nullptr) {
2082  interval_->SetStartMax(value);
2083  }
2084  }
2085  void SetDurationMin(int64 value) {
2086  if (interval_ != nullptr) {
2087  interval_->SetDurationMin(value);
2088  }
2089  }
2090  void SetEndMin(int64 value) {
2091  if (start_ != nullptr) {
2092  start_->SetMin(CapSub(value, after_start_));
2093  } else if (interval_ != nullptr) {
2094  interval_->SetEndMin(value);
2095  }
2096  }
2097  void SetEndMax(int64 value) {
2098  if (start_ != nullptr) {
2099  start_->SetMax(CapSub(value, after_start_));
2100  } else if (interval_ != nullptr) {
2101  interval_->SetEndMax(value);
2102  }
2103  }
2104 
2105  private:
2106  IntVar* start_ = nullptr;
2107  int64 before_start_;
2108  int64 after_start_;
2109  IntervalVar* interval_ = nullptr;
2110  };
2111 
2113  std::vector<TaskTranslator> task_translators_;
2114 
2116  DisjunctivePropagator disjunctive_propagator_;
2117  DisjunctivePropagator::Tasks tasks_;
2118 
2120  TravelBounds travel_bounds_;
2121 };
2122 
2124  public:
2125  explicit TypeRegulationsChecker(const RoutingModel& model);
2127 
2128  bool CheckVehicle(int vehicle,
2129  const std::function<int64(int64)>& next_accessor);
2130 
2131  protected:
2132 #ifndef SWIG
2134 #endif // SWIG
2135 
2152  };
2153 
2158  bool TypeOccursOnRoute(int type) const;
2165  bool TypeCurrentlyOnRoute(int type, int pos) const;
2166 
2167  void InitializeCheck(int vehicle,
2168  const std::function<int64(int64)>& next_accessor);
2169  virtual void OnInitializeCheck() {}
2170  virtual bool HasRegulationsToCheck() const = 0;
2171  virtual bool CheckTypeRegulations(int type, VisitTypePolicy policy,
2172  int pos) = 0;
2173  virtual bool FinalizeCheck() const { return true; }
2174 
2176 
2177  private:
2178  std::vector<TypePolicyOccurrence> occurrences_of_type_;
2179  std::vector<int64> current_route_visits_;
2180 };
2181 
2184  public:
2186  bool check_hard_incompatibilities);
2188 
2189  private:
2190  bool HasRegulationsToCheck() const override;
2191  bool CheckTypeRegulations(int type, VisitTypePolicy policy, int pos) override;
2195  bool check_hard_incompatibilities_;
2196 };
2197 
2200  public:
2204 
2205  private:
2206  bool HasRegulationsToCheck() const override;
2207  void OnInitializeCheck() override {
2208  types_with_same_vehicle_requirements_on_route_.clear();
2209  }
2210  // clang-format off
2213  bool CheckRequiredTypesCurrentlyOnRoute(
2214  const std::vector<absl::flat_hash_set<int> >& required_type_alternatives,
2215  int pos);
2216  // clang-format on
2217  bool CheckTypeRegulations(int type, VisitTypePolicy policy, int pos) override;
2218  bool FinalizeCheck() const override;
2219 
2220  absl::flat_hash_set<int> types_with_same_vehicle_requirements_on_route_;
2221 };
2222 
2264  public:
2265  explicit TypeRegulationsConstraint(const RoutingModel& model);
2266 
2267  void Post() override;
2268  void InitialPropagate() override;
2269 
2270  private:
2271  void PropagateNodeRegulations(int node);
2272  void CheckRegulationsOnVehicle(int vehicle);
2273 
2274  const RoutingModel& model_;
2275  TypeIncompatibilityChecker incompatibility_checker_;
2276  TypeRequirementChecker requirement_checker_;
2277  std::vector<Demon*> vehicle_demons_;
2278 };
2279 #if !defined SWIG
2280 class SimpleBoundCosts {
2293  public:
2294  struct BoundCost {
2297  };
2298  SimpleBoundCosts(int num_bounds, BoundCost default_bound_cost)
2299  : bound_costs_(num_bounds, default_bound_cost) {}
2300  BoundCost& bound_cost(int element) { return bound_costs_[element]; }
2301  BoundCost bound_cost(int element) const { return bound_costs_[element]; }
2302  int Size() { return bound_costs_.size(); }
2305 
2306  private:
2307  std::vector<BoundCost> bound_costs_;
2308 };
2309 #endif // !defined SWIG
2310 
2328 // TODO(user): Break constraints need to know the service time of nodes
2332  public:
2335  RoutingModel* model() const { return model_; }
2339  int64 GetTransitValue(int64 from_index, int64 to_index, int64 vehicle) const;
2343  int64 vehicle_class) const {
2344  return model_->TransitCallback(class_evaluators_[vehicle_class])(from_index,
2345  to_index);
2346  }
2349  IntVar* CumulVar(int64 index) const { return cumuls_[index]; }
2350  IntVar* TransitVar(int64 index) const { return transits_[index]; }
2351  IntVar* FixedTransitVar(int64 index) const { return fixed_transits_[index]; }
2352  IntVar* SlackVar(int64 index) const { return slacks_[index]; }
2353 
2354 #if !defined(SWIGPYTHON)
2355  const std::vector<IntVar*>& cumuls() const { return cumuls_; }
2358  const std::vector<IntVar*>& fixed_transits() const { return fixed_transits_; }
2359  const std::vector<IntVar*>& transits() const { return transits_; }
2360  const std::vector<IntVar*>& slacks() const { return slacks_; }
2361 #if !defined(SWIGCSHARP) && !defined(SWIGJAVA)
2362  const std::vector<SortedDisjointIntervalList>& forbidden_intervals() const {
2364  return forbidden_intervals_;
2365  }
2367  SortedDisjointIntervalList GetAllowedIntervalsInRange(int64 index,
2368  int64 min_value,
2369  int64 max_value) const;
2373  int64 min_value) const {
2374  DCHECK_LT(index, forbidden_intervals_.size());
2376  forbidden_intervals_[index];
2377  const auto first_forbidden_interval_it =
2378  forbidden_intervals.FirstIntervalGreaterOrEqual(min_value);
2379  if (first_forbidden_interval_it != forbidden_intervals.end() &&
2380  min_value >= first_forbidden_interval_it->start) {
2382  return CapAdd(first_forbidden_interval_it->end, 1);
2383  }
2385  return min_value;
2386  }
2392  int64 max_value) const {
2393  DCHECK_LT(index, forbidden_intervals_.size());
2395  forbidden_intervals_[index];
2396  const auto last_forbidden_interval_it =
2397  forbidden_intervals.LastIntervalLessOrEqual(max_value);
2398  if (last_forbidden_interval_it != forbidden_intervals.end() &&
2399  max_value <= last_forbidden_interval_it->end) {
2401  return CapSub(last_forbidden_interval_it->start, 1);
2402  }
2404  return max_value;
2405  }
2407  const std::vector<int64>& vehicle_capacities() const {
2408  return vehicle_capacities_;
2409  }
2413  return model_->TransitCallback(
2414  class_evaluators_[vehicle_to_class_[vehicle]]);
2415  }
2420  int vehicle) const {
2421  return model_->UnaryTransitCallbackOrNull(
2422  class_evaluators_[vehicle_to_class_[vehicle]]);
2423  }
2426  bool AreVehicleTransitsPositive(int vehicle) const {
2427  return model()->is_transit_evaluator_positive_
2428  [class_evaluators_[vehicle_to_class_[vehicle]]];
2429  }
2430  int vehicle_to_class(int vehicle) const { return vehicle_to_class_[vehicle]; }
2431 #endif
2432 #endif
2433  void SetSpanUpperBoundForVehicle(int64 upper_bound, int vehicle);
2452 
2453 #ifndef SWIG
2459  const PiecewiseLinearFunction& cost);
2466  int64 index) const;
2467 #endif
2468 
2477  void SetCumulVarSoftUpperBound(int64 index, int64 upper_bound,
2478  int64 coefficient);
2490 
2500  void SetCumulVarSoftLowerBound(int64 index, int64 lower_bound,
2501  int64 coefficient);
2528  // TODO(user): Remove if !defined when routing.i is repaired.
2529 #if !defined(SWIGPYTHON)
2530  void SetBreakIntervalsOfVehicle(std::vector<IntervalVar*> breaks, int vehicle,
2531  int pre_travel_evaluator,
2532  int post_travel_evaluator);
2533 #endif // !defined(SWIGPYTHON)
2534 
2536  void SetBreakIntervalsOfVehicle(std::vector<IntervalVar*> breaks, int vehicle,
2537  std::vector<int64> node_visit_transits);
2538 
2543  void SetBreakDistanceDurationOfVehicle(int64 distance, int64 duration,
2544  int vehicle);
2547  void InitializeBreaks();
2549  bool HasBreakConstraints() const;
2550 #if !defined(SWIGPYTHON)
2554  std::vector<IntervalVar*> breaks, int vehicle,
2555  std::vector<int64> node_visit_transits,
2556  std::function<int64(int64, int64)> group_delays);
2557 
2559  const std::vector<IntervalVar*>& GetBreakIntervalsOfVehicle(
2560  int vehicle) const;
2563  // clang-format off
2564  const std::vector<std::pair<int64, int64> >&
2565  GetBreakDistanceDurationOfVehicle(int vehicle) const;
2566  // clang-format on
2567 #endif
2568  int GetPreTravelEvaluatorOfVehicle(int vehicle) const;
2569  int GetPostTravelEvaluatorOfVehicle(int vehicle) const;
2570 
2572  const RoutingDimension* base_dimension() const { return base_dimension_; }
2580  int64 ShortestTransitionSlack(int64 node) const;
2581 
2583  const std::string& name() const { return name_; }
2584 
2586 #ifndef SWIG
2588  return path_precedence_graph_;
2589  }
2590 #endif // SWIG
2591 
2601  typedef std::function<int64(int, int)> PickupToDeliveryLimitFunction;
2602 
2604  PickupToDeliveryLimitFunction limit_function, int pair_index);
2605 
2606  bool HasPickupToDeliveryLimits() const;
2607 #ifndef SWIG
2608  int64 GetPickupToDeliveryLimitForPair(int pair_index, int pickup,
2609  int delivery) const;
2610 
2615  };
2616 
2618  node_precedences_.push_back(precedence);
2619  }
2620  const std::vector<NodePrecedence>& GetNodePrecedences() const {
2621  return node_precedences_;
2622  }
2623 #endif // SWIG
2624 
2625  void AddNodePrecedence(int64 first_node, int64 second_node, int64 offset) {
2626  AddNodePrecedence({first_node, second_node, offset});
2627  }
2628 
2629  int64 GetSpanUpperBoundForVehicle(int vehicle) const {
2630  return vehicle_span_upper_bounds_[vehicle];
2631  }
2632 #ifndef SWIG
2633  const std::vector<int64>& vehicle_span_upper_bounds() const {
2634  return vehicle_span_upper_bounds_;
2635  }
2636 #endif // SWIG
2638  return vehicle_span_cost_coefficients_[vehicle];
2639  }
2640 #ifndef SWIG
2641  const std::vector<int64>& vehicle_span_cost_coefficients() const {
2642  return vehicle_span_cost_coefficients_;
2643  }
2644 #endif // SWIG
2646  return global_span_cost_coefficient_;
2647  }
2648 
2650  DCHECK_GE(global_optimizer_offset_, 0);
2651  return global_optimizer_offset_;
2652  }
2654  if (vehicle >= local_optimizer_offset_for_vehicle_.size()) {
2655  return 0;
2656  }
2657  DCHECK_GE(local_optimizer_offset_for_vehicle_[vehicle], 0);
2658  return local_optimizer_offset_for_vehicle_[vehicle];
2659  }
2660 #if !defined SWIG
2664  int vehicle) {
2665  if (!HasSoftSpanUpperBounds()) {
2666  vehicle_soft_span_upper_bound_ = absl::make_unique<SimpleBoundCosts>(
2667  model_->vehicles(), SimpleBoundCosts::BoundCost{kint64max, 0});
2668  }
2669  vehicle_soft_span_upper_bound_->bound_cost(vehicle) = bound_cost;
2670  }
2671  bool HasSoftSpanUpperBounds() const {
2672  return vehicle_soft_span_upper_bound_ != nullptr;
2673  }
2675  int vehicle) const {
2677  return vehicle_soft_span_upper_bound_->bound_cost(vehicle);
2678  }
2682  SimpleBoundCosts::BoundCost bound_cost, int vehicle) {
2684  vehicle_quadratic_cost_soft_span_upper_bound_ =
2685  absl::make_unique<SimpleBoundCosts>(
2686  model_->vehicles(), SimpleBoundCosts::BoundCost{kint64max, 0});
2687  }
2688  vehicle_quadratic_cost_soft_span_upper_bound_->bound_cost(vehicle) =
2689  bound_cost;
2690  }
2692  return vehicle_quadratic_cost_soft_span_upper_bound_ != nullptr;
2693  }
2695  int vehicle) const {
2697  return vehicle_quadratic_cost_soft_span_upper_bound_->bound_cost(vehicle);
2698  }
2699 #endif
2700 
2701  private:
2702  struct SoftBound {
2703  IntVar* var;
2704  int64 bound;
2706  };
2707 
2708  struct PiecewiseLinearCost {
2709  PiecewiseLinearCost() : var(nullptr), cost(nullptr) {}
2710  IntVar* var;
2711  std::unique_ptr<PiecewiseLinearFunction> cost;
2712  };
2713 
2714  class SelfBased {};
2715  RoutingDimension(RoutingModel* model, std::vector<int64> vehicle_capacities,
2716  const std::string& name,
2717  const RoutingDimension* base_dimension);
2718  RoutingDimension(RoutingModel* model, std::vector<int64> vehicle_capacities,
2719  const std::string& name, SelfBased);
2720  void Initialize(const std::vector<int>& transit_evaluators,
2721  const std::vector<int>& state_dependent_transit_evaluators,
2722  int64 slack_max);
2723  void InitializeCumuls();
2724  void InitializeTransits(
2725  const std::vector<int>& transit_evaluators,
2726  const std::vector<int>& state_dependent_transit_evaluators,
2727  int64 slack_max);
2728  void InitializeTransitVariables(int64 slack_max);
2730  void SetupCumulVarSoftUpperBoundCosts(
2731  std::vector<IntVar*>* cost_elements) const;
2733  void SetupCumulVarSoftLowerBoundCosts(
2734  std::vector<IntVar*>* cost_elements) const;
2735  void SetupCumulVarPiecewiseLinearCosts(
2736  std::vector<IntVar*>* cost_elements) const;
2739  void SetupGlobalSpanCost(std::vector<IntVar*>* cost_elements) const;
2740  void SetupSlackAndDependentTransitCosts() const;
2742  void CloseModel(bool use_light_propagation);
2743 
2744  void SetOffsetForGlobalOptimizer(int64 offset) {
2745  global_optimizer_offset_ = std::max(Zero(), offset);
2746  }
2748  void SetVehicleOffsetsForLocalOptimizer(std::vector<int64> offsets) {
2750  std::transform(offsets.begin(), offsets.end(), offsets.begin(),
2751  [](int64 offset) { return std::max(Zero(), offset); });
2752  local_optimizer_offset_for_vehicle_ = std::move(offsets);
2753  }
2754 
2755  std::vector<IntVar*> cumuls_;
2756  std::vector<SortedDisjointIntervalList> forbidden_intervals_;
2757  std::vector<IntVar*> capacity_vars_;
2758  const std::vector<int64> vehicle_capacities_;
2759  std::vector<IntVar*> transits_;
2760  std::vector<IntVar*> fixed_transits_;
2763  std::vector<int> class_evaluators_;
2764  std::vector<int64> vehicle_to_class_;
2765 #ifndef SWIG
2766  ReverseArcListGraph<int, int> path_precedence_graph_;
2767 #endif
2768  // For every {first_node, second_node, offset} element in node_precedences_,
2769  // if both first_node and second_node are performed, then
2770  // cumuls_[second_node] must be greater than (or equal to)
2771  // cumuls_[first_node] + offset.
2772  std::vector<NodePrecedence> node_precedences_;
2773 
2774  // The transits of a dimension may depend on its cumuls or the cumuls of
2775  // another dimension. There can be no cycles, except for self loops, a
2776  // typical example for this is a time dimension.
2777  const RoutingDimension* const base_dimension_;
2778 
2779  // Values in state_dependent_class_evaluators_ correspond to the evaluators
2780  // in RoutingModel::state_dependent_transit_evaluators_ for each vehicle
2781  // class.
2782  std::vector<int> state_dependent_class_evaluators_;
2783  std::vector<int64> state_dependent_vehicle_to_class_;
2784 
2785  // For each pickup/delivery pair_index for which limits have been set,
2786  // pickup_to_delivery_limits_per_pair_index_[pair_index] contains the
2787  // PickupToDeliveryLimitFunction for the pickup and deliveries in this pair.
2788  std::vector<PickupToDeliveryLimitFunction>
2789  pickup_to_delivery_limits_per_pair_index_;
2790 
2791  // Used if some vehicle has breaks in this dimension, typically time.
2792  bool break_constraints_are_initialized_ = false;
2793  // clang-format off
2794  std::vector<std::vector<IntervalVar*> > vehicle_break_intervals_;
2795  std::vector<std::vector<std::pair<int64, int64> > >
2796  vehicle_break_distance_duration_;
2797  // clang-format on
2798  // For each vehicle, stores the part of travel that is made directly
2799  // after (before) the departure (arrival) node of the travel.
2800  // These parts of the travel are non-interruptible, in particular by a break.
2801  std::vector<int> vehicle_pre_travel_evaluators_;
2802  std::vector<int> vehicle_post_travel_evaluators_;
2803 
2804  std::vector<IntVar*> slacks_;
2805  std::vector<IntVar*> dependent_transits_;
2806  std::vector<int64> vehicle_span_upper_bounds_;
2807  int64 global_span_cost_coefficient_;
2808  std::vector<int64> vehicle_span_cost_coefficients_;
2809  std::vector<SoftBound> cumul_var_soft_upper_bound_;
2810  std::vector<SoftBound> cumul_var_soft_lower_bound_;
2811  std::vector<PiecewiseLinearCost> cumul_var_piecewise_linear_cost_;
2812  RoutingModel* const model_;
2813  const std::string name_;
2814  int64 global_optimizer_offset_;
2815  std::vector<int64> local_optimizer_offset_for_vehicle_;
2817  std::unique_ptr<SimpleBoundCosts> vehicle_soft_span_upper_bound_;
2818  std::unique_ptr<SimpleBoundCosts>
2819  vehicle_quadratic_cost_soft_span_upper_bound_;
2820  friend class RoutingModel;
2822  friend void AppendDimensionCumulFilters(
2823  const std::vector<RoutingDimension*>& dimensions,
2824  const RoutingSearchParameters& parameters, bool filter_objective_cost,
2825  std::vector<LocalSearchFilterManager::FilterEvent>* filters);
2826 
2828 };
2829 
2830 #ifndef SWIG
2831 class SweepArranger {
2834  public:
2835  explicit SweepArranger(const std::vector<std::pair<int64, int64>>& points);
2836  virtual ~SweepArranger() {}
2837  void ArrangeIndices(std::vector<int64>* indices);
2838  void SetSectors(int sectors) { sectors_ = sectors; }
2839 
2840  private:
2841  std::vector<int> coordinates_;
2842  int sectors_;
2843 
2844  DISALLOW_COPY_AND_ASSIGN(SweepArranger);
2845 };
2846 #endif
2847 
2850 DecisionBuilder* MakeSetValuesFromTargets(Solver* solver,
2851  std::vector<IntVar*> variables,
2852  std::vector<int64> targets);
2853 
2854 #ifndef SWIG
2855 // Helper class that stores vehicles by their type. Two vehicles have the same
2856 // "vehicle type" iff they have the same cost class and start/end nodes.
2858  public:
2860  const RoutingModel::VehicleTypeContainer& vehicle_type_container)
2861  : vehicle_type_container_(&vehicle_type_container) {}
2862 
2863  int NumTypes() const { return vehicle_type_container_->NumTypes(); }
2864 
2865  int Type(int vehicle) const { return vehicle_type_container_->Type(vehicle); }
2866 
2867  void Reset() {
2868  sorted_vehicle_classes_per_type_ =
2869  vehicle_type_container_->sorted_vehicle_classes_per_type;
2870  const std::vector<std::deque<int>>& vehicles_per_class =
2871  vehicle_type_container_->vehicles_per_vehicle_class;
2872  vehicles_per_vehicle_class_.resize(vehicles_per_class.size());
2873  for (int i = 0; i < vehicles_per_vehicle_class_.size(); i++) {
2874  vehicles_per_vehicle_class_[i].resize(vehicles_per_class[i].size());
2875  std::copy(vehicles_per_class[i].begin(), vehicles_per_class[i].end(),
2876  vehicles_per_vehicle_class_[i].begin());
2877  }
2878  }
2879 
2880  int GetVehicleOfType(int type) const {
2881  DCHECK_LT(type, NumTypes());
2882  const std::set<VehicleClassEntry>& vehicle_classes =
2883  sorted_vehicle_classes_per_type_[type];
2884  if (vehicle_classes.empty()) {
2885  return -1;
2886  }
2887  const int vehicle_class = (vehicle_classes.begin())->vehicle_class;
2888  DCHECK(!vehicles_per_vehicle_class_[vehicle_class].empty());
2889  return vehicles_per_vehicle_class_[vehicle_class][0];
2890  }
2891 
2892  void ReinjectVehicleOfClass(int vehicle, int vehicle_class,
2893  int64 fixed_cost) {
2894  std::vector<int>& vehicles = vehicles_per_vehicle_class_[vehicle_class];
2895  if (vehicles.empty()) {
2896  // Add the vehicle class entry to the set (it was removed when
2897  // vehicles_per_vehicle_class_[vehicle_class] got empty).
2898  std::set<VehicleClassEntry>& vehicle_classes =
2899  sorted_vehicle_classes_per_type_[Type(vehicle)];
2900  const auto& insertion =
2901  vehicle_classes.insert({vehicle_class, fixed_cost});
2902  DCHECK(insertion.second);
2903  }
2904  vehicles.push_back(vehicle);
2905  }
2906 
2907  // Searches for the best compatible vehicle of the given type, i.e. the first
2908  // vehicle v of type 'type' for which vehicle_is_compatible(v) returns true.
2909  // If a compatible vehicle is found, its index is removed from
2910  // vehicles_per_vehicle_class_ and returned.
2911  // Returns -1 otherwise.
2913  int type, std::function<bool(int)> vehicle_is_compatible);
2914 
2915  private:
2916  using VehicleClassEntry =
2918  const RoutingModel::VehicleTypeContainer* const vehicle_type_container_;
2919  // clang-format off
2920  std::vector<std::set<VehicleClassEntry> > sorted_vehicle_classes_per_type_;
2921  std::vector<std::vector<int> > vehicles_per_vehicle_class_;
2922  // clang-format on
2923 };
2924 
2937 
2939 // TODO(user): Eventually move this to the core CP solver library
2942  public:
2944  std::unique_ptr<IntVarFilteredHeuristic> heuristic);
2945 
2947 
2948  Decision* Next(Solver* solver) override;
2949 
2950  std::string DebugString() const override;
2951 
2953  int64 number_of_decisions() const;
2954  int64 number_of_rejects() const;
2955 
2956  private:
2957  const std::unique_ptr<IntVarFilteredHeuristic> heuristic_;
2958 };
2959 
2962  public:
2963  IntVarFilteredHeuristic(Solver* solver, const std::vector<IntVar*>& vars,
2964  LocalSearchFilterManager* filter_manager);
2965 
2967 
2970  Assignment* const BuildSolution();
2971 
2974  int64 number_of_decisions() const { return number_of_decisions_; }
2975  int64 number_of_rejects() const { return number_of_rejects_; }
2976 
2977  virtual std::string DebugString() const { return "IntVarFilteredHeuristic"; }
2978 
2979  protected:
2981  void ResetSolution();
2983  virtual bool InitializeSolution() { return true; }
2985  virtual bool BuildSolutionInternal() = 0;
2989  bool Commit();
2991  virtual bool StopSearch() { return false; }
2995  if (!is_in_delta_[index]) {
2996  delta_->FastAdd(vars_[index])->SetValue(value);
2997  delta_indices_.push_back(index);
2998  is_in_delta_[index] = true;
2999  } else {
3000  delta_->SetValue(vars_[index], value);
3001  }
3002  }
3007  }
3009  bool Contains(int64 index) const {
3010  return assignment_->IntVarContainer().Element(index).Var() != nullptr;
3011  }
3014  int Size() const { return vars_.size(); }
3016  IntVar* Var(int64 index) const { return vars_[index]; }
3018  void SynchronizeFilters();
3019 
3021 
3022  private:
3025  bool FilterAccept();
3026 
3027  Solver* solver_;
3028  const std::vector<IntVar*> vars_;
3029  Assignment* const delta_;
3030  std::vector<int> delta_indices_;
3031  std::vector<bool> is_in_delta_;
3032  Assignment* const empty_;
3033  LocalSearchFilterManager* filter_manager_;
3035  int64 number_of_decisions_;
3036  int64 number_of_rejects_;
3037 };
3038 
3041  public:
3043  LocalSearchFilterManager* filter_manager);
3047  const std::function<int64(int64)>& next_accessor);
3048  RoutingModel* model() const { return model_; }
3050  int GetStartChainEnd(int vehicle) const { return start_chain_ends_[vehicle]; }
3052  int GetEndChainStart(int vehicle) const { return end_chain_starts_[vehicle]; }
3063 
3064  protected:
3065  bool StopSearch() override { return model_->CheckLimit(); }
3066  virtual void SetVehicleIndex(int64 node, int vehicle) {}
3067  virtual void ResetVehicleIndices() {}
3068 
3069  private:
3071  bool InitializeSolution() override;
3072 
3073  RoutingModel* const model_;
3074  std::vector<int64> start_chain_ends_;
3075  std::vector<int64> end_chain_starts_;
3076 };
3077 
3079  public:
3082  RoutingModel* model, std::function<int64(int64, int64, int64)> evaluator,
3083  std::function<int64(int64)> penalty_evaluator,
3084  LocalSearchFilterManager* filter_manager);
3086 
3087  protected:
3088  typedef std::pair<int64, int64> ValuedPosition;
3089  struct StartEndValue {
3091  int vehicle;
3092 
3093  bool operator<(const StartEndValue& other) const {
3094  return std::tie(distance, vehicle) <
3095  std::tie(other.distance, other.vehicle);
3096  }
3097  };
3098  typedef std::pair<StartEndValue, /*seed_node*/ int> Seed;
3099 
3105  // clang-format off
3106  std::vector<std::vector<StartEndValue> >
3107  ComputeStartEndDistanceForVehicles(const std::vector<int>& vehicles);
3108 
3113  template <class Queue>
3115  std::vector<std::vector<StartEndValue> >* start_end_distances_per_node,
3116  Queue* priority_queue);
3117  // clang-format on
3118 
3123  void InsertBetween(int64 node, int64 predecessor, int64 successor);
3129  int64 node_to_insert, int64 start, int64 next_after_start, int64 vehicle,
3130  std::vector<ValuedPosition>* valued_positions);
3135  // TODO(user): Replace 'insert_before' and 'insert_after' by 'predecessor'
3136  // and 'successor' in the code.
3138  int64 insert_after,
3139  int64 insert_before,
3140  int vehicle) const;
3143  int64 GetUnperformedValue(int64 node_to_insert) const;
3144 
3145  std::function<int64(int64, int64, int64)> evaluator_;
3146  std::function<int64(int64)> penalty_evaluator_;
3147 };
3148 
3158  public:
3177  };
3178 
3181  RoutingModel* model, std::function<int64(int64, int64, int64)> evaluator,
3182  std::function<int64(int64)> penalty_evaluator,
3183  LocalSearchFilterManager* filter_manager,
3186  bool BuildSolutionInternal() override;
3187  std::string DebugString() const override {
3188  return "GlobalCheapestInsertionFilteredHeuristic";
3189  }
3190 
3191  private:
3192  class PairEntry;
3193  class NodeEntry;
3194  typedef absl::flat_hash_set<PairEntry*> PairEntries;
3195  typedef absl::flat_hash_set<NodeEntry*> NodeEntries;
3196 
3203  void InsertPairsAndNodesByRequirementTopologicalOrder();
3204 
3211  void InsertPairs(const std::vector<int>& pair_indices);
3212 
3220  void InsertNodesOnRoutes(const std::vector<int>& nodes,
3221  const absl::flat_hash_set<int>& vehicles);
3222 
3228  void SequentialInsertNodes(const std::vector<int>& nodes);
3229 
3233  void DetectUsedVehicles(std::vector<bool>* is_vehicle_used,
3234  std::vector<int>* unused_vehicles,
3235  absl::flat_hash_set<int>* used_vehicles);
3236 
3240  void InsertFarthestNodesAsSeeds();
3241 
3250  template <class Queue>
3251  int InsertSeedNode(
3252  std::vector<std::vector<StartEndValue>>* start_end_distances_per_node,
3253  Queue* priority_queue, std::vector<bool>* is_vehicle_used);
3254  // clang-format on
3255 
3258  void InitializePairPositions(
3259  const std::vector<int>& pair_indices,
3260  AdjustablePriorityQueue<PairEntry>* priority_queue,
3261  std::vector<PairEntries>* pickup_to_entries,
3262  std::vector<PairEntries>* delivery_to_entries);
3268  void InitializeInsertionEntriesPerformingPair(
3269  int64 pickup, int64 delivery, int64 penalty,
3270  AdjustablePriorityQueue<PairEntry>* priority_queue,
3271  std::vector<PairEntries>* pickup_to_entries,
3272  std::vector<PairEntries>* delivery_to_entries);
3275  void UpdatePairPositions(const std::vector<int>& pair_indices, int vehicle,
3276  int64 insert_after,
3277  AdjustablePriorityQueue<PairEntry>* priority_queue,
3278  std::vector<PairEntries>* pickup_to_entries,
3279  std::vector<PairEntries>* delivery_to_entries) {
3280  UpdatePickupPositions(pair_indices, vehicle, insert_after, priority_queue,
3281  pickup_to_entries, delivery_to_entries);
3282  UpdateDeliveryPositions(pair_indices, vehicle, insert_after, priority_queue,
3283  pickup_to_entries, delivery_to_entries);
3284  }
3287  void UpdatePickupPositions(const std::vector<int>& pair_indices, int vehicle,
3288  int64 pickup_insert_after,
3289  AdjustablePriorityQueue<PairEntry>* priority_queue,
3290  std::vector<PairEntries>* pickup_to_entries,
3291  std::vector<PairEntries>* delivery_to_entries);
3294  void UpdateDeliveryPositions(
3295  const std::vector<int>& pair_indices, int vehicle,
3296  int64 delivery_insert_after,
3297  AdjustablePriorityQueue<PairEntry>* priority_queue,
3298  std::vector<PairEntries>* pickup_to_entries,
3299  std::vector<PairEntries>* delivery_to_entries);
3302  void DeletePairEntry(PairEntry* entry,
3303  AdjustablePriorityQueue<PairEntry>* priority_queue,
3304  std::vector<PairEntries>* pickup_to_entries,
3305  std::vector<PairEntries>* delivery_to_entries);
3308  void InitializePositions(const std::vector<int>& nodes,
3309  AdjustablePriorityQueue<NodeEntry>* priority_queue,
3310  std::vector<NodeEntries>* position_to_node_entries,
3311  const absl::flat_hash_set<int>& vehicles);
3317  void InitializeInsertionEntriesPerformingNode(
3318  int64 node, int64 penalty, const absl::flat_hash_set<int>& vehicles,
3319  AdjustablePriorityQueue<NodeEntry>* priority_queue,
3320  std::vector<NodeEntries>* position_to_node_entries);
3323  void UpdatePositions(const std::vector<int>& nodes, int vehicle,
3324  int64 insert_after,
3325  AdjustablePriorityQueue<NodeEntry>* priority_queue,
3326  std::vector<NodeEntries>* node_entries);
3329  void DeleteNodeEntry(NodeEntry* entry,
3330  AdjustablePriorityQueue<NodeEntry>* priority_queue,
3331  std::vector<NodeEntries>* node_entries);
3332 
3335  void ComputeNeighborhoods();
3336 
3339  bool IsNeighborForCostClass(int cost_class, int64 node_index,
3340  int64 neighbor_index) const;
3341 
3343  const std::vector<int64>& GetNeighborsOfNodeForCostClass(
3344  int cost_class, int64 node_index) const {
3345  return gci_params_.neighbors_ratio == 1
3346  ? all_nodes_
3347  : node_index_to_neighbors_by_cost_class_[node_index][cost_class]
3348  ->PositionsSetAtLeastOnce();
3349  }
3350 
3351  void ResetVehicleIndices() override {
3352  node_index_to_vehicle_.assign(node_index_to_vehicle_.size(), -1);
3353  }
3354 
3355  void SetVehicleIndex(int64 node, int vehicle) override {
3356  DCHECK_LT(node, node_index_to_vehicle_.size());
3357  node_index_to_vehicle_[node] = vehicle;
3358  }
3359 
3362  bool CheckVehicleIndices() const;
3363 
3364  GlobalCheapestInsertionParameters gci_params_;
3366  std::vector<int> node_index_to_vehicle_;
3367 
3368  // clang-format off
3369  std::vector<std::vector<std::unique_ptr<SparseBitset<int64> > > >
3370  node_index_to_neighbors_by_cost_class_;
3371  // clang-format on
3372 
3376  std::vector<int64> all_nodes_;
3377 };
3378 
3386  public:
3389  RoutingModel* model, std::function<int64(int64, int64, int64)> evaluator,
3390  LocalSearchFilterManager* filter_manager);
3392  bool BuildSolutionInternal() override;
3393  std::string DebugString() const override {
3394  return "LocalCheapestInsertionFilteredHeuristic";
3395  }
3396 
3397  private:
3403  void ComputeEvaluatorSortedPositions(int64 node,
3404  std::vector<int64>* sorted_positions);
3409  void ComputeEvaluatorSortedPositionsOnRouteAfter(
3410  int64 node, int64 start, int64 next_after_start,
3411  std::vector<int64>* sorted_positions);
3412 
3413  std::vector<std::vector<StartEndValue>> start_end_distances_per_node_;
3414 };
3415 
3419  public:
3421  LocalSearchFilterManager* filter_manager);
3423  bool BuildSolutionInternal() override;
3424 
3425  private:
3426  class PartialRoutesAndLargeVehicleIndicesFirst {
3427  public:
3428  explicit PartialRoutesAndLargeVehicleIndicesFirst(
3429  const CheapestAdditionFilteredHeuristic& builder)
3430  : builder_(builder) {}
3431  bool operator()(int vehicle1, int vehicle2) const;
3432 
3433  private:
3434  const CheapestAdditionFilteredHeuristic& builder_;
3435  };
3437  template <typename Iterator>
3438  std::vector<int64> GetPossibleNextsFromIterator(int64 node, Iterator start,
3439  Iterator end) const {
3440  const int size = model()->Size();
3441  std::vector<int64> nexts;
3442  for (Iterator it = start; it != end; ++it) {
3443  const int64 next = *it;
3444  if (next != node && (next >= size || !Contains(next))) {
3445  nexts.push_back(next);
3446  }
3447  }
3448  return nexts;
3449  }
3451  virtual void SortSuccessors(int64 node, std::vector<int64>* successors) = 0;
3452  virtual int64 FindTopSuccessor(int64 node,
3453  const std::vector<int64>& successors) = 0;
3454 };
3455 
3460  public:
3463  RoutingModel* model, std::function<int64(int64, int64)> evaluator,
3464  LocalSearchFilterManager* filter_manager);
3466  std::string DebugString() const override {
3467  return "EvaluatorCheapestAdditionFilteredHeuristic";
3468  }
3469 
3470  private:
3472  void SortSuccessors(int64 node, std::vector<int64>* successors) override;
3473  int64 FindTopSuccessor(int64 node,
3474  const std::vector<int64>& successors) override;
3475 
3476  std::function<int64(int64, int64)> evaluator_;
3477 };
3478 
3483  public:
3487  LocalSearchFilterManager* filter_manager);
3489  std::string DebugString() const override {
3490  return "ComparatorCheapestAdditionFilteredHeuristic";
3491  }
3492 
3493  private:
3495  void SortSuccessors(int64 node, std::vector<int64>* successors) override;
3496  int64 FindTopSuccessor(int64 node,
3497  const std::vector<int64>& successors) override;
3498 
3499  Solver::VariableValueComparator comparator_;
3500 };
3501 
3511  public:
3515  double neighbors_ratio = 1.0;
3521  bool add_reverse_arcs = false;
3524  double arc_coefficient = 1.0;
3525  };
3526 
3528  const RoutingIndexManager* manager,
3530  LocalSearchFilterManager* filter_manager);
3531  ~SavingsFilteredHeuristic() override;
3532  bool BuildSolutionInternal() override;
3533 
3534  protected:
3535  typedef std::pair</*saving*/ int64, /*saving index*/ int64> Saving;
3536 
3537  template <typename S>
3538  class SavingsContainer;
3539 
3540  virtual double ExtraSavingsMemoryMultiplicativeFactor() const = 0;
3541 
3542  virtual void BuildRoutesFromSavings() = 0;
3543 
3545  int64 GetVehicleTypeFromSaving(const Saving& saving) const {
3546  return saving.second / size_squared_;
3547  }
3549  int64 GetBeforeNodeFromSaving(const Saving& saving) const {
3550  return (saving.second % size_squared_) / Size();
3551  }
3553  int64 GetAfterNodeFromSaving(const Saving& saving) const {
3554  return (saving.second % size_squared_) % Size();
3555  }
3557  int64 GetSavingValue(const Saving& saving) const { return saving.first; }
3558 
3568  int StartNewRouteWithBestVehicleOfType(int type, int64 before_node,
3569  int64 after_node);
3570 
3571  // clang-format off
3572  std::unique_ptr<SavingsContainer<Saving> > savings_container_;
3573  // clang-format on
3574  std::unique_ptr<VehicleTypeCurator> vehicle_type_curator_;
3575 
3576  private:
3581  // clang-format off
3582  void AddSymmetricArcsToAdjacencyLists(
3583  std::vector<std::vector<int64> >* adjacency_lists);
3584  // clang-format on
3585 
3592  void ComputeSavings();
3594  Saving BuildSaving(int64 saving, int vehicle_type, int before_node,
3595  int after_node) const {
3596  return std::make_pair(saving, vehicle_type * size_squared_ +
3597  before_node * Size() + after_node);
3598  }
3599 
3603  int64 MaxNumNeighborsPerNode(int num_vehicle_types) const;
3604 
3605  const RoutingIndexManager* const manager_;
3606  const SavingsParameters savings_params_;
3607  int64 size_squared_;
3608 
3610 };
3611 
3613  public:
3615  const RoutingIndexManager* manager,
3617  LocalSearchFilterManager* filter_manager)
3618  : SavingsFilteredHeuristic(model, manager, parameters, filter_manager) {}
3620  std::string DebugString() const override {
3621  return "SequentialSavingsFilteredHeuristic";
3622  }
3623 
3624  private:
3629  void BuildRoutesFromSavings() override;
3630  double ExtraSavingsMemoryMultiplicativeFactor() const override { return 1.0; }
3631 };
3632 
3634  public:
3636  const RoutingIndexManager* manager,
3638  LocalSearchFilterManager* filter_manager)
3639  : SavingsFilteredHeuristic(model, manager, parameters, filter_manager) {}
3641  std::string DebugString() const override {
3642  return "ParallelSavingsFilteredHeuristic";
3643  }
3644 
3645  private:
3656  void BuildRoutesFromSavings() override;
3657 
3658  double ExtraSavingsMemoryMultiplicativeFactor() const override { return 2.0; }
3659 
3664  void MergeRoutes(int first_vehicle, int second_vehicle, int64 before_node,
3665  int64 after_node);
3666 
3668  std::vector<int64> first_node_on_route_;
3669  std::vector<int64> last_node_on_route_;
3673  std::vector<int> vehicle_of_first_or_last_node_;
3674 };
3675 
3679 
3681  public:
3683  LocalSearchFilterManager* filter_manager,
3684  bool use_minimum_matching);
3686  bool BuildSolutionInternal() override;
3687  std::string DebugString() const override {
3688  return "ChristofidesFilteredHeuristic";
3689  }
3690 
3691  private:
3692  const bool use_minimum_matching_;
3693 };
3694 #endif // SWIG
3695 
3700 bool SolveModelWithSat(const RoutingModel& model,
3701  const RoutingSearchParameters& search_parameters,
3702  const Assignment* initial_solution,
3703  Assignment* solution);
3704 
3706 
3708  public:
3709  BasePathFilter(const std::vector<IntVar*>& nexts, int next_domain_size);
3710  ~BasePathFilter() override {}
3711  bool Accept(const Assignment* delta, const Assignment* deltadelta,
3712  int64 objective_min, int64 objective_max) override;
3713  void OnSynchronize(const Assignment* delta) override;
3714 
3715  protected:
3716  static const int64 kUnassigned;
3717 
3718  int64 GetNext(int64 node) const {
3719  return (new_nexts_[node] == kUnassigned)
3720  ? (IsVarSynced(node) ? Value(node) : kUnassigned)
3721  : new_nexts_[node];
3722  }
3723  int NumPaths() const { return starts_.size(); }
3724  int64 Start(int i) const { return starts_[i]; }
3725  int GetPath(int64 node) const { return paths_[node]; }
3726  int Rank(int64 node) const { return ranks_[node]; }
3727  bool IsDisabled() const { return status_ == DISABLED; }
3728  const std::vector<int64>& GetTouchedPathStarts() const {
3729  return touched_paths_.PositionsSetAtLeastOnce();
3730  }
3731  const std::vector<int64>& GetNewSynchronizedUnperformedNodes() const {
3732  return new_synchronized_unperformed_nodes_.PositionsSetAtLeastOnce();
3733  }
3734 
3735  private:
3736  enum Status { UNKNOWN, ENABLED, DISABLED };
3737 
3738  virtual bool DisableFiltering() const { return false; }
3739  virtual void OnBeforeSynchronizePaths() {}
3740  virtual void OnAfterSynchronizePaths() {}
3741  virtual void OnSynchronizePathFromStart(int64 start) {}
3742  virtual void InitializeAcceptPath() {}
3743  virtual bool AcceptPath(int64 path_start, int64 chain_start,
3744  int64 chain_end) = 0;
3745  virtual bool FinalizeAcceptPath(const Assignment* delta, int64 objective_min,
3746  int64 objective_max) {
3747  return true;
3748  }
3750  void ComputePathStarts(std::vector<int64>* path_starts,
3751  std::vector<int>* index_to_path);
3752  bool HavePathsChanged();
3753  void SynchronizeFullAssignment();
3754  void UpdateAllRanks();
3755  void UpdatePathRanksFromStart(int start);
3756 
3757  std::vector<int64> node_path_starts_;
3758  std::vector<int64> starts_;
3759  std::vector<int> paths_;
3760  SparseBitset<int64> new_synchronized_unperformed_nodes_;
3761  std::vector<int64> new_nexts_;
3762  std::vector<int> delta_touched_;
3763  SparseBitset<> touched_paths_;
3764  // clang-format off
3765  std::vector<std::pair<int64, int64> > touched_path_chain_start_ends_;
3766  // clang-format on
3767  std::vector<int> ranks_;
3768 
3769  Status status_;
3770 };
3771 
3776 // TODO(user): Also call the solution finalizer on variables, with the
3782 // TODO(user): Avoid such false negatives.
3784  public:
3785  explicit CPFeasibilityFilter(RoutingModel* routing_model);
3786  ~CPFeasibilityFilter() override {}
3787  std::string DebugString() const override { return "CPFeasibilityFilter"; }
3788  bool Accept(const Assignment* delta, const Assignment* deltadelta,
3789  int64 objective_min, int64 objective_max) override;
3790  void OnSynchronize(const Assignment* delta) override;
3791 
3792  private:
3793  void AddDeltaToAssignment(const Assignment* delta, Assignment* assignment);
3794 
3795  static const int64 kUnassigned;
3796  const RoutingModel* const model_;
3797  Solver* const solver_;
3798  Assignment* const assignment_;
3799  Assignment* const temp_assignment_;
3800  DecisionBuilder* const restore_;
3801  SearchLimit* const limit_;
3802 };
3803 
3804 #if !defined(SWIG)
3805 IntVarLocalSearchFilter* MakeMaxActiveVehiclesFilter(
3806  const RoutingModel& routing_model);
3807 IntVarLocalSearchFilter* MakeNodeDisjunctionFilter(
3808  const RoutingModel& routing_model);
3809 IntVarLocalSearchFilter* MakeVehicleAmortizedCostFilter(
3810  const RoutingModel& routing_model);
3811 IntVarLocalSearchFilter* MakeTypeRegulationsFilter(
3812  const RoutingModel& routing_model);
3814  const std::vector<RoutingDimension*>& dimensions,
3815  const RoutingSearchParameters& parameters, bool filter_objective_cost,
3816  std::vector<LocalSearchFilterManager::FilterEvent>* filters);
3818  const PathState* path_state,
3819  const std::vector<RoutingDimension*>& dimensions,
3820  std::vector<LocalSearchFilterManager::FilterEvent>* filters);
3821 IntVarLocalSearchFilter* MakePathCumulFilter(
3822  const RoutingDimension& dimension,
3823  const RoutingSearchParameters& parameters,
3824  bool propagate_own_objective_value, bool filter_objective_cost,
3825  bool can_use_lp = true);
3826 IntVarLocalSearchFilter* MakeCumulBoundsPropagatorFilter(
3827  const RoutingDimension& dimension);
3828 IntVarLocalSearchFilter* MakeGlobalLPCumulFilter(
3829  GlobalDimensionCumulOptimizer* optimizer, bool filter_objective_cost);
3830 IntVarLocalSearchFilter* MakePickupDeliveryFilter(
3831  const RoutingModel& routing_model, const RoutingModel::IndexPairs& pairs,
3832  const std::vector<RoutingModel::PickupAndDeliveryPolicy>& vehicle_policies);
3833 IntVarLocalSearchFilter* MakeVehicleVarFilter(
3834  const RoutingModel& routing_model);
3835 IntVarLocalSearchFilter* MakeVehicleBreaksFilter(
3836  const RoutingModel& routing_model, const RoutingDimension& dimension);
3837 IntVarLocalSearchFilter* MakeCPFeasibilityFilter(RoutingModel* routing_model);
3838 #endif
3839 
3840 } // namespace operations_research
3841 #endif // OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_H_
operations_research::RoutingModel::VariableIndexEvaluator2
std::function< StateDependentTransit(int64, int64)> VariableIndexEvaluator2
Definition: routing.h:267
operations_research::SavingsFilteredHeuristic::BuildSolutionInternal
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
Definition: routing_search.cc:5091
operations_research::RoutingModel::SetPrimaryConstrainedDimension
void SetPrimaryConstrainedDimension(const std::string &dimension_name)
Set the given dimension as "primary constrained".
Definition: routing.h:590
operations_research::IntVarFilteredDecisionBuilder::Next
Decision * Next(Solver *solver) override
This is the main method of the decision builder class.
Definition: routing_search.cc:2792
operations_research::RoutingDimension::RoutingModel
friend class RoutingModel
Definition: routing.h:2820
operations_research::TypeRegulationsConstraint::TypeRegulationsConstraint
TypeRegulationsConstraint(const RoutingModel &model)
Definition: routing.cc:6581
operations_research::IntVar
The class IntVar is a subset of IntExpr.
Definition: constraint_solver.h:3992
operations_research::RoutingModel::GetHardTypeIncompatibilitiesOfType
const absl::flat_hash_set< int > & GetHardTypeIncompatibilitiesOfType(int type) const
Returns visit types incompatible with a given type.
Definition: routing.cc:4223
operations_research::RoutingModel::CostClass::DimensionCost::operator<
bool operator<(const DimensionCost &cost) const
Definition: routing.h:299
operations_research::RoutingModel::kNoDisjunction
static const DisjunctionIndex kNoDisjunction
Constant used to express the "no disjunction" index, returned when a node does not appear in any disj...
Definition: routing.h:386
operations_research::IntVarFilteredHeuristic::~IntVarFilteredHeuristic
virtual ~IntVarFilteredHeuristic()
Definition: routing.h:2966
operations_research::RoutingModel::AddHardTypeIncompatibility
void AddHardTypeIncompatibility(int type1, int type2)
Incompatibilities: Two nodes with "hard" incompatible types cannot share the same route at all,...
Definition: routing.cc:4204
operations_research::RoutingModel::AddDimensionDependentDimensionWithVehicleCapacity
bool AddDimensionDependentDimensionWithVehicleCapacity(const std::vector< int > &pure_transits, const std::vector< int > &dependent_transits, const RoutingDimension *base_dimension, int64 slack_max, std::vector< int64 > vehicle_capacities, bool fix_start_cumul_to_zero, const std::string &name)
Creates a dimension with transits depending on the cumuls of another dimension.
Definition: routing.h:497
operations_research::TravelBounds::pre_travels
std::vector< int64 > pre_travels
Definition: routing.h:1997
operations_research::RoutingModel::VehicleClassIndex
RoutingVehicleClassIndex VehicleClassIndex
Definition: routing.h:239
operations_research::RegularLimit::Check
bool Check() override
This method is called to check the status of the limit.
Definition: search.cc:3988
operations_research::CheapestInsertionFilteredHeuristic::InsertBetween
void InsertBetween(int64 node, int64 predecessor, int64 successor)
Inserts 'node' just after 'predecessor', and just before 'successor', resulting in the following subs...
Definition: routing_search.cc:3132
operations_research::GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionParameters::neighbors_ratio
double neighbors_ratio
If neighbors_ratio < 1 then for each node only this ratio of its neighbors leading to the smallest ar...
Definition: routing.h:3167
operations_research::RoutingModel::GetDimensionsWithSoftOrSpanCosts
std::vector< RoutingDimension * > GetDimensionsWithSoftOrSpanCosts() const
Returns dimensions with soft or vehicle span costs.
Definition: routing.cc:5165
var
IntVar * var
Definition: expr_array.cc:1858
operations_research::RoutingModel::TransitCallback1
RoutingTransitCallback1 TransitCallback1
Definition: routing.h:240
operations_research::RoutingFilteredHeuristic
Filter-based heuristic dedicated to routing.
Definition: routing.h:3040
operations_research::TypeRegulationsConstraint
The following constraint ensures that incompatibilities and requirements between types are respected.
Definition: routing.h:2263
operations_research::IntVarLocalSearchFilter::IsVarSynced
bool IsVarSynced(int index) const
Definition: constraint_solveri.h:1837
operations_research::RoutingModel::RoutesToAssignment
bool RoutesToAssignment(const std::vector< std::vector< int64 >> &routes, bool ignore_inactive_indices, bool close_routes, Assignment *const assignment) const
Fills an assignment from a specification of the routes of the vehicles.
Definition: routing.cc:3778
operations_research::Solver::IndexEvaluator2
std::function< int64(int64, int64)> IndexEvaluator2
Definition: constraint_solver.h:739
operations_research::RoutingModel::CostClass::DimensionCost::transit_evaluator_class
int64 transit_evaluator_class
Definition: routing.h:296
operations_research::RoutingModel::IgnoreDisjunctionsAlreadyForcedToZero
void IgnoreDisjunctionsAlreadyForcedToZero()
SPECIAL: Makes the solver ignore all the disjunctions whose active variables are all trivially zero (...
Definition: routing.cc:1709
operations_research::RoutingModel::GetTopologicallySortedVisitTypes
const std::vector< std::vector< int > > & GetTopologicallySortedVisitTypes() const
Definition: routing.h:790
operations_research::TypeRegulationsChecker
Definition: routing.h:2123
operations_research::MakeCPFeasibilityFilter
IntVarLocalSearchFilter * MakeCPFeasibilityFilter(RoutingModel *routing_model)
Definition: routing_search.cc:2744
operations_research::RoutingModel::PICKUP_AND_DELIVERY_NO_ORDER
@ PICKUP_AND_DELIVERY_NO_ORDER
Any precedence is accepted.
Definition: routing.h:230
operations_research::RoutingModel::VehicleTypeContainer::VehicleClassEntry::vehicle_class
int vehicle_class
Definition: routing.h:358
operations_research::RoutingModel::VehicleTypeContainer::vehicles_per_vehicle_class
std::vector< std::deque< int > > vehicles_per_vehicle_class
Definition: routing.h:377
operations_research::DisjunctivePropagator::EdgeFinding
bool EdgeFinding(Tasks *tasks)
Does edge-finding deductions on all tasks.
Definition: routing_breaks.cc:136
operations_research::SavingsFilteredHeuristic::GetAfterNodeFromSaving
int64 GetAfterNodeFromSaving(const Saving &saving) const
Returns the "after node" from a saving.
Definition: routing.h:3553
operations_research::RoutingModel::SetSweepArranger
void SetSweepArranger(SweepArranger *sweep_arranger)
Definition: routing.h:1145
operations_research::DisjunctivePropagator::Tasks::num_chain_tasks
int num_chain_tasks
Definition: routing.h:1925
operations_research::RoutingDimension::GetTransitValueFromClass
int64 GetTransitValueFromClass(int64 from_index, int64 to_index, int64 vehicle_class) const
Same as above but taking a vehicle class of the dimension instead of a vehicle (the class of a vehicl...
Definition: routing.h:2342
operations_research::SimpleBoundCosts::BoundCost
Definition: routing.h:2294
operations_research::DisjunctivePropagator::DistanceDuration
bool DistanceDuration(Tasks *tasks)
Propagates distance_duration constraints, if any.
Definition: routing_breaks.cc:286
operations_research::RoutingModel::RegisterUnaryTransitCallback
int RegisterUnaryTransitCallback(TransitCallback1 callback)
Registers 'callback' and returns its index.
Definition: routing.cc:868
operations_research::RoutingModel::vehicles
int vehicles() const
Returns the number of vehicle routes in the model.
Definition: routing.h:1332
operations_research::SolveModelWithSat
bool SolveModelWithSat(const RoutingModel &model, const RoutingSearchParameters &search_parameters, const Assignment *initial_solution, Assignment *solution)
Attempts to solve the model using the cp-sat solver.
Definition: routing_sat.cc:495
operations_research::IntVarFilteredHeuristic::assignment_
Assignment *const assignment_
Definition: routing.h:3020
operations_research::RoutingModel::TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED
@ TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED
The visit doesn't have an impact on the number of types 'T' on the route, as it's (virtually) added a...
Definition: routing.h:775
operations_research::RoutingModel::VehicleClass
Definition: routing.h:322
DCHECK_LT
#define DCHECK_LT(val1, val2)
Definition: base/logging.h:888
operations_research::VehicleTypeCurator::Reset
void Reset()
Definition: routing.h:2867
operations_research::RoutingModel::Nexts
const std::vector< IntVar * > & Nexts() const
Returns all next variables of the model, such that Nexts(i) is the next variable of the node correspo...
Definition: routing.h:1187
operations_research::SavingsFilteredHeuristic::SavingsParameters::arc_coefficient
double arc_coefficient
arc_coefficient is a strictly positive parameter indicating the coefficient of the arc being consider...
Definition: routing.h:3524
operations_research::RoutingDimension::fixed_transits
const std::vector< IntVar * > & fixed_transits() const
Definition: routing.h:2358
operations_research::RoutingModel::SetAmortizedCostFactorsOfAllVehicles
void SetAmortizedCostFactorsOfAllVehicles(int64 linear_cost_factor, int64 quadratic_cost_factor)
The following methods set the linear and quadratic cost factors of vehicles (must be positive values)...
Definition: routing.cc:1322
routing_parameters.pb.h
operations_research::CapSub
int64 CapSub(int64 x, int64 y)
Definition: saturated_arithmetic.h:154
operations_research::RoutingModel::MakePathSpansAndTotalSlacks
Constraint * MakePathSpansAndTotalSlacks(const RoutingDimension *dimension, std::vector< IntVar * > spans, std::vector< IntVar * > total_slacks)
For every vehicle of the routing model:
Definition: routing.cc:6091
operations_research::RoutingDimension::HasQuadraticCostSoftSpanUpperBounds
bool HasQuadraticCostSoftSpanUpperBounds() const
Definition: routing.h:2691
operations_research::BasePathFilter::GetTouchedPathStarts
const std::vector< int64 > & GetTouchedPathStarts() const
Definition: routing.h:3728
max
int64 max
Definition: alldiff_cst.cc:139
operations_research::Assignment::IntVarContainer
const IntContainer & IntVarContainer() const
Definition: constraint_solver.h:5184
operations_research::RoutingModel::GetVehicleClassesCount
int GetVehicleClassesCount() const
Returns the number of different vehicle classes in the model.
Definition: routing.h:1265
operations_research::RoutingDimension::GetCumulVarSoftLowerBoundCoefficient
int64 GetCumulVarSoftLowerBoundCoefficient(int64 index) const
Returns the cost coefficient of the soft lower bound of a cumul variable for a given variable index.
Definition: routing.cc:6915
operations_research::RoutingModel::AddMatrixDimension
bool AddMatrixDimension(std::vector< std::vector< int64 > > values, int64 capacity, bool fix_start_cumul_to_zero, const std::string &name)
Creates a dimension where the transit variable is constrained to be equal to 'values[i][next(i)]' for...
Definition: routing.cc:1060
operations_research::RoutingModel::sweep_arranger
SweepArranger * sweep_arranger() const
Returns the sweep arranger to be used by routing heuristics.
Definition: routing.h:1149
operations_research::RoutingModel::GetDepot
int64 GetDepot() const
Returns the variable index of the first starting or ending node of all routes.
Definition: routing.cc:1886
operations_research::SweepArranger::ArrangeIndices
void ArrangeIndices(std::vector< int64 > *indices)
Definition: routing.cc:3087
operations_research::RoutingModel::CloseModelWithParameters
void CloseModelWithParameters(const RoutingSearchParameters &search_parameters)
Same as above taking search parameters (as of 10/2015 some the parameters have to be set when closing...
Definition: routing.cc:2163
operations_research::IntVarFilteredDecisionBuilder::DebugString
std::string DebugString() const override
Definition: routing_search.cc:2813
operations_research::DisjunctivePropagator::Tasks::span_max
int64 span_max
Definition: routing.h:1936
operations_research::RoutingModel::TransitCallback2
RoutingTransitCallback2 TransitCallback2
Definition: routing.h:241
operations_research::EvaluatorCheapestAdditionFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3466
operations_research::VehicleTypeCurator
Definition: routing.h:2857
operations_research::RoutingModel::GetDimensionOrDie
const RoutingDimension & GetDimensionOrDie(const std::string &dimension_name) const
Returns a dimension from its name. Dies if the dimension does not exist.
Definition: routing.cc:1277
operations_research::IntVarElement::Value
int64 Value() const
Definition: constraint_solver.h:4670
operations_research::RoutingModel::ForEachNodeInDisjunctionWithMaxCardinalityFromIndex
void ForEachNodeInDisjunctionWithMaxCardinalityFromIndex(int64 index, int64 max_cardinality, F f) const
Calls f for each variable index of indices in the same disjunctions as the node corresponding to the ...
Definition: routing.h:626
operations_research::DisjunctivePropagator::ForbiddenIntervals
bool ForbiddenIntervals(Tasks *tasks)
Tasks might have holes in their domain, this enforces such holes.
Definition: routing_breaks.cc:250
operations_research::RoutingModel::SetAmortizedCostFactorsOfVehicle
void SetAmortizedCostFactorsOfVehicle(int64 linear_cost_factor, int64 quadratic_cost_factor, int vehicle)
Sets the linear and quadratic cost factor of the given vehicle.
Definition: routing.cc:1330
bound
int64 bound
Definition: routing_search.cc:969
operations_research::RoutingModel::AddConstantDimension
bool AddConstantDimension(int64 value, int64 capacity, bool fix_start_cumul_to_zero, const std::string &name)
Definition: routing.h:465
operations_research::RoutingModel::GetVisitType
int GetVisitType(int64 index) const
Definition: routing.cc:4174
operations_research::RoutingDimension::NodePrecedence::second_node
int64 second_node
Definition: routing.h:2613
operations_research::RoutingTransitCallback1
std::function< int64(int64)> RoutingTransitCallback1
Definition: routing_types.h:41
operations_research::ChristofidesFilteredHeuristic
Christofides addition heuristic.
Definition: routing.h:3680
operations_research::DisjunctivePropagator::DetectablePrecedencesWithChain
bool DetectablePrecedencesWithChain(Tasks *tasks)
Does detectable precedences deductions on tasks in the chain precedence, taking the time windows of n...
Definition: routing_breaks.cc:197
adjustable_priority_queue.h
operations_research::VehicleTypeCurator::Type
int Type(int vehicle) const
Definition: routing.h:2865
operations_research::VehicleTypeCurator::GetVehicleOfType
int GetVehicleOfType(int type) const
Definition: routing.h:2880
LOG
#define LOG(severity)
Definition: base/logging.h:420
operations_research::IntVarElement::Var
IntVar * Var() const
Definition: constraint_solver.h:4653
lp_data.h
operations_research::RoutingModel::VehicleTypeContainer::sorted_vehicle_classes_per_type
std::vector< std::set< VehicleClassEntry > > sorted_vehicle_classes_per_type
Definition: routing.h:376
operations_research::IntVarElement::SetValue
void SetValue(int64 v)
Definition: constraint_solver.h:4680
operations_research::RoutingModel::CostClass::evaluator_index
int evaluator_index
Index of the arc cost evaluator, registered in the RoutingModel class.
Definition: routing.h:273
operations_research::TypeRegulationsConstraint::InitialPropagate
void InitialPropagate() override
This method performs the initial propagation of the constraint.
Definition: routing.cc:6629
operations_research::RoutingModel::CostClass
Definition: routing.h:271
operations_research::LocalSearchFilterManager::kRelax
@ kRelax
Definition: constraint_solveri.h:1767
operations_research::BasePathFilter::GetNewSynchronizedUnperformedNodes
const std::vector< int64 > & GetNewSynchronizedUnperformedNodes() const
Definition: routing.h:3731
operations_research::IntVarFilteredHeuristic::number_of_rejects
int64 number_of_rejects() const
Definition: routing.h:2975
operations_research::CheapestAdditionFilteredHeuristic::~CheapestAdditionFilteredHeuristic
~CheapestAdditionFilteredHeuristic() override
Definition: routing.h:3422
operations_research::GlobalCheapestInsertionFilteredHeuristic::~GlobalCheapestInsertionFilteredHeuristic
~GlobalCheapestInsertionFilteredHeuristic() override
Definition: routing.h:3185
operations_research::CPFeasibilityFilter::OnSynchronize
void OnSynchronize(const Assignment *delta) override
Definition: routing_search.cc:2709
operations_research::RoutingModel::ActiveVehicleVar
IntVar * ActiveVehicleVar(int vehicle) const
Returns the active variable of the vehicle.
Definition: routing.h:1199
operations_research::RoutingModel::RegisterPositiveTransitCallback
int RegisterPositiveTransitCallback(TransitCallback2 callback)
Definition: routing.cc:910
operations_research::CPFeasibilityFilter::Accept
bool Accept(const Assignment *delta, const Assignment *deltadelta, int64 objective_min, int64 objective_max) override
Accepts a "delta" given the assignment with which the filter has been synchronized; the delta holds t...
Definition: routing_search.cc:2700
operations_research::IntVarFilteredHeuristic::Contains
bool Contains(int64 index) const
Returns true if the variable of index 'index' is in the current solution.
Definition: routing.h:3009
operations_research::IntVarFilteredHeuristic::DebugString
virtual std::string DebugString() const
Definition: routing.h:2977
operations_research::RoutingDimension::HasBreakConstraints
bool HasBreakConstraints() const
Returns true if any break interval or break distance was defined.
Definition: routing.cc:7063
operations_research::SavingsFilteredHeuristic::StartNewRouteWithBestVehicleOfType
int StartNewRouteWithBestVehicleOfType(int type, int64 before_node, int64 after_node)
Finds the best available vehicle of type "type" to start a new route to serve the arc before_node-->a...
Definition: routing_search.cc:5107
operations_research::FillPathEvaluation
void FillPathEvaluation(const std::vector< int64 > &path, const RoutingModel::TransitCallback2 &evaluator, std::vector< int64 > *values)
Definition: routing.cc:6379
operations_research::RoutingModel::SetArcCostEvaluatorOfVehicle
void SetArcCostEvaluatorOfVehicle(int evaluator_index, int vehicle)
Sets the cost function for a given vehicle route.
Definition: routing.cc:1298
operations_research::SweepArranger::SweepArranger
SweepArranger(const std::vector< std::pair< int64, int64 >> &points)
Definition: routing.cc:3077
operations_research::Zero
int64 Zero()
NOLINT.
Definition: constraint_solver.h:3139
operations_research::RoutingDimension::SetSoftSpanUpperBoundForVehicle
void SetSoftSpanUpperBoundForVehicle(SimpleBoundCosts::BoundCost bound_cost, int vehicle)
If the span of vehicle on this dimension is larger than bound, the cost will be increased by cost * (...
Definition: routing.h:2663
operations_research::RoutingModelVisitor::kRemoveValues
static const char kRemoveValues[]
Definition: routing.h:1911
operations_research::RoutingModel::VehicleClass::fixed_cost
int64 fixed_cost
Contrarily to CostClass, here we need strict equivalence.
Definition: routing.h:326
operations_research::RoutingModel::HasVehicleWithCostClassIndex
bool HasVehicleWithCostClassIndex(CostClassIndex cost_class_index) const
Returns true iff the model contains a vehicle with the given cost_class_index.
Definition: routing.h:1247
operations_research::ComparatorCheapestAdditionFilteredHeuristic::ComparatorCheapestAdditionFilteredHeuristic
ComparatorCheapestAdditionFilteredHeuristic(RoutingModel *model, Solver::VariableValueComparator comparator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
Definition: routing_search.cc:4621
operations_research::RoutingModel::GetSingleNodesOfType
const std::vector< int > & GetSingleNodesOfType(int type) const
Definition: routing.cc:4179
operations_research::RoutingDimension::NodePrecedence
Definition: routing.h:2611
operations_research::RoutingDimension::FixedTransitVar
IntVar * FixedTransitVar(int64 index) const
Definition: routing.h:2351
gtl::ITIVector< DimensionIndex, int64 >
operations_research::RoutingModel::GetNumberOfRejectsInFirstSolution
int64 GetNumberOfRejectsInFirstSolution(const RoutingSearchParameters &search_parameters) const
Definition: routing.cc:3730
operations_research::MakeTypeRegulationsFilter
IntVarLocalSearchFilter * MakeTypeRegulationsFilter(const RoutingModel &routing_model)
Definition: routing_search.cc:815
operations_research::RoutingModel::GetVisitTypePolicy
VisitTypePolicy GetVisitTypePolicy(int64 index) const
Definition: routing.cc:4189
operations_research::RoutingModel::AddDimensionWithVehicleTransitAndCapacity
bool AddDimensionWithVehicleTransitAndCapacity(const std::vector< int > &evaluator_indices, int64 slack_max, std::vector< int64 > vehicle_capacities, bool fix_start_cumul_to_zero, const std::string &name)
Definition: routing.cc:969
operations_research::CheapestAdditionFilteredHeuristic::CheapestAdditionFilteredHeuristic
CheapestAdditionFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager)
Definition: routing_search.cc:4429
operations_research::AppendLightWeightDimensionFilters
void AppendLightWeightDimensionFilters(const PathState *path_state, const std::vector< RoutingDimension * > &dimensions, std::vector< LocalSearchFilterManager::FilterEvent > *filters)
Definition: routing_search.cc:2120
operations_research::RoutingDimension::vehicle_span_cost_coefficients
const std::vector< int64 > & vehicle_span_cost_coefficients() const
Definition: routing.h:2641
operations_research::RoutingModel::GetPickupAndDeliveryPolicyOfVehicle
PickupAndDeliveryPolicy GetPickupAndDeliveryPolicyOfVehicle(int vehicle) const
Definition: routing.cc:1835
operations_research::SavingsFilteredHeuristic::GetSavingValue
int64 GetSavingValue(const Saving &saving) const
Returns the saving value from a saving.
Definition: routing.h:3557
logging.h
operations_research::RoutingDimension::GetUnaryTransitEvaluator
const RoutingModel::TransitCallback1 & GetUnaryTransitEvaluator(int vehicle) const
Returns the unary callback evaluating the transit value between two node indices for a given vehicle.
Definition: routing.h:2419
operations_research::RoutingDimension::GetCumulVarPiecewiseLinearCost
const PiecewiseLinearFunction * GetCumulVarPiecewiseLinearCost(int64 index) const
Returns the piecewise linear cost of a cumul variable for a given variable index.
Definition: routing.cc:6800
operations_research::RoutingModel::VehicleVars
const std::vector< IntVar * > & VehicleVars() const
Returns all vehicle variables of the model, such that VehicleVars(i) is the vehicle variable of the n...
Definition: routing.h:1190
operations_research::RoutingDimension::PickupToDeliveryLimitFunction
std::function< int64(int, int)> PickupToDeliveryLimitFunction
Limits, in terms of maximum difference between the cumul variables, between the pickup and delivery a...
Definition: routing.h:2601
operations_research::SweepArranger
Class to arrange indices by by their distance and their angles from the depot.
Definition: routing.h:2833
operations_research::IntVarFilteredHeuristic::InitializeSolution
virtual bool InitializeSolution()
Virtual method to initialize the solution.
Definition: routing.h:2983
operations_research::RoutingModel::PICKUP_AND_DELIVERY_LIFO
@ PICKUP_AND_DELIVERY_LIFO
Deliveries must be performed in reverse order of pickups.
Definition: routing.h:232
operations_research::RoutingModel::GetTabuVarsCallback
std::function< std::vector< operations_research::IntVar * >(RoutingModel *)> GetTabuVarsCallback
Sets the callback returning the variable to use for the Tabu Search metaheuristic.
Definition: routing.h:1355
operations_research::SimpleBoundCosts::bound_cost
BoundCost bound_cost(int element) const
Definition: routing.h:2301
operations_research::RoutingModel::VehicleTypeContainer::NumTypes
int NumTypes() const
Definition: routing.h:367
operations_research::RoutingModel::GetNumberOfDisjunctions
int GetNumberOfDisjunctions() const
Returns the number of node disjunctions in the model.
Definition: routing.h:654
operations_research::RoutingModel::GetMutableLocalCumulMPOptimizer
LocalDimensionCumulOptimizer * GetMutableLocalCumulMPOptimizer(const RoutingDimension &dimension) const
Definition: routing.cc:1255
operations_research::RoutingModel
Definition: routing.h:211
operations_research::RoutingModel::GetImplicitUniquePickupAndDeliveryPairs
const IndexPairs & GetImplicitUniquePickupAndDeliveryPairs() const
Returns implicit pickup and delivery pairs currently in the model.
Definition: routing.h:744
operations_research::RoutingModel::VehicleTypeContainer::VehicleClassEntry::operator<
bool operator<(const VehicleClassEntry &other) const
Definition: routing.h:361
operations_research::RoutingModel::RoutingDimension
friend class RoutingDimension
Definition: routing.h:1899
operations_research::RoutingDimension::GetBreakDistanceDurationOfVehicle
const std::vector< std::pair< int64, int64 > > & GetBreakDistanceDurationOfVehicle(int vehicle) const
Returns the pairs (distance, duration) specified by break distance constraints.
Definition: routing.cc:7102
operations_research::RoutingModel::MakeGuidedSlackFinalizer
DecisionBuilder * MakeGuidedSlackFinalizer(const RoutingDimension *dimension, std::function< int64(int64)> initializer)
The next few members are in the public section only for testing purposes.
Definition: routing_search.cc:5823
operations_research::EvaluatorCheapestAdditionFilteredHeuristic::EvaluatorCheapestAdditionFilteredHeuristic
EvaluatorCheapestAdditionFilteredHeuristic(RoutingModel *model, std::function< int64(int64, int64)> evaluator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
Definition: routing_search.cc:4580
operations_research::RoutingModel::StateDependentTransitCallback
const VariableIndexEvaluator2 & StateDependentTransitCallback(int callback_index) const
Definition: routing.h:414
operations_research::Assignment::SetValue
void SetValue(const IntVar *const var, int64 value)
Definition: constraint_solver/assignment.cc:679
operations_research::RoutingModel::RoutingModel
RoutingModel(const RoutingIndexManager &index_manager)
Constructor taking an index manager.
Definition: routing.cc:759
value
int64 value
Definition: demon_profiler.cc:43
operations_research::RoutingModel::IsStart
bool IsStart(int64 index) const
Returns true if 'index' represents the first node of a route.
Definition: routing.cc:3997
operations_research::RoutingModelVisitor
Routing model visitor.
Definition: routing.h:1906
operations_research::BasePathFilter::kUnassigned
static const int64 kUnassigned
Definition: routing.h:3716
operations_research::SequentialSavingsFilteredHeuristic::~SequentialSavingsFilteredHeuristic
~SequentialSavingsFilteredHeuristic() override
Definition: routing.h:3619
operations_research::RoutingModel::CostClass::DimensionCost::cost_coefficient
int64 cost_coefficient
Definition: routing.h:297
operations_research::Solver::VariableValueComparator
std::function< bool(int64, int64, int64)> VariableValueComparator
Definition: constraint_solver.h:751
operations_research::RoutingDimension::slacks
const std::vector< IntVar * > & slacks() const
Definition: routing.h:2360
operations_research::IntVarFilteredHeuristic::ResetSolution
void ResetSolution()
Resets the data members for a new solution.
Definition: routing_search.cc:2838
CHECK_LT
#define CHECK_LT(val1, val2)
Definition: base/logging.h:700
operations_research::GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionParameters::use_neighbors_ratio_for_initialization
bool use_neighbors_ratio_for_initialization
If true, only closest neighbors (see neighbors_ratio) are considered as insertion positions during in...
Definition: routing.h:3171
operations_research::RoutingFilteredHeuristic::MakeDisjunctionNodesUnperformed
void MakeDisjunctionNodesUnperformed(int64 node)
Make nodes in the same disjunction as 'node' unperformed.
Definition: routing_search.cc:3014
operations_research::RoutingModel::IndexPair
RoutingIndexPair IndexPair
Definition: routing.h:245
operations_research::RangeMinMaxIndexFunction
Definition: range_query_function.h:58
operations_research::RoutingModel::ROUTING_FAIL
@ ROUTING_FAIL
No solution found to the problem after calling RoutingModel::Solve().
Definition: routing.h:220
operations_research::RoutingDimension::GetSpanUpperBoundForVehicle
int64 GetSpanUpperBoundForVehicle(int vehicle) const
Definition: routing.h:2629
operations_research::RoutingDimension::GetCumulVarSoftUpperBound
int64 GetCumulVarSoftUpperBound(int64 index) const
Returns the soft upper bound of a cumul variable for a given variable index.
Definition: routing.cc:6856
macros.h
operations_research::BasePathFilter::GetPath
int GetPath(int64 node) const
Definition: routing.h:3725
operations_research::RoutingModel::AddPickupAndDeliverySets
void AddPickupAndDeliverySets(DisjunctionIndex pickup_disjunction, DisjunctionIndex delivery_disjunction)
Same as AddPickupAndDelivery but notifying that the performed node from the disjunction of index 'pic...
Definition: routing.cc:1777
operations_research::RoutingFilteredHeuristic::GetEndChainStart
int GetEndChainStart(int vehicle) const
Returns the start of the end chain of vehicle,.
Definition: routing.h:3052
operations_research::RoutingModel::GetLocalDimensionCumulMPOptimizers
const std::vector< std::unique_ptr< LocalDimensionCumulOptimizer > > & GetLocalDimensionCumulMPOptimizers() const
Definition: routing.h:563
operations_research
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
Definition: dense_doubly_linked_list.h:21
operations_research::ChristofidesFilteredHeuristic::~ChristofidesFilteredHeuristic
~ChristofidesFilteredHeuristic() override
Definition: routing.h:3685
operations_research::RoutingModel::GetLocalDimensionCumulOptimizers
const std::vector< std::unique_ptr< LocalDimensionCumulOptimizer > > & GetLocalDimensionCumulOptimizers() const
Definition: routing.h:559
operations_research::RoutingDimension::transit_evaluator
const RoutingModel::TransitCallback2 & transit_evaluator(int vehicle) const
Returns the callback evaluating the transit value between two node indices for a given vehicle.
Definition: routing.h:2412
operations_research::RoutingModel::StateDependentTransit::transit_plus_identity
RangeMinMaxIndexFunction * transit_plus_identity
f(x)
Definition: routing.h:264
operations_research::RoutingFilteredHeuristic::~RoutingFilteredHeuristic
~RoutingFilteredHeuristic() override
Definition: routing.h:3044
operations_research::DisjunctivePropagator::Tasks::is_preemptible
std::vector< bool > is_preemptible
Definition: routing.h:1932
operations_research::GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionParameters::is_sequential
bool is_sequential
Whether the routes are constructed sequentially or in parallel.
Definition: routing.h:3161
operations_research::RoutingDimension::GetSoftSpanUpperBoundForVehicle
SimpleBoundCosts::BoundCost GetSoftSpanUpperBoundForVehicle(int vehicle) const
Definition: routing.h:2674
WARNING
const int WARNING
Definition: log_severity.h:31
operations_research::RoutingModel::SolveWithParameters
const Assignment * SolveWithParameters(const RoutingSearchParameters &search_parameters, std::vector< const Assignment * > *solutions=nullptr)
Solves the current routing model with the given parameters.
Definition: routing.cc:3237
operations_research::RoutingModel::IsVehicleAllowedForIndex
bool IsVehicleAllowedForIndex(int vehicle, int64 index)
Returns true if a vehicle is allowed to visit a given node.
Definition: routing.h:681
operations_research::RoutingModel::SetArcCostEvaluatorOfAllVehicles
void SetArcCostEvaluatorOfAllVehicles(int evaluator_index)
Sets the cost function of the model such that the cost of a segment of a route between node 'from' an...
Definition: routing.cc:1291
operations_research::RoutingModel::status
Status status() const
Returns the current status of the routing model.
Definition: routing.h:1029
operations_research::TypeRegulationsChecker::TypePolicyOccurrence::position_of_last_type_on_vehicle_up_to_visit
int position_of_last_type_on_vehicle_up_to_visit
Position of the last node of policy TYPE_ON_VEHICLE_UP_TO_VISIT visited on the route.
Definition: routing.h:2151
operations_research::DisjunctivePropagator::Tasks
A structure to hold tasks described by their features.
Definition: routing.h:1924
operations_research::VehicleTypeCurator::GetCompatibleVehicleOfType
int GetCompatibleVehicleOfType(int type, std::function< bool(int)> vehicle_is_compatible)
Definition: routing_search.cc:2754
operations_research::RoutingModel::PICKUP_AND_DELIVERY_FIFO
@ PICKUP_AND_DELIVERY_FIFO
Deliveries must be performed in the same order as pickups.
Definition: routing.h:234
operations_research::ComparatorCheapestAdditionFilteredHeuristic
A CheapestAdditionFilteredHeuristic where the notion of 'cheapest arc' comes from an arc comparator.
Definition: routing.h:3482
operations_research::TravelBounds::max_travels
std::vector< int64 > max_travels
Definition: routing.h:1996
operations_research::LocalCheapestInsertionFilteredHeuristic
Filter-base decision builder which builds a solution by inserting nodes at their cheapest position.
Definition: routing.h:3385
operations_research::RoutingModel::AddDimensionWithVehicleTransits
bool AddDimensionWithVehicleTransits(const std::vector< int > &evaluator_indices, int64 slack_max, int64 capacity, bool fix_start_cumul_to_zero, const std::string &name)
Definition: routing.cc:951
operations_research::LocalSearchFilterManager::kAccept
@ kAccept
Definition: constraint_solveri.h:1767
operations_research::RoutingModel::GetArcCostForClass
int64 GetArcCostForClass(int64 from_index, int64 to_index, int64 cost_class_index) const
Returns the cost of the segment between two nodes for a given cost class.
Definition: routing.cc:4029
operations_research::RoutingDimension::NodePrecedence::offset
int64 offset
Definition: routing.h:2614
operations_research::RangeIntToIntFunction
Definition: range_query_function.h:28
operations_research::RoutingModel::IsVehicleUsed
bool IsVehicleUsed(const Assignment &assignment, int vehicle) const
Returns true if the route of 'vehicle' is non empty in 'assignment'.
Definition: routing.cc:4001
operations_research::TypeRegulationsChecker::TypeCurrentlyOnRoute
bool TypeCurrentlyOnRoute(int type, int pos) const
Returns true iff there's at least one instance of the given type on the route when scanning the route...
Definition: routing.cc:6467
operations_research::DisjunctivePropagator::MirrorTasks
bool MirrorTasks(Tasks *tasks)
Transforms the problem with a time symmetry centered in 0.
Definition: routing_breaks.cc:106
operations_research::CheapestInsertionFilteredHeuristic
Definition: routing.h:3078
operations_research::RoutingModel::VehicleClass::cost_class_index
CostClassIndex cost_class_index
The cost class of the vehicle.
Definition: routing.h:324
operations_research::MakeMaxActiveVehiclesFilter
IntVarLocalSearchFilter * MakeMaxActiveVehiclesFilter(const RoutingModel &routing_model)
Definition: routing_search.cc:110
operations_research::RoutingDimension::GetSpanCostCoefficientForVehicle
int64 GetSpanCostCoefficientForVehicle(int vehicle) const
Definition: routing.h:2637
operations_research::RoutingFilteredHeuristic::SetVehicleIndex
virtual void SetVehicleIndex(int64 node, int vehicle)
Definition: routing.h:3066
operations_research::SequentialSavingsFilteredHeuristic
Definition: routing.h:3612
operations_research::CPFeasibilityFilter::CPFeasibilityFilter
CPFeasibilityFilter(RoutingModel *routing_model)
Definition: routing_search.cc:2688
operations_research::RoutingModel::MakeStateDependentTransit
static RoutingModel::StateDependentTransit MakeStateDependentTransit(const std::function< int64(int64)> &f, int64 domain_start, int64 domain_end)
Creates a cached StateDependentTransit from an std::function.
Definition: routing.cc:1212
operations_research::CheapestInsertionFilteredHeuristic::AppendEvaluatedPositionsAfter
void AppendEvaluatedPositionsAfter(int64 node_to_insert, int64 start, int64 next_after_start, int64 vehicle, std::vector< ValuedPosition > *valued_positions)
Helper method to the ComputeEvaluatorSortedPositions* methods.
Definition: routing_search.cc:3140
operations_research::TypeRegulationsChecker::TypeOccursOnRoute
bool TypeOccursOnRoute(int type) const
Returns true iff any occurrence of the given type was seen on the route, i.e.
Definition: routing.cc:6461
operations_research::RoutingModel::CompactAssignment
Assignment * CompactAssignment(const Assignment &assignment) const
Returns a compacted version of the given assignment, in which all vehicles with id lower or equal to ...
Definition: routing.cc:3604
operations_research::RoutingModel::ReadAssignment
Assignment * ReadAssignment(const std::string &file_name)
Reads an assignment from a file and returns the current solution.
Definition: routing.cc:3747
operations_research::RoutingDimension::SetPickupToDeliveryLimitFunctionForPair
void SetPickupToDeliveryLimitFunctionForPair(PickupToDeliveryLimitFunction limit_function, int pair_index)
Definition: routing.cc:7108
operations_research::RoutingDimension::GetTransitValue
int64 GetTransitValue(int64 from_index, int64 to_index, int64 vehicle) const
Returns the transition value for a given pair of nodes (as var index); this value is the one taken by...
Definition: routing.cc:6721
operations_research::RoutingModel::GetMutableDimension
RoutingDimension * GetMutableDimension(const std::string &dimension_name) const
Returns a dimension from its name.
Definition: routing.cc:1282
int64
int64_t int64
Definition: integral_types.h:34
operations_research::RoutingModel::VehicleIndex
int VehicleIndex(int index) const
Returns the vehicle of the given start/end index, and -1 if the given index is not a vehicle start/en...
Definition: routing.h:1176
routing_enums.pb.h
constraint_solveri.h
operations_research::RoutingModel::Status
Status
Status of the search.
Definition: routing.h:214
operations_research::RoutingModel::CostsAreHomogeneousAcrossVehicles
bool CostsAreHomogeneousAcrossVehicles() const
Whether costs are homogeneous across all vehicles.
Definition: routing.h:1218
operations_research::CheapestInsertionFilteredHeuristic::ValuedPosition
std::pair< int64, int64 > ValuedPosition
Definition: routing.h:3088
operations_research::DisjunctivePropagator::Tasks::end_max
std::vector< int64 > end_max
Definition: routing.h:1931
operations_research::DisjunctivePropagator::Tasks::distance_duration
std::vector< std::pair< int64, int64 > > distance_duration
Definition: routing.h:1934
operations_research::RoutingDimension::AppendDimensionCumulFilters
friend void AppendDimensionCumulFilters(const std::vector< RoutingDimension * > &dimensions, const RoutingSearchParameters &parameters, bool filter_objective_cost, std::vector< LocalSearchFilterManager::FilterEvent > *filters)
Definition: routing_search.cc:2182
operations_research::IntVarFilteredHeuristic::Value
int64 Value(int64 index) const
Returns the value of the variable of index 'index' in the last committed solution.
Definition: routing.h:3005
operations_research::RoutingDimension::~RoutingDimension
~RoutingDimension()
Definition: routing.cc:6124
operations_research::DisjunctivePropagator::Tasks::span_min
int64 span_min
Definition: routing.h:1935
operations_research::TravelBounds
Definition: routing.h:1994
operations_research::RoutingModel::GetRoutesFromAssignment
std::vector< std::vector< int64 > > GetRoutesFromAssignment(const Assignment &assignment)
Converts the solution in the given assignment to routes for all vehicles.
Definition: routing.cc:3937
operations_research::RoutingModel::HasHardTypeIncompatibilities
bool HasHardTypeIncompatibilities() const
Returns true iff any hard (resp.
Definition: routing.h:809
routing_types.h
operations_research::IntVarFilteredHeuristic::SynchronizeFilters
void SynchronizeFilters()
Synchronizes filters with an assignment (the current solution).
Definition: routing_search.cc:2921
operations_research::RoutingModel::AddTemporalTypeIncompatibility
void AddTemporalTypeIncompatibility(int type1, int type2)
Definition: routing.cc:4213
operations_research::RoutingModel::GetVehicleClassIndexOfVehicle
VehicleClassIndex GetVehicleClassIndexOfVehicle(int64 vehicle) const
Definition: routing.h:1260
operations_research::GlobalVehicleBreaksConstraint::InitialPropagate
void InitialPropagate() override
This method performs the initial propagation of the constraint.
Definition: routing_breaks.cc:724
operations_research::GlobalCheapestInsertionFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3187
operations_research::FillTravelBoundsOfVehicle
void FillTravelBoundsOfVehicle(int vehicle, const std::vector< int64 > &path, const RoutingDimension &dimension, TravelBounds *travel_bounds)
Definition: routing_breaks.cc:645
operations_research::RoutingModel::~RoutingModel
~RoutingModel()
Definition: routing.cc:852
index
int index
Definition: pack.cc:508
operations_research::RoutingDimension::name
const std::string & name() const
Returns the name of the dimension.
Definition: routing.h:2583
operations_research::RoutingModel::TYPE_ON_VEHICLE_UP_TO_VISIT
@ TYPE_ON_VEHICLE_UP_TO_VISIT
With the following policy, the visit enforces that type 'T' is considered on the route from its start...
Definition: routing.h:770
operations_research::RoutingDimension::GetLastPossibleLessOrEqualValueForNode
int64 GetLastPossibleLessOrEqualValueForNode(int64 index, int64 max_value) const
Returns the largest value outside the forbidden intervals of node 'index' that is less than or equal ...
Definition: routing.h:2391
operations_research::TypeRegulationsChecker::~TypeRegulationsChecker
virtual ~TypeRegulationsChecker()
Definition: routing.h:2126
operations_research::CPFeasibilityFilter::~CPFeasibilityFilter
~CPFeasibilityFilter() override
Definition: routing.h:3786
operations_research::IntVarFilteredDecisionBuilder::IntVarFilteredDecisionBuilder
IntVarFilteredDecisionBuilder(std::unique_ptr< IntVarFilteredHeuristic > heuristic)
Definition: routing_search.cc:2788
operations_research::RoutingModel::SetPickupAndDeliveryPolicyOfAllVehicles
void SetPickupAndDeliveryPolicyOfAllVehicles(PickupAndDeliveryPolicy policy)
Sets the Pickup and delivery policy of all vehicles.
Definition: routing.cc:1826
operations_research::RoutingModel::AddLocalSearchFilter
void AddLocalSearchFilter(LocalSearchFilter *filter)
Adds a custom local search filter to the list of filters used to speed up local search by pruning unf...
Definition: routing.h:1156
operations_research::CheapestInsertionFilteredHeuristic::StartEndValue
Definition: routing.h:3089
operations_research::BaseObject
A BaseObject is the root of all reversibly allocated objects.
Definition: constraint_solver.h:3147
operations_research::RoutingDimension::GetPathPrecedenceGraph
const ReverseArcListGraph< int, int > & GetPathPrecedenceGraph() const
Accessors.
Definition: routing.h:2587
operations_research::DisjunctivePropagator::Precedences
bool Precedences(Tasks *tasks)
Propagates the deductions from the chain of precedences, if there is one.
Definition: routing_breaks.cc:51
operations_research::RoutingModel::AddToAssignment
void AddToAssignment(IntVar *const var)
Adds an extra variable to the vehicle routing assignment.
Definition: routing.cc:5754
operations_research::SavingsFilteredHeuristic::SavingsContainer
Definition: routing_search.cc:4692
operations_research::RoutingDimension::SlackVar
IntVar * SlackVar(int64 index) const
Definition: routing.h:2352
operations_research::IntVarFilteredHeuristic::StopSearch
virtual bool StopSearch()
Returns true if the search must be stopped.
Definition: routing.h:2991
operations_research::BasePathFilter::BasePathFilter
BasePathFilter(const std::vector< IntVar * > &nexts, int next_domain_size)
Definition: routing_search.cc:289
operations_research::RoutingModel::GetDimensions
const std::vector< RoutingDimension * > & GetDimensions() const
Returns all dimensions of the model.
Definition: routing.h:546
operations_research::CheapestInsertionFilteredHeuristic::GetInsertionCostForNodeAtPosition
int64 GetInsertionCostForNodeAtPosition(int64 node_to_insert, int64 insert_after, int64 insert_before, int vehicle) const
Returns the cost of inserting 'node_to_insert' between 'insert_after' and 'insert_before' on the 'veh...
Definition: routing_search.cc:3156
operations_research::TypeRequirementChecker::TypeRequirementChecker
TypeRequirementChecker(const RoutingModel &model)
Definition: routing.h:2201
operations_research::MakeVehicleAmortizedCostFilter
IntVarLocalSearchFilter * MakeVehicleAmortizedCostFilter(const RoutingModel &routing_model)
Definition: routing_search.cc:666
operations_research::RoutingModel::AddConstantDimensionWithSlack
bool AddConstantDimensionWithSlack(int64 value, int64 capacity, int64 slack_max, bool fix_start_cumul_to_zero, const std::string &name)
Creates a dimension where the transit variable is constrained to be equal to 'value'; 'capacity' is t...
Definition: routing.cc:1036
operations_research::RoutingModel::AddSoftSameVehicleConstraint
void AddSoftSameVehicleConstraint(const std::vector< int64 > &indices, int64 cost)
Adds a soft contraint to force a set of variable indices to be on the same vehicle.
Definition: routing.cc:1751
operations_research::RoutingModel::SetFirstSolutionEvaluator
void SetFirstSolutionEvaluator(Solver::IndexEvaluator2 evaluator)
Takes ownership of evaluator.
Definition: routing.h:955
operations_research::IntVarFilteredDecisionBuilder
Decision builder building a solution using heuristics with local search filters to evaluate its feasi...
Definition: routing.h:2941
operations_research::RoutingDimension::SetBreakDistanceDurationOfVehicle
void SetBreakDistanceDurationOfVehicle(int64 distance, int64 duration, int vehicle)
With breaks supposed to be consecutive, this forces the distance between breaks of size at least mini...
Definition: routing.cc:7086
operations_research::GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionParameters::farthest_seeds_ratio
double farthest_seeds_ratio
The ratio of routes on which to insert farthest nodes as seeds before starting the cheapest insertion...
Definition: routing.h:3164
operations_research::RoutingIndexManager
Manager for any NodeIndex <-> variable index conversion.
Definition: routing_index_manager.h:48
operations_research::RoutingModel::GetCostClassesCount
int GetCostClassesCount() const
Returns the number of different cost classes in the model.
Definition: routing.h:1255
operations_research::VehicleTypeCurator::NumTypes
int NumTypes() const
Definition: routing.h:2863
operations_research::LocalSearchFilter
Local Search Filters are used for fast neighbor pruning.
Definition: constraint_solveri.h:1719
operations_research::RoutingModel::VehicleClass::dimension_capacities
gtl::ITIVector< DimensionIndex, int64 > dimension_capacities
Definition: routing.h:341
operations_research::RoutingModel::Size
int64 Size() const
Returns the number of next variables in the model.
Definition: routing.h:1334
operations_research::RoutingModel::AddPickupAndDelivery
void AddPickupAndDelivery(int64 pickup, int64 delivery)
Notifies that index1 and index2 form a pair of nodes which should belong to the same route.
Definition: routing.cc:1772
operations_research::LocalCheapestInsertionFilteredHeuristic::LocalCheapestInsertionFilteredHeuristic
LocalCheapestInsertionFilteredHeuristic(RoutingModel *model, std::function< int64(int64, int64, int64)> evaluator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
Definition: routing_search.cc:4307
operations_research::CheapestAdditionFilteredHeuristic::BuildSolutionInternal
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
Definition: routing_search.cc:4433
cost
int64 cost
Definition: routing_flow.cc:130
operations_research::BasePathFilter::GetNext
int64 GetNext(int64 node) const
Definition: routing.h:3718
operations_research::RoutingDimension::GetFirstPossibleGreaterOrEqualValueForNode
int64 GetFirstPossibleGreaterOrEqualValueForNode(int64 index, int64 min_value) const
Returns the smallest value outside the forbidden intervals of node 'index' that is greater than or eq...
Definition: routing.h:2372
a
int64 a
Definition: constraint_solver/table.cc:42
operations_research::GlobalDimensionCumulOptimizer
Definition: routing_lp_scheduling.h:680
operations_research::RoutingModel::GetAllDimensionNames
std::vector< std::string > GetAllDimensionNames() const
Outputs the names of all dimensions added to the routing engine.
Definition: routing.cc:1222
operations_research::RoutingModel::VehicleClass::unvisitable_nodes_fprint
uint64 unvisitable_nodes_fprint
Fingerprint of unvisitable non-start/end nodes.
Definition: routing.h:346
constraint_solver.h
operations_research::RoutingModel::AddDimension
bool AddDimension(int evaluator_index, int64 slack_max, int64 capacity, bool fix_start_cumul_to_zero, const std::string &name)
Model creation.
Definition: routing.cc:941
operations_research::SimpleBoundCosts::operator=
SimpleBoundCosts operator=(const SimpleBoundCosts &)=delete
operations_research::RoutingDimension::TransitVar
IntVar * TransitVar(int64 index) const
Definition: routing.h:2350
operations_research::RoutingModel::CheckLimit
bool CheckLimit()
Returns true if the search limit has been crossed.
Definition: routing.h:1317
operations_research::SavingsFilteredHeuristic::vehicle_type_curator_
std::unique_ptr< VehicleTypeCurator > vehicle_type_curator_
Definition: routing.h:3574
operations_research::RegularLimit::AbsoluteSolverDeadline
absl::Time AbsoluteSolverDeadline() const
Definition: constraint_solver.h:4303
operations_research::MakeCumulBoundsPropagatorFilter
IntVarLocalSearchFilter * MakeCumulBoundsPropagatorFilter(const RoutingDimension &dimension)
Definition: routing_search.cc:2575
operations_research::SortedDisjointIntervalList
This class represents a sorted list of disjoint, closed intervals.
Definition: sorted_interval_list.h:387
operations_research::RoutingDimension::SetCumulVarPiecewiseLinearCost
void SetCumulVarPiecewiseLinearCost(int64 index, const PiecewiseLinearFunction &cost)
Sets a piecewise linear cost on the cumul variable of a given variable index.
Definition: routing.cc:6776
operations_research::IntVarFilteredHeuristic::Size
int Size() const
Returns the number of variables the decision builder is trying to instantiate.
Definition: routing.h:3014
operations_research::ChristofidesFilteredHeuristic::ChristofidesFilteredHeuristic
ChristofidesFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager, bool use_minimum_matching)
Definition: routing_search.cc:5637
operations_research::RoutingDimension::transits
const std::vector< IntVar * > & transits() const
Definition: routing.h:2359
operations_research::RoutingModel::AddVariableTargetToFinalizer
void AddVariableTargetToFinalizer(IntVar *var, int64 target)
Add a variable to set the closest possible to the target value in the solution finalizer.
Definition: routing.cc:5733
operations_research::Assignment
An Assignment is a variable -> domains mapping, used to report solutions to the user.
Definition: constraint_solver.h:5033
operations_research::CheapestInsertionFilteredHeuristic::ComputeStartEndDistanceForVehicles
std::vector< std::vector< StartEndValue > > ComputeStartEndDistanceForVehicles(const std::vector< int > &vehicles)
Computes and returns the distance of each uninserted node to every vehicle in "vehicles" as a std::ve...
Definition: routing_search.cc:3081
operations_research::RoutingModel::VehicleTypeContainer
Struct used to sort and store vehicles by their type.
Definition: routing.h:356
operations_research::AssignmentContainer::Element
const E & Element(const V *const var) const
Definition: constraint_solver.h:4936
operations_research::TypeRegulationsChecker::InitializeCheck
void InitializeCheck(int vehicle, const std::function< int64(int64)> &next_accessor)
Definition: routing.cc:6436
operations_research::RoutingModel::GetSameVehicleRequiredTypeAlternativesOfType
const std::vector< absl::flat_hash_set< int > > & GetSameVehicleRequiredTypeAlternativesOfType(int type) const
Returns the set of same-vehicle requirement alternatives for the given type.
Definition: routing.cc:4304
operations_research::RoutingModel::ReadAssignmentFromRoutes
Assignment * ReadAssignmentFromRoutes(const std::vector< std::vector< int64 >> &routes, bool ignore_inactive_indices)
Restores the routes as the current solution.
Definition: routing.cc:3890
operations_research::CheapestInsertionFilteredHeuristic::CheapestInsertionFilteredHeuristic
CheapestInsertionFilteredHeuristic(RoutingModel *model, std::function< int64(int64, int64, int64)> evaluator, std::function< int64(int64)> penalty_evaluator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
Definition: routing_search.cc:3072
operations_research::RoutingModel::PickupAndDeliveryPolicy
PickupAndDeliveryPolicy
Types of precedence policy applied to pickup and delivery pairs.
Definition: routing.h:228
operations_research::VehicleTypeCurator::VehicleTypeCurator
VehicleTypeCurator(const RoutingModel::VehicleTypeContainer &vehicle_type_container)
Definition: routing.h:2859
operations_research::RoutingModel::DisjunctionIndex
RoutingDisjunctionIndex DisjunctionIndex
Definition: routing.h:238
operations_research::RoutingFilteredHeuristic::StopSearch
bool StopSearch() override
Returns true if the search must be stopped.
Definition: routing.h:3065
operations_research::CPFeasibilityFilter
This filter accepts deltas for which the assignment satisfies the constraints of the Solver.
Definition: routing.h:3783
operations_research::RoutingModel::GetHomogeneousCost
int64 GetHomogeneousCost(int64 from_index, int64 to_index) const
Returns the cost of the segment between two nodes supposing all vehicle costs are the same (returns t...
Definition: routing.h:1223
operations_research::TypeRequirementChecker
Checker for type requirements.
Definition: routing.h:2199
operations_research::RoutingDimension::NodePrecedence::first_node
int64 first_node
Definition: routing.h:2612
operations_research::RoutingDimension::global_span_cost_coefficient
int64 global_span_cost_coefficient() const
Definition: routing.h:2645
operations_research::RoutingModel::GetMaximumNumberOfActiveVehicles
int GetMaximumNumberOfActiveVehicles() const
Returns the maximum number of active vehicles.
Definition: routing.h:891
operations_research::CapAdd
int64 CapAdd(int64 x, int64 y)
Definition: saturated_arithmetic.h:124
operations_research::RoutingModel::kNoDimension
static const DimensionIndex kNoDimension
Constant used to express the "no dimension" index, returned when a dimension name does not correspond...
Definition: routing.h:390
operations_research::IntVarFilteredHeuristic
Generic filter-based heuristic applied to IntVars.
Definition: routing.h:2961
operations_research::RoutingModel::GetArcCostForFirstSolution
int64 GetArcCostForFirstSolution(int64 from_index, int64 to_index) const
Returns the cost of the arc in the context of the first solution strategy.
Definition: routing.cc:4040
operations_research::ChristofidesFilteredHeuristic::BuildSolutionInternal
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
Definition: routing_search.cc:5644
operations_research::Queue
Definition: constraint_solver.cc:215
operations_research::TypeIncompatibilityChecker::TypeIncompatibilityChecker
TypeIncompatibilityChecker(const RoutingModel &model, bool check_hard_incompatibilities)
Definition: routing.cc:6474
operations_research::RoutingDimension::vehicle_capacities
const std::vector< int64 > & vehicle_capacities() const
Returns the capacities for all vehicles.
Definition: routing.h:2407
operations_research::PiecewiseLinearFunction
Definition: piecewise_linear_function.h:101
operations_research::ParallelSavingsFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3641
operations_research::RoutingDimension::HasSoftSpanUpperBounds
bool HasSoftSpanUpperBounds() const
Definition: routing.h:2671
operations_research::RoutingModel::SetFixedCostOfAllVehicles
void SetFixedCostOfAllVehicles(int64 cost)
Sets the fixed cost of all vehicle routes.
Definition: routing.cc:1305
operations_research::BasePathFilter::~BasePathFilter
~BasePathFilter() override
Definition: routing.h:3710
operations_research::DisjunctivePropagator::Propagate
bool Propagate(Tasks *tasks)
Computes new bounds for all tasks, returns false if infeasible.
Definition: routing_breaks.cc:20
operations_research::IntVarLocalSearchFilter::Value
int64 Value(int index) const
Definition: constraint_solveri.h:1833
operations_research::RoutingModel::ArcIsMoreConstrainedThanArc
bool ArcIsMoreConstrainedThanArc(int64 from, int64 to1, int64 to2)
Returns whether the arc from->to1 is more constrained than from->to2, taking into account,...
Definition: routing.cc:4073
operations_research::RoutingModel::TransitCallback
const TransitCallback2 & TransitCallback(int callback_index) const
Definition: routing.h:406
operations_research::RoutingModel::GetAmortizedLinearCostFactorOfVehicles
const std::vector< int64 > & GetAmortizedLinearCostFactorOfVehicles() const
Definition: routing.h:930
operations_research::RoutingModel::UnaryTransitCallbackOrNull
const TransitCallback1 & UnaryTransitCallbackOrNull(int callback_index) const
Definition: routing.h:410
operations_research::SimpleBoundCosts
A structure meant to store soft bounds and associated violation constants.
Definition: routing.h:2292
operations_research::GlobalVehicleBreaksConstraint
GlobalVehicleBreaksConstraint ensures breaks constraints are enforced on all vehicles in the dimensio...
Definition: routing.h:2025
operations_research::CheapestInsertionFilteredHeuristic::GetUnperformedValue
int64 GetUnperformedValue(int64 node_to_insert) const
Returns the cost of unperforming node 'node_to_insert'.
Definition: routing_search.cc:3164
operations_research::RoutingModel::CostVar
IntVar * CostVar() const
Returns the global cost variable which is being minimized.
Definition: routing.h:1211
operations_research::RoutingModel::AssignmentToRoutes
void AssignmentToRoutes(const Assignment &assignment, std::vector< std::vector< int64 >> *const routes) const
Converts the solution in the given assignment to routes for all vehicles.
Definition: routing.cc:3903
operations_research::RoutingModel::GetDisjunctionPenalty
int64 GetDisjunctionPenalty(DisjunctionIndex index) const
Returns the penalty of the node disjunction of index 'index'.
Definition: routing.h:645
operations_research::RoutingDimension::InitializeBreaks
void InitializeBreaks()
Sets up vehicle_break_intervals_, vehicle_break_distance_duration_, pre_travel_evaluators and post_tr...
Definition: routing.cc:7053
operations_research::SavingsFilteredHeuristic
Filter-based decision builder which builds a solution by using Clarke & Wright's Savings heuristic.
Definition: routing.h:3510
operations_research::VehicleTypeCurator::ReinjectVehicleOfClass
void ReinjectVehicleOfClass(int vehicle, int vehicle_class, int64 fixed_cost)
Definition: routing.h:2892
operations_research::BasePathFilter::Rank
int Rank(int64 node) const
Definition: routing.h:3726
operations_research::RoutingModel::ComputeLowerBound
int64 ComputeLowerBound()
Computes a lower bound to the routing problem solving a linear assignment problem.
Definition: routing.cc:3460
operations_research::RoutingModel::WriteAssignment
bool WriteAssignment(const std::string &file_name) const
Writes the current solution to a file containing an AssignmentProto.
Definition: routing.cc:3738
operations_research::RoutingModel::CostClassIndex
RoutingCostClassIndex CostClassIndex
Definition: routing.h:236
operations_research::RoutingModel::VehicleCostsConsideredVar
IntVar * VehicleCostsConsideredVar(int vehicle) const
Returns the variable specifying whether or not costs are considered for vehicle.
Definition: routing.h:1204
operations_research::TypeRegulationsChecker::TypeRegulationsChecker
TypeRegulationsChecker(const RoutingModel &model)
Definition: routing.cc:6389
operations_research::CheapestInsertionFilteredHeuristic::StartEndValue::operator<
bool operator<(const StartEndValue &other) const
Definition: routing.h:3093
operations_research::RoutingModel::UnperformedPenaltyOrValue
int64 UnperformedPenaltyOrValue(int64 default_value, int64 var_index) const
Same as above except that it returns default_value instead of 0 when penalty is not well defined (def...
Definition: routing.cc:4329
operations_research::RoutingModel::GetPairIndicesOfType
const std::vector< int > & GetPairIndicesOfType(int type) const
Definition: routing.cc:4184
operations_research::RoutingModel::SetAllowedVehiclesForIndex
void SetAllowedVehiclesForIndex(const std::vector< int > &vehicles, int64 index)
Sets the vehicles which can visit a given node.
Definition: routing.cc:1763
operations_research::SparseBitset::PositionsSetAtLeastOnce
const std::vector< IntegerType > & PositionsSetAtLeastOnce() const
Definition: bitset.h:815
operations_research::RoutingModel::VehicleClass::dimension_end_cumuls_max
gtl::ITIVector< DimensionIndex, int64 > dimension_end_cumuls_max
Definition: routing.h:340
operations_research::ParallelSavingsFilteredHeuristic::ParallelSavingsFilteredHeuristic
ParallelSavingsFilteredHeuristic(RoutingModel *model, const RoutingIndexManager *manager, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
Definition: routing.h:3635
operations_research::RoutingModel::UnperformedPenalty
int64 UnperformedPenalty(int64 var_index) const
Get the "unperformed" penalty of a node.
Definition: routing.cc:4325
operations_research::RoutingModel::GetPickupIndexPairs
const std::vector< std::pair< int, int > > & GetPickupIndexPairs(int64 node_index) const
Returns pairs for which the node is a pickup; the first element of each pair is the index in the pick...
Definition: routing.cc:1808
operations_research::CheapestAdditionFilteredHeuristic
Filtered-base decision builder based on the addition heuristic, extending a path from its start node ...
Definition: routing.h:3418
operations_research::IntVarFilteredHeuristic::BuildSolution
Assignment *const BuildSolution()
Builds a solution.
Definition: routing_search.cc:2848
int_type_indexed_vector.h
operations_research::GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionParameters::add_unperformed_entries
bool add_unperformed_entries
If true, entries are created for making the nodes/pairs unperformed, and when the cost of making a no...
Definition: routing.h:3176
operations_research::RoutingModel::TYPE_ADDED_TO_VEHICLE
@ TYPE_ADDED_TO_VEHICLE
When visited, the number of types 'T' on the vehicle increases by one.
Definition: routing.h:762
operations_research::SavingsFilteredHeuristic::BuildRoutesFromSavings
virtual void BuildRoutesFromSavings()=0
operations_research::LocalCheapestInsertionFilteredHeuristic::~LocalCheapestInsertionFilteredHeuristic
~LocalCheapestInsertionFilteredHeuristic() override
Definition: routing.h:3391
operations_research::DecisionBuilder
A DecisionBuilder is responsible for creating the search tree.
Definition: constraint_solver.h:3263
operations_research::RoutingModel::first_solution_evaluator
const Solver::IndexEvaluator2 & first_solution_evaluator() const
Gets/sets the evaluator used during the search.
Definition: routing.h:950
operations_research::IntVarFilteredHeuristic::IntVarFilteredHeuristic
IntVarFilteredHeuristic(Solver *solver, const std::vector< IntVar * > &vars, LocalSearchFilterManager *filter_manager)
Definition: routing_search.cc:2822
operations_research::RoutingDimension::CumulVar
IntVar * CumulVar(int64 index) const
Get the cumul, transit and slack variables for the given node (given as int64 var index).
Definition: routing.h:2349
operations_research::TypeRegulationsChecker::model_
const RoutingModel & model_
Definition: routing.h:2175
operations_research::LocalDimensionCumulOptimizer
Definition: routing_lp_scheduling.h:635
operations_research::RoutingModel::VehicleClass::start_equivalence_class
int start_equivalence_class
Vehicle start and end equivalence classes.
Definition: routing.h:333
operations_research::MakeVehicleVarFilter
IntVarLocalSearchFilter * MakeVehicleVarFilter(const RoutingModel &routing_model)
Definition: routing_search.cc:2517
operations_research::RoutingModel::AddSearchMonitor
void AddSearchMonitor(SearchMonitor *const monitor)
Adds a search monitor to the search used to solve the routing model.
Definition: routing.cc:3208
operations_research::MakeSetValuesFromTargets
DecisionBuilder * MakeSetValuesFromTargets(Solver *solver, std::vector< IntVar * > variables, std::vector< int64 > targets)
A decision builder which tries to assign values to variables as close as possible to target values fi...
Definition: routing.cc:142
operations_research::SavingsFilteredHeuristic::SavingsParameters::max_memory_usage_bytes
double max_memory_usage_bytes
The number of neighbors considered for each node is also adapted so that the stored Savings don't use...
Definition: routing.h:3518
operations_research::RoutingModel::IndexPairs
RoutingIndexPairs IndexPairs
Definition: routing.h:246
operations_research::TypeRegulationsChecker::VisitTypePolicy
RoutingModel::VisitTypePolicy VisitTypePolicy
Definition: routing.h:2133
operations_research::RoutingModel::GetAutomaticFirstSolutionStrategy
operations_research::FirstSolutionStrategy::Value GetAutomaticFirstSolutionStrategy() const
Returns the automatic first solution strategy selected.
Definition: routing.h:1344
operations_research::RoutingDimension::model
RoutingModel * model() const
Returns the model on which the dimension was created.
Definition: routing.h:2335
operations_research::RoutingModel::VehicleTypeContainer::Type
int Type(int vehicle) const
Definition: routing.h:369
operations_research::RoutingModel::ROUTING_NOT_SOLVED
@ ROUTING_NOT_SOLVED
Problem not solved yet (before calling RoutingModel::Solve()).
Definition: routing.h:216
operations_research::RoutingModel::IsEnd
bool IsEnd(int64 index) const
Returns true if 'index' represents the last node of a route.
Definition: routing.h:1173
operations_research::RoutingModel::DebugOutputAssignment
std::string DebugOutputAssignment(const Assignment &solution_assignment, const std::string &dimension_to_print) const
Print some debugging information about an assignment, including the feasible intervals of the CumulVa...
Definition: routing.cc:4342
operations_research::GlobalVehicleBreaksConstraint::DebugString
std::string DebugString() const override
Definition: routing.h:2028
util::ReverseArcListGraph
Definition: graph.h:460
operations_research::RoutingModel::HasSameVehicleTypeRequirements
bool HasSameVehicleTypeRequirements() const
Returns true iff any same-route (resp.
Definition: routing.h:854
operations_research::RoutingModel::RemainingTime
absl::Duration RemainingTime() const
Returns the time left in the search limit.
Definition: routing.h:1323
operations_research::AppendTasksFromIntervals
void AppendTasksFromIntervals(const std::vector< IntervalVar * > &intervals, DisjunctivePropagator::Tasks *tasks)
Definition: routing_breaks.cc:673
operations_research::DisjunctivePropagator::Tasks::start_min
std::vector< int64 > start_min
Definition: routing.h:1926
operations_research::TypeRegulationsChecker::FinalizeCheck
virtual bool FinalizeCheck() const
Definition: routing.h:2173
operations_research::CheapestInsertionFilteredHeuristic::Seed
std::pair< StartEndValue, int > Seed
Definition: routing.h:3098
operations_research::GlobalVehicleBreaksConstraint::Post
void Post() override
This method is called when the constraint is processed by the solver.
Definition: routing_breaks.cc:695
operations_research::MakeGlobalLPCumulFilter
IntVarLocalSearchFilter * MakeGlobalLPCumulFilter(GlobalDimensionCumulOptimizer *optimizer, bool filter_objective_cost)
Definition: routing_search.cc:2679
uint64
uint64_t uint64
Definition: integral_types.h:39
operations_research::sat::Value
std::function< int64(const Model &)> Value(IntegerVariable v)
Definition: integer.h:1414
operations_research::RoutingModel::CostClass::DimensionCost
SUBTLE: The vehicle's fixed cost is skipped on purpose here, because we can afford to do so:
Definition: routing.h:295
operations_research::CheapestInsertionFilteredHeuristic::~CheapestInsertionFilteredHeuristic
~CheapestInsertionFilteredHeuristic() override
Definition: routing.h:3085
operations_research::RoutingModel::GetNonZeroCostClassesCount
int GetNonZeroCostClassesCount() const
Ditto, minus the 'always zero', built-in cost class.
Definition: routing.h:1257
operations_research::SavingsFilteredHeuristic::GetVehicleTypeFromSaving
int64 GetVehicleTypeFromSaving(const Saving &saving) const
Returns the cost class from a saving.
Definition: routing.h:3545
operations_research::ComparatorCheapestAdditionFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3489
operations_research::RoutingDimension::vehicle_span_upper_bounds
const std::vector< int64 > & vehicle_span_upper_bounds() const
Definition: routing.h:2633
operations_research::SavingsFilteredHeuristic::~SavingsFilteredHeuristic
~SavingsFilteredHeuristic() override
Definition: routing_search.cc:5089
operations_research::RoutingModel::ApplyLocksToAllVehicles
bool ApplyLocksToAllVehicles(const std::vector< std::vector< int64 >> &locks, bool close_routes)
Applies lock chains to all vehicles to the next search, such that locks[p] is the lock chain for rout...
Definition: routing.cc:3716
DCHECK
#define DCHECK(condition)
Definition: base/logging.h:884
operations_research::RoutingModel::VisitTypePolicy
VisitTypePolicy
Set the node visit types and incompatibilities/requirements between the types (see below).
Definition: routing.h:760
operations_research::RoutingModel::GetVehicleTypeContainer
const VehicleTypeContainer & GetVehicleTypeContainer() const
Definition: routing.h:1272
operations_research::RoutingModel::ROUTING_SUCCESS
@ ROUTING_SUCCESS
Problem solved successfully after calling RoutingModel::Solve().
Definition: routing.h:218
operations_research::RoutingModel::SetVisitType
void SetVisitType(int64 index, int type, VisitTypePolicy type_policy)
Definition: routing.cc:4166
operations_research::TypeRegulationsChecker::TypePolicyOccurrence::num_type_removed_from_vehicle
int num_type_removed_from_vehicle
Number of ADDED_TYPE_REMOVED_FROM_VEHICLE (effectively removing a type from the route) and TYPE_SIMUL...
Definition: routing.h:2146
operations_research::RoutingModelVisitor::kLightElement
static const char kLightElement[]
Constraint types.
Definition: routing.h:1909
operations_research::RoutingModel::VehicleClass::LessThan
static bool LessThan(const VehicleClass &a, const VehicleClass &b)
Comparator for STL containers and algorithms.
Definition: routing.cc:1425
operations_research::RoutingIndexPair
std::pair< std::vector< int64 >, std::vector< int64 > > RoutingIndexPair
Definition: routing_types.h:44
operations_research::RoutingDimension::SetSpanCostCoefficientForVehicle
void SetSpanCostCoefficientForVehicle(int64 coefficient, int vehicle)
Sets a cost proportional to the dimension span on a given vehicle, or on all vehicles at once.
Definition: routing.cc:6758
operations_research::IntervalVar
Interval variables are often used in scheduling.
Definition: constraint_solver.h:4389
operations_research::RoutingModel::GetDisjunctionIndices
const std::vector< DisjunctionIndex > & GetDisjunctionIndices(int64 index) const
Returns the indices of the disjunctions to which an index belongs.
Definition: routing.h:618
operations_research::RoutingModel::IsMatchingModel
bool IsMatchingModel() const
Returns true if a vehicle/node matching problem is detected.
Definition: routing_flow.cc:34
operations_research::RoutingModel::MutablePreAssignment
Assignment * MutablePreAssignment()
Definition: routing.h:1054
operations_research::SavingsFilteredHeuristic::Saving
std::pair< int64, int64 > Saving
Definition: routing.h:3535
theta_tree.h
operations_research::RoutingDimension::GetBreakIntervalsOfVehicle
const std::vector< IntervalVar * > & GetBreakIntervalsOfVehicle(int vehicle) const
Returns the break intervals set by SetBreakIntervalsOfVehicle().
Definition: routing.cc:7067
operations_research::RoutingDimension::AddNodePrecedence
void AddNodePrecedence(NodePrecedence precedence)
Definition: routing.h:2617
operations_research::RoutingDimension::HasPickupToDeliveryLimits
bool HasPickupToDeliveryLimits() const
Definition: routing.cc:7118
operations_research::RoutingModel::RegisterTransitCallback
int RegisterTransitCallback(TransitCallback2 callback)
Definition: routing.cc:884
operations_research::DisjunctivePropagator::Tasks::duration_min
std::vector< int64 > duration_min
Definition: routing.h:1928
operations_research::RoutingModel::RegisterPositiveUnaryTransitCallback
int RegisterPositiveUnaryTransitCallback(TransitCallback1 callback)
Definition: routing.cc:876
operations_research::LocalCheapestInsertionFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3393
operations_research::RoutingModel::AddDimensionWithVehicleCapacity
bool AddDimensionWithVehicleCapacity(int evaluator_index, int64 slack_max, std::vector< int64 > vehicle_capacities, bool fix_start_cumul_to_zero, const std::string &name)
Definition: routing.cc:960
sorted_interval_list.h
operations_research::RoutingDimension::SetBreakIntervalsOfVehicle
void SetBreakIntervalsOfVehicle(std::vector< IntervalVar * > breaks, int vehicle, int pre_travel_evaluator, int post_travel_evaluator)
Sets the breaks for a given vehicle.
Definition: routing.cc:7024
operations_research::RoutingIndexPairs
std::vector< RoutingIndexPair > RoutingIndexPairs
Definition: routing_types.h:45
operations_research::EvaluatorCheapestAdditionFilteredHeuristic
A CheapestAdditionFilteredHeuristic where the notion of 'cheapest arc' comes from an arc evaluator.
Definition: routing.h:3459
operations_research::RoutingDimension::forbidden_intervals
const std::vector< SortedDisjointIntervalList > & forbidden_intervals() const
Returns forbidden intervals for each node.
Definition: routing.h:2363
operations_research::TypeRegulationsChecker::OnInitializeCheck
virtual void OnInitializeCheck()
Definition: routing.h:2169
operations_research::RoutingModel::GetDeliveryIndexPairs
const std::vector< std::pair< int, int > > & GetDeliveryIndexPairs(int64 node_index) const
Same as above for deliveries.
Definition: routing.cc:1814
operations_research::DisjunctivePropagator::Tasks::start_max
std::vector< int64 > start_max
Definition: routing.h:1927
operations_research::RoutingModel::VehicleClass::end_equivalence_class
int end_equivalence_class
Definition: routing.h:334
operations_research::DisjunctivePropagator::Tasks::duration_max
std::vector< int64 > duration_max
Definition: routing.h:1929
gtl::ITIVector::size
size_type size() const
Definition: int_type_indexed_vector.h:146
callback
MPCallback * callback
Definition: gurobi_interface.cc:510
operations_research::RoutingDimension::GetGlobalOptimizerOffset
int64 GetGlobalOptimizerOffset() const
Definition: routing.h:2649
operations_research::RoutingModel::HasTypeRegulations
bool HasTypeRegulations() const
Returns true iff the model has any incompatibilities or requirements set on node types.
Definition: routing.h:863
operations_research::RoutingModel::GetMutableGlobalCumulOptimizer
GlobalDimensionCumulOptimizer * GetMutableGlobalCumulOptimizer(const RoutingDimension &dimension) const
Returns the global/local dimension cumul optimizer for a given dimension, or nullptr if there is none...
Definition: routing.cc:1231
operations_research::GlobalCheapestInsertionFilteredHeuristic::BuildSolutionInternal
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
Definition: routing_search.cc:3398
operations_research::RoutingModel::GetGlobalDimensionCumulOptimizers
const std::vector< std::unique_ptr< GlobalDimensionCumulOptimizer > > & GetGlobalDimensionCumulOptimizers() const
Returns [global|local]_dimension_optimizers_, which are empty if the model has not been closed.
Definition: routing.h:555
operations_research::Assignment::FastAdd
IntVarElement * FastAdd(IntVar *const var)
Adds without checking if variable has been previously added.
Definition: constraint_solver/assignment.cc:647
operations_research::RoutingModel::AddLocalSearchOperator
void AddLocalSearchOperator(LocalSearchOperator *ls_operator)
Adds a local search operator to the set of operators used to solve the vehicle routing problem.
Definition: routing.cc:1882
operations_research::RoutingModel::VehicleTypeContainer::type_index_of_vehicle
std::vector< int > type_index_of_vehicle
Definition: routing.h:374
DCHECK_GE
#define DCHECK_GE(val1, val2)
Definition: base/logging.h:889
operations_research::RoutingModel::GetDisjunctionMaxCardinality
int64 GetDisjunctionMaxCardinality(DisjunctionIndex index) const
Returns the maximum number of possible active nodes of the node disjunction of index 'index'.
Definition: routing.h:650
operations_research::RoutingDimension::SetSpanCostCoefficientForAllVehicles
void SetSpanCostCoefficientForAllVehicles(int64 coefficient)
Definition: routing.cc:6766
model
GRBmodel * model
Definition: gurobi_interface.cc:269
operations_research::Constraint
A constraint is the main modeling object.
Definition: constraint_solver.h:3579
operations_research::ParallelSavingsFilteredHeuristic
Definition: routing.h:3633
operations_research::RoutingFilteredHeuristic::model
RoutingModel * model() const
Definition: routing.h:3048
operations_research::ChristofidesFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3687
operations_research::RoutingDimension::SetCumulVarSoftUpperBound
void SetCumulVarSoftUpperBound(int64 index, int64 upper_bound, int64 coefficient)
Sets a soft upper bound to the cumul variable of a given variable index.
Definition: routing.cc:6842
operations_research::TypeIncompatibilityChecker::~TypeIncompatibilityChecker
~TypeIncompatibilityChecker() override
Definition: routing.h:2187
operations_research::CheapestInsertionFilteredHeuristic::InitializePriorityQueue
void InitializePriorityQueue(std::vector< std::vector< StartEndValue > > *start_end_distances_per_node, Queue *priority_queue)
Initializes the priority_queue by inserting the best entry corresponding to each node,...
operations_research::Solver
Solver Class.
Definition: constraint_solver.h:248
operations_research::ComparatorCheapestAdditionFilteredHeuristic::~ComparatorCheapestAdditionFilteredHeuristic
~ComparatorCheapestAdditionFilteredHeuristic() override
Definition: routing.h:3488
operations_research::TypeRegulationsChecker::HasRegulationsToCheck
virtual bool HasRegulationsToCheck() const =0
operations_research::GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionParameters
Definition: routing.h:3159
operations_research::BasePathFilter::OnSynchronize
void OnSynchronize(const Assignment *delta) override
Definition: routing_search.cc:447
operations_research::MakePathCumulFilter
IntVarLocalSearchFilter * MakePathCumulFilter(const RoutingDimension &dimension, const RoutingSearchParameters &parameters, bool propagate_own_objective_value, bool filter_objective_cost, bool can_use_lp=true)
Definition: routing_search.cc:2068
operations_research::IntVarFilteredHeuristic::BuildSolutionInternal
virtual bool BuildSolutionInternal()=0
Virtual method to redefine how to build a solution.
operations_research::TravelBounds::post_travels
std::vector< int64 > post_travels
Definition: routing.h:1998
operations_research::GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionFilteredHeuristic
GlobalCheapestInsertionFilteredHeuristic(RoutingModel *model, std::function< int64(int64, int64, int64)> evaluator, std::function< int64(int64)> penalty_evaluator, LocalSearchFilterManager *filter_manager, GlobalCheapestInsertionParameters parameters)
Takes ownership of evaluators.
Definition: routing_search.cc:3276
operations_research::AppendTasksFromPath
void AppendTasksFromPath(const std::vector< int64 > &path, const TravelBounds &travel_bounds, const RoutingDimension &dimension, DisjunctivePropagator::Tasks *tasks)
Definition: routing_breaks.cc:590
operations_research::RoutingModel::HasTemporalTypeIncompatibilities
bool HasTemporalTypeIncompatibilities() const
Definition: routing.h:812
operations_research::RoutingModel::GetRequiredTypeAlternativesWhenRemovingType
const std::vector< absl::flat_hash_set< int > > & GetRequiredTypeAlternativesWhenRemovingType(int type) const
Returns the set of requirement alternatives when removing the given type.
Definition: routing.cc:4319
operations_research::MakeVehicleBreaksFilter
IntVarLocalSearchFilter * MakeVehicleBreaksFilter(const RoutingModel &routing_model, const RoutingDimension &dimension)
Definition: routing_breaks.cc:1060
operations_research::RoutingDimension::vehicle_to_class
int vehicle_to_class(int vehicle) const
Definition: routing.h:2430
operations_research::RoutingModel::CostClass::CostClass
CostClass(int evaluator_index)
Definition: routing.h:309
operations_research::SimpleBoundCosts::SimpleBoundCosts
SimpleBoundCosts(const SimpleBoundCosts &)=delete
operations_research::ParallelSavingsFilteredHeuristic::~ParallelSavingsFilteredHeuristic
~ParallelSavingsFilteredHeuristic() override
Definition: routing.h:3640
operations_research::RoutingModel::GetNumberOfDecisionsInFirstSolution
int64 GetNumberOfDecisionsInFirstSolution(const RoutingSearchParameters &search_parameters) const
Returns statistics on first solution search, number of decisions sent to filters, number of decisions...
Definition: routing.cc:3722
operations_research::LocalSearchFilterManager
Filter manager: when a move is made, filters are executed to decide whether the solution is feasible ...
Definition: constraint_solveri.h:1763
graph.h
operations_research::RoutingModel::StateDependentTransit::transit
RangeIntToIntFunction * transit
Definition: routing.h:263
operations_research::GlobalVehicleBreaksConstraint::GlobalVehicleBreaksConstraint
GlobalVehicleBreaksConstraint(const RoutingDimension *dimension)
Definition: routing_breaks.cc:687
operations_research::CheapestInsertionFilteredHeuristic::StartEndValue::vehicle
int vehicle
Definition: routing.h:3091
operations_research::RoutingDimension::GetNodePrecedences
const std::vector< NodePrecedence > & GetNodePrecedences() const
Definition: routing.h:2620
operations_research::SavingsFilteredHeuristic::SavingsParameters::neighbors_ratio
double neighbors_ratio
If neighbors_ratio < 1 then for each node only this ratio of its neighbors leading to the smallest ar...
Definition: routing.h:3515
operations_research::RoutingModel::VehicleClass::dimension_end_cumuls_min
gtl::ITIVector< DimensionIndex, int64 > dimension_end_cumuls_min
Definition: routing.h:339
coefficient
int64 coefficient
Definition: routing_search.cc:970
operations_research::DisjunctivePropagator::Tasks::end_min
std::vector< int64 > end_min
Definition: routing.h:1930
operations_research::RoutingModel::PreAssignment
const Assignment *const PreAssignment() const
Returns an assignment used to fix some of the variables of the problem.
Definition: routing.h:1053
operations_research::TypeIncompatibilityChecker
Checker for type incompatibilities.
Definition: routing.h:2183
operations_research::RoutingModel::GetPickupAndDeliveryDisjunctions
const std::vector< std::pair< DisjunctionIndex, DisjunctionIndex > > & GetPickupAndDeliveryDisjunctions() const
Definition: routing.h:737
operations_research::RoutingModel::GetAmortizedQuadraticCostFactorOfVehicles
const std::vector< int64 > & GetAmortizedQuadraticCostFactorOfVehicles() const
Definition: routing.h:933
operations_research::RoutingDimension::AreVehicleTransitsPositive
bool AreVehicleTransitsPositive(int vehicle) const
Returns true iff the transit evaluator of 'vehicle' is positive for all arcs.
Definition: routing.h:2426
operations_research::RoutingModel::End
int64 End(int vehicle) const
Returns the variable index of the ending node of a vehicle route.
Definition: routing.h:1169
operations_research::RoutingFilteredHeuristic::MakePartiallyPerformedPairsUnperformed
void MakePartiallyPerformedPairsUnperformed()
Make all partially performed pickup and delivery pairs unperformed.
Definition: routing_search.cc:3031
operations_research::RoutingModel::GetCumulBounds
std::vector< std::vector< std::pair< int64, int64 > > > GetCumulBounds(const Assignment &solution_assignment, const RoutingDimension &dimension)
Returns a vector cumul_bounds, for which cumul_bounds[i][j] is a pair containing the minimum and maxi...
Definition: routing.cc:4415
operations_research::RoutingModel::AddVariableMinimizedByFinalizer
void AddVariableMinimizedByFinalizer(IntVar *var)
Adds a variable to minimize in the solution finalizer.
Definition: routing.cc:5744
operations_research::DisjunctivePropagator::Tasks::Clear
void Clear()
Definition: routing.h:1938
operations_research::RoutingDimension::AddNodePrecedence
void AddNodePrecedence(int64 first_node, int64 second_node, int64 offset)
Definition: routing.h:2625
operations_research::RoutingDimension::HasCumulVarSoftUpperBound
bool HasCumulVarSoftUpperBound(int64 index) const
Returns true if a soft upper bound has been set for a given variable index.
Definition: routing.cc:6851
operations_research::CPFeasibilityFilter::DebugString
std::string DebugString() const override
Definition: routing.h:3787
operations_research::BasePathFilter
Generic path-based filter class.
Definition: routing.h:3707
operations_research::RoutingModel::CloseVisitTypes
void CloseVisitTypes()
This function should be called once all node visit types have been set and prior to adding any incomp...
Definition: routing.cc:4195
operations_research::RoutingModel::GetCostClassIndexOfVehicle
CostClassIndex GetCostClassIndexOfVehicle(int64 vehicle) const
Get the cost class index of the given vehicle.
Definition: routing.h:1238
operations_research::RoutingModel::AddWeightedVariableMinimizedByFinalizer
void AddWeightedVariableMinimizedByFinalizer(IntVar *var, int64 cost)
Adds a variable to minimize in the solution finalizer, with a weighted priority: the higher the more ...
Definition: routing.cc:5720
operations_research::RoutingModel::GetPerfectBinaryDisjunctions
std::vector< std::pair< int64, int64 > > GetPerfectBinaryDisjunctions() const
Returns the list of all perfect binary disjunctions, as pairs of variable indices: a disjunction is "...
Definition: routing.cc:1692
operations_research::MakePickupDeliveryFilter
IntVarLocalSearchFilter * MakePickupDeliveryFilter(const RoutingModel &routing_model, const RoutingModel::IndexPairs &pairs, const std::vector< RoutingModel::PickupAndDeliveryPolicy > &vehicle_policies)
Definition: routing_search.cc:2444
operations_research::RoutingModel::Next
int64 Next(const Assignment &assignment, int64 index) const
Assignment inspection Returns the variable index of the node directly after the node corresponding to...
Definition: routing.cc:4011
operations_research::RoutingModel::AddRequiredTypeAlternativesWhenRemovingType
void AddRequiredTypeAlternativesWhenRemovingType(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)
The following requirements apply when visiting dependent nodes that remove their type from the route,...
Definition: routing.cc:4281
operations_research::RoutingModel::ADDED_TYPE_REMOVED_FROM_VEHICLE
@ ADDED_TYPE_REMOVED_FROM_VEHICLE
When visited, one instance of type 'T' previously added to the route (TYPE_ADDED_TO_VEHICLE),...
Definition: routing.h:767
operations_research::SavingsFilteredHeuristic::ExtraSavingsMemoryMultiplicativeFactor
virtual double ExtraSavingsMemoryMultiplicativeFactor() const =0
operations_research::RoutingModel::AreEmptyRouteCostsConsideredForVehicle
bool AreEmptyRouteCostsConsideredForVehicle(int vehicle) const
Definition: routing.h:942
operations_research::RoutingModel::GetSameVehicleIndicesOfIndex
const std::vector< int > & GetSameVehicleIndicesOfIndex(int node) const
Returns variable indices of nodes constrained to be on the same route.
Definition: routing.h:1267
operations_research::RoutingModel::VehicleClass::dimension_evaluator_classes
gtl::ITIVector< DimensionIndex, int64 > dimension_evaluator_classes
dimension_evaluators[d]->Run(from, to) is the transit value of arc from->to for a dimension d.
Definition: routing.h:344
operations_research::RoutingModel::Start
int64 Start(int vehicle) const
Model inspection.
Definition: routing.h:1167
operations_research::RoutingModel::VehicleVar
IntVar * VehicleVar(int64 index) const
Returns the vehicle variable of the node corresponding to index.
Definition: routing.h:1209
operations_research::RoutingModel::AddIntervalToAssignment
void AddIntervalToAssignment(IntervalVar *const interval)
Definition: routing.cc:5758
operations_research::RoutingModel::AddSameVehicleRequiredTypeAlternatives
void AddSameVehicleRequiredTypeAlternatives(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)
Requirements: NOTE: As of 2019-04, cycles in the requirement graph are not supported,...
Definition: routing.cc:4238
operations_research::IntVarFilteredHeuristic::SetValue
void SetValue(int64 index, int64 value)
Modifies the current solution by setting the variable of index 'index' to value 'value'.
Definition: routing.h:2994
operations_research::IntVarFilteredHeuristic::Commit
bool Commit()
Commits the modifications to the current solution if these modifications are "filter-feasible",...
Definition: routing_search.cc:2893
operations_research::RoutingDimension::SetQuadraticCostSoftSpanUpperBoundForVehicle
void SetQuadraticCostSoftSpanUpperBoundForVehicle(SimpleBoundCosts::BoundCost bound_cost, int vehicle)
If the span of vehicle on this dimension is larger than bound, the cost will be increased by cost * (...
Definition: routing.h:2681
operations_research::RoutingModelInspector
Definition: routing.cc:1989
operations_research::RoutingModel::GetFixedCostOfVehicle
int64 GetFixedCostOfVehicle(int vehicle) const
Returns the route fixed cost taken into account if the route of the vehicle is not empty,...
Definition: routing.cc:1311
operations_research::TravelBounds::min_travels
std::vector< int64 > min_travels
Definition: routing.h:1995
operations_research::SequentialSavingsFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3620
operations_research::RoutingModel::VehicleClass::dimension_start_cumuls_min
gtl::ITIVector< DimensionIndex, int64 > dimension_start_cumuls_min
Bounds of cumul variables at start and end vehicle nodes.
Definition: routing.h:337
hash.h
operations_research::SweepArranger::~SweepArranger
virtual ~SweepArranger()
Definition: routing.h:2836
operations_research::RoutingModel::SolveFromAssignmentWithParameters
const Assignment * SolveFromAssignmentWithParameters(const Assignment *assignment, const RoutingSearchParameters &search_parameters, std::vector< const Assignment * > *solutions=nullptr)
Definition: routing.cc:3302
operations_research::RoutingDimension::GetCumulVarSoftUpperBoundCoefficient
int64 GetCumulVarSoftUpperBoundCoefficient(int64 index) const
Returns the cost coefficient of the soft upper bound of a cumul variable for a given variable index.
Definition: routing.cc:6864
operations_research::RoutingModel::ApplyLocks
IntVar * ApplyLocks(const std::vector< int64 > &locks)
Applies a lock chain to the next search.
Definition: routing.cc:3695
operations_research::IntVarLocalSearchFilter
Definition: constraint_solveri.h:1811
operations_research::RoutingFilteredHeuristic::BuildSolutionFromRoutes
const Assignment * BuildSolutionFromRoutes(const std::function< int64(int64)> &next_accessor)
Builds a solution starting from the routes formed by the next accessor.
Definition: routing_search.cc:2860
delta
int64 delta
Definition: resource.cc:1684
operations_research::RoutingDimension::GetPickupToDeliveryLimitForPair
int64 GetPickupToDeliveryLimitForPair(int pair_index, int pickup, int delivery) const
Definition: routing.cc:7122
operations_research::SavingsFilteredHeuristic::SavingsParameters
Definition: routing.h:3512
operations_research::SimpleBoundCosts::SimpleBoundCosts
SimpleBoundCosts(int num_bounds, BoundCost default_bound_cost)
Definition: routing.h:2298
b
int64 b
Definition: constraint_solver/table.cc:43
operations_research::IntVarFilteredDecisionBuilder::~IntVarFilteredDecisionBuilder
~IntVarFilteredDecisionBuilder() override
Definition: routing.h:2946
operations_research::AppendDimensionCumulFilters
void AppendDimensionCumulFilters(const std::vector< RoutingDimension * > &dimensions, const RoutingSearchParameters &parameters, bool filter_objective_cost, std::vector< LocalSearchFilterManager::FilterEvent > *filters)
Definition: routing_search.cc:2182
operations_research::RoutingModel::CloseModel
void CloseModel()
Closes the current routing model; after this method is called, no modification to the model can be do...
Definition: routing.cc:1985
DISALLOW_COPY_AND_ASSIGN
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: macros.h:29
operations_research::RoutingModel::SetMaximumNumberOfActiveVehicles
void SetMaximumNumberOfActiveVehicles(int max_active_vehicles)
Constrains the maximum number of active vehicles, aka the number of vehicles which do not have an emp...
Definition: routing.h:887
operations_research::RoutingModel::ROUTING_INVALID
@ ROUTING_INVALID
Model, model parameters or flags are not valid.
Definition: routing.h:224
adjustable_priority_queue-inl.h
operations_research::IntVarFilteredDecisionBuilder::number_of_rejects
int64 number_of_rejects() const
Definition: routing_search.cc:2809
operations_research::TypeRegulationsChecker::TypePolicyOccurrence::num_type_added_to_vehicle
int num_type_added_to_vehicle
Number of TYPE_ADDED_TO_VEHICLE and TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED node type policies seen on ...
Definition: routing.h:2140
operations_research::SavingsFilteredHeuristic::SavingsFilteredHeuristic
SavingsFilteredHeuristic(RoutingModel *model, const RoutingIndexManager *manager, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
Definition: routing_search.cc:5074
operations_research::IntVarFilteredDecisionBuilder::number_of_decisions
int64 number_of_decisions() const
Returns statistics from its underlying heuristic.
Definition: routing_search.cc:2805
operations_research::RoutingModel::PackCumulsOfOptimizerDimensionsFromAssignment
const Assignment * PackCumulsOfOptimizerDimensionsFromAssignment(const Assignment *original_assignment, absl::Duration duration_limit)
For every dimension in the model with an optimizer in local/global_dimension_optimizers_,...
Definition: routing.cc:389
operations_research::RoutingModel::GetPickupAndDeliveryPairs
const IndexPairs & GetPickupAndDeliveryPairs() const
Returns pickup and delivery pairs currently in the model.
Definition: routing.h:733
operations_research::BasePathFilter::IsDisabled
bool IsDisabled() const
Definition: routing.h:3727
operations_research::TypeRequirementChecker::~TypeRequirementChecker
~TypeRequirementChecker() override
Definition: routing.h:2203
operations_research::RoutingModel::solver
Solver * solver() const
Returns the underlying constraint solver.
Definition: routing.h:1314
operations_research::RoutingModel::ConsiderEmptyRouteCostsForVehicle
void ConsiderEmptyRouteCostsForVehicle(bool consider_costs, int vehicle)
Definition: routing.h:937
operations_research::RoutingDimension
Dimensions represent quantities accumulated at nodes along the routes.
Definition: routing.h:2331
operations_research::RoutingModel::Solve
const Assignment * Solve(const Assignment *assignment=nullptr)
Solves the current routing model; closes the current model.
Definition: routing.cc:3232
capacity
int64 capacity
Definition: routing_flow.cc:129
operations_research::TypeRegulationsChecker::CheckVehicle
bool CheckVehicle(int vehicle, const std::function< int64(int64)> &next_accessor)
Definition: routing.cc:6392
interval
IntervalVar * interval
Definition: resource.cc:98
operations_research::SavingsFilteredHeuristic::savings_container_
std::unique_ptr< SavingsContainer< Saving > > savings_container_
Definition: routing.h:3572
operations_research::RoutingModel::CostClass::DimensionCost::dimension
const RoutingDimension * dimension
Definition: routing.h:298
next
Block * next
Definition: constraint_solver.cc:674
range_query_function.h
operations_research::RoutingModel::VehicleTypeContainer::VehicleClassEntry
Definition: routing.h:357
operations_research::RoutingFilteredHeuristic::GetStartChainEnd
int GetStartChainEnd(int vehicle) const
Returns the end of the start chain of vehicle,.
Definition: routing.h:3050
operations_research::GlobalCheapestInsertionFilteredHeuristic
Filter-based decision builder which builds a solution by inserting nodes at their cheapest position o...
Definition: routing.h:3157
operations_research::TypeRegulationsConstraint::Post
void Post() override
This method is called when the constraint is processed by the solver.
Definition: routing.cc:6614
operations_research::RoutingDimension::HasCumulVarPiecewiseLinearCost
bool HasCumulVarPiecewiseLinearCost(int64 index) const
Returns true if a piecewise linear cost has been set for a given variable index.
Definition: routing.cc:6795
operations_research::RoutingFilteredHeuristic::ResetVehicleIndices
virtual void ResetVehicleIndices()
Definition: routing.h:3067
operations_research::RoutingModel::GetPrimaryConstrainedDimension
const std::string & GetPrimaryConstrainedDimension() const
Get the primary constrained dimension, or an empty string if it is unset.
Definition: routing.h:595
operations_research::RoutingFilteredHeuristic::MakeUnassignedNodesUnperformed
void MakeUnassignedNodesUnperformed()
Make all unassigned nodes unperformed.
Definition: routing_search.cc:3023
operations_research::RoutingModel::AddDisjunction
DisjunctionIndex AddDisjunction(const std::vector< int64 > &indices, int64 penalty=kNoPenalty, int64 max_cardinality=1)
Adds a disjunction constraint on the indices: exactly 'max_cardinality' of the indices are active.
Definition: routing.cc:1676
operations_research::RoutingModel::GetRequiredTypeAlternativesWhenAddingType
const std::vector< absl::flat_hash_set< int > > & GetRequiredTypeAlternativesWhenAddingType(int type) const
Returns the set of requirement alternatives when adding the given type.
Definition: routing.cc:4312
operations_research::TypeRegulationsChecker::TypePolicyOccurrence
Definition: routing.h:2136
operations_research::RoutingModel::GetTemporalTypeIncompatibilitiesOfType
const absl::flat_hash_set< int > & GetTemporalTypeIncompatibilitiesOfType(int type) const
Definition: routing.cc:4230
operations_research::RoutingDimension::SetGlobalSpanCostCoefficient
void SetGlobalSpanCostCoefficient(int64 coefficient)
Sets a cost proportional to the global dimension span, that is the difference between the largest val...
Definition: routing.cc:6771
operations_research::RoutingModel::CostClass::LessThan
static bool LessThan(const CostClass &a, const CostClass &b)
Comparator for STL containers and algorithms.
Definition: routing.h:313
operations_research::RoutingModel::AddRequiredTypeAlternativesWhenAddingType
void AddRequiredTypeAlternativesWhenAddingType(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)
If type_D depends on type_R when adding type_D, any node_D of type_D and VisitTypePolicy TYPE_ADDED_T...
Definition: routing.cc:4260
operations_research::IntVarFilteredHeuristic::Var
IntVar * Var(int64 index) const
Returns the variable of index 'index'.
Definition: routing.h:3016
lp_types.h
operations_research::RoutingModel::SetPickupAndDeliveryPolicyOfVehicle
void SetPickupAndDeliveryPolicyOfVehicle(PickupAndDeliveryPolicy policy, int vehicle)
Definition: routing.cc:1820
operations_research::SequentialSavingsFilteredHeuristic::SequentialSavingsFilteredHeuristic
SequentialSavingsFilteredHeuristic(RoutingModel *model, const RoutingIndexManager *manager, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
Definition: routing.h:3614
operations_research::BasePathFilter::Accept
bool Accept(const Assignment *delta, const Assignment *deltadelta, int64 objective_min, int64 objective_max) override
Accepts a "delta" given the assignment with which the filter has been synchronized; the delta holds t...
Definition: routing_search.cc:301
operations_research::RoutingModel::CostClass::dimension_transit_evaluator_class_and_cost_coefficient
std::vector< DimensionCost > dimension_transit_evaluator_class_and_cost_coefficient
Definition: routing.h:307
operations_research::RoutingModel::SetTabuVarsCallback
void SetTabuVarsCallback(GetTabuVarsCallback tabu_var_callback)
Definition: routing.cc:5640
operations_research::RoutingDimension::SetCumulVarSoftLowerBound
void SetCumulVarSoftLowerBound(int64 index, int64 lower_bound, int64 coefficient)
Sets a soft lower bound to the cumul variable of a given variable index.
Definition: routing.cc:6893
operations_research::RoutingModel::SetFixedCostOfVehicle
void SetFixedCostOfVehicle(int64 cost, int vehicle)
Sets the fixed cost of one vehicle route.
Definition: routing.cc:1316
operations_research::DisjunctivePropagator::ChainSpanMinDynamic
bool ChainSpanMinDynamic(Tasks *tasks)
Computes a lower bound of the span of the chain, taking into account only the first nonchain task.
Definition: routing_breaks.cc:469
operations_research::SimpleBoundCosts::BoundCost::cost
int64 cost
Definition: routing.h:2296
operations_research::RoutingDimension::GetCumulVarSoftLowerBound
int64 GetCumulVarSoftLowerBound(int64 index) const
Returns the soft lower bound of a cumul variable for a given variable index.
Definition: routing.cc:6907
operations_research::RoutingModel::DimensionIndex
RoutingDimensionIndex DimensionIndex
Definition: routing.h:237
operations_research::RoutingModel::RestoreAssignment
Assignment * RestoreAssignment(const Assignment &solution)
Restores an assignment as a solution in the routing model and returns the new solution.
Definition: routing.cc:3756
operations_research::RoutingModel::VehicleTypeContainer::VehicleClassEntry::fixed_cost
int64 fixed_cost
Definition: routing.h:359
operations_research::RoutingModel::VehicleClass::dimension_start_cumuls_max
gtl::ITIVector< DimensionIndex, int64 > dimension_start_cumuls_max
Definition: routing.h:338
operations_research::BasePathFilter::NumPaths
int NumPaths() const
Definition: routing.h:3723
operations_research::RoutingDimension::GetAllowedIntervalsInRange
SortedDisjointIntervalList GetAllowedIntervalsInRange(int64 index, int64 min_value, int64 max_value) const
Returns allowed intervals for a given node in a given interval.
Definition: routing.cc:6727
operations_research::sat::ThetaLambdaTree< int64 >
routing_index_manager.h
operations_research::RoutingDimension::GetQuadraticCostSoftSpanUpperBoundForVehicle
SimpleBoundCosts::BoundCost GetQuadraticCostSoftSpanUpperBoundForVehicle(int vehicle) const
Definition: routing.h:2694
operations_research::SavingsFilteredHeuristic::SavingsParameters::add_reverse_arcs
bool add_reverse_arcs
If add_reverse_arcs is true, the neighborhood relationships are considered symmetrically.
Definition: routing.h:3521
operations_research::RoutingModel::AddVectorDimension
bool AddVectorDimension(std::vector< int64 > values, int64 capacity, bool fix_start_cumul_to_zero, const std::string &name)
Creates a dimension where the transit variable is constrained to be equal to 'values[i]' for node i; ...
Definition: routing.cc:1045
operations_research::CheapestInsertionFilteredHeuristic::evaluator_
std::function< int64(int64, int64, int64)> evaluator_
Definition: routing.h:3145
operations_research::RoutingModel::StateDependentTransit
What follows is relevant for models with time/state dependent transits.
Definition: routing.h:262
operations_research::DisjunctivePropagator::ChainSpanMin
bool ChainSpanMin(Tasks *tasks)
Propagates a lower bound of the chain span, end[num_chain_tasks] - start[0], to span_min.
Definition: routing_breaks.cc:429
operations_research::DisjunctivePropagator
This class acts like a CP propagator: it takes a set of tasks given by their start/duration/end featu...
Definition: routing.h:1917
operations_research::SavingsFilteredHeuristic::GetBeforeNodeFromSaving
int64 GetBeforeNodeFromSaving(const Saving &saving) const
Returns the "before node" from a saving.
Definition: routing.h:3549
operations_research::RoutingModel::AddAtSolutionCallback
void AddAtSolutionCallback(std::function< void()> callback)
Adds a callback called each time a solution is found during the search.
Definition: routing.cc:3227
CHECK
#define CHECK(condition)
Definition: base/logging.h:495
operations_research::RoutingModel::HasDimension
bool HasDimension(const std::string &dimension_name) const
Returns true if a dimension exists for a given dimension name.
Definition: routing.cc:1267
operations_research::RoutingModel::RegisterStateDependentTransitCallback
int RegisterStateDependentTransitCallback(VariableIndexEvaluator2 callback)
Definition: routing.cc:917
operations_research::LocalCheapestInsertionFilteredHeuristic::BuildSolutionInternal
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
Definition: routing_search.cc:4320
commandlineflags.h
operations_research::RoutingModelVisitor::kLightElement2
static const char kLightElement2[]
Definition: routing.h:1910
operations_research::RoutingModel::ROUTING_FAIL_TIMEOUT
@ ROUTING_FAIL_TIMEOUT
Time limit reached before finding a solution with RoutingModel::Solve().
Definition: routing.h:222
operations_research::SweepArranger::SetSectors
void SetSectors(int sectors)
Definition: routing.h:2838
parameters
SatParameters parameters
Definition: cp_model_fz_solver.cc:107
operations_research::RoutingFilteredHeuristic::RoutingFilteredHeuristic
RoutingFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager)
Definition: routing_search.cc:2933
operations_research::RoutingDimension::ShortestTransitionSlack
int64 ShortestTransitionSlack(int64 node) const
It makes sense to use the function only for self-dependent dimension.
Definition: routing_search.cc:5830
operations_research::RoutingTransitCallback2
std::function< int64(int64, int64)> RoutingTransitCallback2
Definition: routing_types.h:42
AdjustablePriorityQueue
Definition: adjustable_priority_queue.h:38
operations_research::MakeNodeDisjunctionFilter
IntVarLocalSearchFilter * MakeNodeDisjunctionFilter(const RoutingModel &routing_model)
Definition: routing_search.cc:281
operations_research::SearchLimit
Base class of all search limits.
Definition: constraint_solver.h:4234
operations_research::RoutingModel::kNoPenalty
static const int64 kNoPenalty
Constant used to express a hard constraint instead of a soft penalty.
Definition: routing.h:382
name
const std::string name
Definition: default_search.cc:808
operations_research::RoutingModel::GetArcCostForVehicle
int64 GetArcCostForVehicle(int64 from_index, int64 to_index, int64 vehicle) const
Returns the cost of the transit arc between two nodes for a given vehicle.
Definition: routing.cc:4019
operations_research::RoutingDimension::cumuls
const std::vector< IntVar * > & cumuls() const
Like CumulVar(), TransitVar(), SlackVar() but return the whole variable vectors instead (indexed by i...
Definition: routing.h:2357
operations_research::RoutingModel::nodes
int nodes() const
Sizes and indices Returns the number of nodes in the model.
Definition: routing.h:1330
operations_research::RoutingModel::HasTemporalTypeRequirements
bool HasTemporalTypeRequirements() const
Definition: routing.h:857
operations_research::RoutingModel::SetAssignmentFromOtherModelAssignment
void SetAssignmentFromOtherModelAssignment(Assignment *target_assignment, const RoutingModel *source_model, const Assignment *source_assignment)
Given a "source_model" and its "source_assignment", resets "target_assignment" with the IntVar variab...
Definition: routing.cc:3422
operations_research::CheapestInsertionFilteredHeuristic::StartEndValue::distance
int64 distance
Definition: routing.h:3090
parameters.pb.h
operations_research::SavingsFilteredHeuristic::SavingsFilteredHeuristicTestPeer
friend class SavingsFilteredHeuristicTestPeer
Definition: routing.h:3609
operations_research::RoutingModel::GetNumberOfVisitTypes
int GetNumberOfVisitTypes() const
Definition: routing.h:788
operations_research::RoutingDimension::base_dimension
const RoutingDimension * base_dimension() const
Returns the parent in the dependency tree if any or nullptr otherwise.
Definition: routing.h:2572
operations_research::RoutingDimension::HasCumulVarSoftLowerBound
bool HasCumulVarSoftLowerBound(int64 index) const
Returns true if a soft lower bound has been set for a given variable index.
Definition: routing.cc:6902
operations_research::TypeRegulationsChecker::CheckTypeRegulations
virtual bool CheckTypeRegulations(int type, VisitTypePolicy policy, int pos)=0
operations_research::RoutingModel::MakeGreedyDescentLSOperator
static std::unique_ptr< LocalSearchOperator > MakeGreedyDescentLSOperator(std::vector< IntVar * > variables)
Perhaps move it to constraint_solver.h.
Definition: routing_search.cc:5950
operations_research::IntVarFilteredHeuristic::number_of_decisions
int64 number_of_decisions() const
Returns statistics on search, number of decisions sent to filters, number of decisions rejected by fi...
Definition: routing.h:2974
kint64max
static const int64 kint64max
Definition: integral_types.h:62
operations_research::RoutingModel::GetNumOfSingletonNodes
int GetNumOfSingletonNodes() const
Returns the number of non-start/end nodes which do not appear in a pickup/delivery pair.
Definition: routing.cc:1840
operations_research::SimpleBoundCosts::bound_cost
BoundCost & bound_cost(int element)
Definition: routing.h:2300
operations_research::RoutingModel::CompactAndCheckAssignment
Assignment * CompactAndCheckAssignment(const Assignment &assignment) const
Same as CompactAssignment() but also checks the validity of the final compact solution; if it is not ...
Definition: routing.cc:3609
operations_research::RoutingModel::GetMutableLocalCumulOptimizer
LocalDimensionCumulOptimizer * GetMutableLocalCumulOptimizer(const RoutingDimension &dimension) const
Definition: routing.cc:1243
lp_solver.h
operations_research::RoutingDimension::GetLocalOptimizerOffsetForVehicle
int64 GetLocalOptimizerOffsetForVehicle(int vehicle) const
Definition: routing.h:2653
operations_research::BasePathFilter::Start
int64 Start(int i) const
Definition: routing.h:3724
operations_research::SimpleBoundCosts::Size
int Size()
Definition: routing.h:2302
operations_research::CheapestInsertionFilteredHeuristic::penalty_evaluator_
std::function< int64(int64)> penalty_evaluator_
Definition: routing.h:3146
operations_research::DisjunctivePropagator::Tasks::forbidden_intervals
std::vector< const SortedDisjointIntervalList * > forbidden_intervals
Definition: routing.h:1933
operations_research::RoutingModel::AddVariableMaximizedByFinalizer
void AddVariableMaximizedByFinalizer(IntVar *var)
Adds a variable to maximize in the solution finalizer (see above for information on the solution fina...
Definition: routing.cc:5740
operations_research::SimpleBoundCosts::BoundCost::bound
int64 bound
Definition: routing.h:2295
operations_research::RoutingModel::ActiveVar
IntVar * ActiveVar(int64 index) const
Returns the active variable of the node corresponding to index.
Definition: routing.h:1196
operations_research::RoutingDimension::GetPostTravelEvaluatorOfVehicle
int GetPostTravelEvaluatorOfVehicle(int vehicle) const
Definition: routing.cc:7080
operations_research::EvaluatorCheapestAdditionFilteredHeuristic::~EvaluatorCheapestAdditionFilteredHeuristic
~EvaluatorCheapestAdditionFilteredHeuristic() override
Definition: routing.h:3465
operations_research::Decision
A Decision represents a choice point in the search tree.
Definition: constraint_solver.h:3223