OR-Tools  8.0
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 
538  Constraint* MakePathSpansAndTotalSlacks(const RoutingDimension* dimension,
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  }
740 #endif // SWIG
741  enum VisitTypePolicy {
768  };
769  // TODO(user): Support multiple visit types per node?
770  void SetVisitType(int64 index, int type, VisitTypePolicy type_policy);
771  int GetVisitType(int64 index) const;
772  const std::vector<int>& GetSingleNodesOfType(int type) const;
773  const std::vector<int>& GetPairIndicesOfType(int type) const;
777  // TODO(user): Reconsider the logic and potentially remove the need to
779  void CloseVisitTypes();
780  int GetNumberOfVisitTypes() const { return num_visit_types_; }
781  const std::vector<int>& GetTopologicallySortedVisitTypes() const {
782  DCHECK(closed_);
783  return topologically_sorted_visit_types_;
784  }
789  void AddHardTypeIncompatibility(int type1, int type2);
790  void AddTemporalTypeIncompatibility(int type1, int type2);
792  const absl::flat_hash_set<int>& GetHardTypeIncompatibilitiesOfType(
793  int type) const;
794  const absl::flat_hash_set<int>& GetTemporalTypeIncompatibilitiesOfType(
795  int type) const;
799  return has_hard_type_incompatibilities_;
800  }
802  return has_temporal_type_incompatibilities_;
803  }
815  int dependent_type, absl::flat_hash_set<int> required_type_alternatives);
821  int dependent_type, absl::flat_hash_set<int> required_type_alternatives);
828  int dependent_type, absl::flat_hash_set<int> required_type_alternatives);
829  // clang-format off
832  const std::vector<absl::flat_hash_set<int> >&
835  const std::vector<absl::flat_hash_set<int> >&
838  const std::vector<absl::flat_hash_set<int> >&
840  // clang-format on
844  return has_same_vehicle_type_requirements_;
845  }
847  return has_temporal_type_requirements_;
848  }
849 
852  bool HasTypeRegulations() const {
856  }
857 
862  int64 UnperformedPenalty(int64 var_index) const;
866  int64 UnperformedPenaltyOrValue(int64 default_value, int64 var_index) const;
870  int64 GetDepot() const;
871 
876  void SetMaximumNumberOfActiveVehicles(int max_active_vehicles) {
877  max_active_vehicles_ = max_active_vehicles;
878  }
880  int GetMaximumNumberOfActiveVehicles() const { return max_active_vehicles_; }
884  void SetArcCostEvaluatorOfAllVehicles(int evaluator_index);
886  void SetArcCostEvaluatorOfVehicle(int evaluator_index, int vehicle);
891  void SetFixedCostOfVehicle(int64 cost, int vehicle);
895  int64 GetFixedCostOfVehicle(int vehicle) const;
896 
912  void SetAmortizedCostFactorsOfAllVehicles(int64 linear_cost_factor,
913  int64 quadratic_cost_factor);
915  void SetAmortizedCostFactorsOfVehicle(int64 linear_cost_factor,
916  int64 quadratic_cost_factor,
917  int vehicle);
918 
919  const std::vector<int64>& GetAmortizedLinearCostFactorOfVehicles() const {
920  return linear_cost_factor_of_vehicle_;
921  }
922  const std::vector<int64>& GetAmortizedQuadraticCostFactorOfVehicles() const {
923  return quadratic_cost_factor_of_vehicle_;
924  }
925 
926  void ConsiderEmptyRouteCostsForVehicle(bool consider_costs, int vehicle) {
927  DCHECK_LT(vehicle, vehicles_);
928  consider_empty_route_costs_[vehicle] = consider_costs;
929  }
930 
931  bool AreEmptyRouteCostsConsideredForVehicle(int vehicle) const {
932  DCHECK_LT(vehicle, vehicles_);
933  return consider_empty_route_costs_[vehicle];
934  }
935 
938 #ifndef SWIG
939  const Solver::IndexEvaluator2& first_solution_evaluator() const {
940  return first_solution_evaluator_;
941  }
942 #endif
943  void SetFirstSolutionEvaluator(Solver::IndexEvaluator2 evaluator) {
945  first_solution_evaluator_ = std::move(evaluator);
946  }
949  void AddLocalSearchOperator(LocalSearchOperator* ls_operator);
951  void AddSearchMonitor(SearchMonitor* const monitor);
955  void AddAtSolutionCallback(std::function<void()> callback);
960  void AddVariableMinimizedByFinalizer(IntVar* var);
963  void AddVariableMaximizedByFinalizer(IntVar* var);
969  void AddVariableTargetToFinalizer(IntVar* var, int64 target);
976  void CloseModel();
980  const RoutingSearchParameters& search_parameters);
987  const Assignment* Solve(const Assignment* assignment = nullptr);
995  const Assignment* SolveWithParameters(
996  const RoutingSearchParameters& search_parameters,
997  std::vector<const Assignment*>* solutions = nullptr);
998  const Assignment* SolveFromAssignmentWithParameters(
999  const Assignment* assignment,
1000  const RoutingSearchParameters& search_parameters,
1001  std::vector<const Assignment*>* solutions = nullptr);
1008  Assignment* target_assignment, const RoutingModel* source_model,
1009  const Assignment* source_assignment);
1015  // TODO(user): Add support for non-homogeneous costs and disjunctions.
1018  Status status() const { return status_; }
1027  IntVar* ApplyLocks(const std::vector<int64>& locks);
1036  bool ApplyLocksToAllVehicles(const std::vector<std::vector<int64>>& locks,
1037  bool close_routes);
1042  const Assignment* const PreAssignment() const { return preassignment_; }
1043  Assignment* MutablePreAssignment() { return preassignment_; }
1047  bool WriteAssignment(const std::string& file_name) const;
1051  Assignment* ReadAssignment(const std::string& file_name);
1054  Assignment* RestoreAssignment(const Assignment& solution);
1060  Assignment* ReadAssignmentFromRoutes(
1061  const std::vector<std::vector<int64>>& routes,
1062  bool ignore_inactive_indices);
1079  bool RoutesToAssignment(const std::vector<std::vector<int64>>& routes,
1080  bool ignore_inactive_indices, bool close_routes,
1081  Assignment* const assignment) const;
1085  void AssignmentToRoutes(const Assignment& assignment,
1086  std::vector<std::vector<int64>>* const routes) const;
1091 #ifndef SWIG
1092  std::vector<std::vector<int64>> GetRoutesFromAssignment(
1093  const Assignment& assignment);
1094 #endif
1095  Assignment* CompactAssignment(const Assignment& assignment) const;
1116  Assignment* CompactAndCheckAssignment(const Assignment& assignment) const;
1118  void AddToAssignment(IntVar* const var);
1119  void AddIntervalToAssignment(IntervalVar* const interval);
1131  const Assignment* original_assignment, absl::Duration duration_limit);
1132 #ifndef SWIG
1133  // TODO(user): Revisit if coordinates are added to the RoutingModel class.
1135  sweep_arranger_.reset(sweep_arranger);
1136  }
1138  SweepArranger* sweep_arranger() const { return sweep_arranger_.get(); }
1139 #endif
1140  void AddLocalSearchFilter(LocalSearchFilter* filter) {
1146  CHECK(filter != nullptr);
1147  if (closed_) {
1148  LOG(WARNING) << "Model is closed, filter addition will be ignored.";
1149  }
1150  extra_filters_.push_back(filter);
1151  }
1152 
1155  int64 Start(int vehicle) const { return starts_[vehicle]; }
1157  int64 End(int vehicle) const { return ends_[vehicle]; }
1159  bool IsStart(int64 index) const;
1161  bool IsEnd(int64 index) const { return index >= Size(); }
1164  int VehicleIndex(int index) const { return index_to_vehicle_[index]; }
1168  int64 Next(const Assignment& assignment, int64 index) const;
1170  bool IsVehicleUsed(const Assignment& assignment, int vehicle) const;
1171 
1172 #if !defined(SWIGPYTHON)
1173  const std::vector<IntVar*>& Nexts() const { return nexts_; }
1178  const std::vector<IntVar*>& VehicleVars() const { return vehicle_vars_; }
1179 #endif
1180  IntVar* NextVar(int64 index) const { return nexts_[index]; }
1183  IntVar* ActiveVar(int64 index) const { return active_[index]; }
1187  IntVar* ActiveVehicleVar(int vehicle) const {
1188  return vehicle_active_[vehicle];
1189  }
1192  IntVar* VehicleCostsConsideredVar(int vehicle) const {
1193  return vehicle_costs_considered_[vehicle];
1194  }
1197  IntVar* VehicleVar(int64 index) const { return vehicle_vars_[index]; }
1199  IntVar* CostVar() const { return cost_; }
1200 
1203  int64 GetArcCostForVehicle(int64 from_index, int64 to_index,
1204  int64 vehicle) const;
1207  return costs_are_homogeneous_across_vehicles_;
1208  }
1211  int64 GetHomogeneousCost(int64 from_index, int64 to_index) const {
1212  return GetArcCostForVehicle(from_index, to_index, /*vehicle=*/0);
1213  }
1216  int64 GetArcCostForFirstSolution(int64 from_index, int64 to_index) const;
1223  int64 GetArcCostForClass(int64 from_index, int64 to_index,
1224  int64 /*CostClassIndex*/ cost_class_index) const;
1227  DCHECK(closed_);
1228  return cost_class_index_of_vehicle_[vehicle];
1229  }
1232  bool HasVehicleWithCostClassIndex(CostClassIndex cost_class_index) const {
1233  DCHECK(closed_);
1234  if (cost_class_index == kCostClassIndexOfZeroCost) {
1235  return has_vehicle_with_zero_cost_class_;
1236  }
1237  return cost_class_index < cost_classes_.size();
1238  }
1240  int GetCostClassesCount() const { return cost_classes_.size(); }
1243  return std::max(0, GetCostClassesCount() - 1);
1244  }
1246  DCHECK(closed_);
1247  return vehicle_class_index_of_vehicle_[vehicle];
1248  }
1250  int GetVehicleClassesCount() const { return vehicle_classes_.size(); }
1252  const std::vector<int>& GetSameVehicleIndicesOfIndex(int node) const {
1253  DCHECK(closed_);
1254  return same_vehicle_groups_[same_vehicle_group_[node]];
1255  }
1256 
1258  DCHECK(closed_);
1259  return vehicle_type_container_;
1260  }
1261 
1280  bool ArcIsMoreConstrainedThanArc(int64 from, int64 to1, int64 to2);
1285  std::string DebugOutputAssignment(
1286  const Assignment& solution_assignment,
1287  const std::string& dimension_to_print) const;
1293 #ifndef SWIG
1294  std::vector<std::vector<std::pair<int64, int64>>> GetCumulBounds(
1295  const Assignment& solution_assignment, const RoutingDimension& dimension);
1296 #endif
1297  Solver* solver() const { return solver_.get(); }
1300 
1302  bool CheckLimit() {
1303  DCHECK(limit_ != nullptr);
1304  return limit_->Check();
1305  }
1306 
1308  absl::Duration RemainingTime() const {
1309  DCHECK(limit_ != nullptr);
1310  return limit_->AbsoluteSolverDeadline() - solver_->Now();
1311  }
1312 
1315  int nodes() const { return nodes_; }
1317  int vehicles() const { return vehicles_; }
1319  int64 Size() const { return nodes_ + vehicles_ - start_end_count_; }
1320 
1324  const RoutingSearchParameters& search_parameters) const;
1326  const RoutingSearchParameters& search_parameters) const;
1330  return automatic_first_solution_strategy_;
1331  }
1332 
1334  bool IsMatchingModel() const;
1335 
1336 #ifndef SWIG
1337  using GetTabuVarsCallback =
1340  std::function<std::vector<operations_research::IntVar*>(RoutingModel*)>;
1341 
1342  void SetTabuVarsCallback(GetTabuVarsCallback tabu_var_callback);
1343 #endif // SWIG
1344 
1346  // TODO(user): Find a way to test and restrict the access at the same time.
1358  DecisionBuilder* MakeGuidedSlackFinalizer(
1359  const RoutingDimension* dimension,
1360  std::function<int64(int64)> initializer);
1361 #ifndef SWIG
1362  // TODO(user): MakeGreedyDescentLSOperator is too general for routing.h.
1367  static std::unique_ptr<LocalSearchOperator> MakeGreedyDescentLSOperator(
1368  std::vector<IntVar*> variables);
1369 #endif
1370  DecisionBuilder* MakeSelfDependentDimensionFinalizer(
1384  const RoutingDimension* dimension);
1385 
1386  private:
1388  enum RoutingLocalSearchOperator {
1389  RELOCATE = 0,
1390  RELOCATE_PAIR,
1391  LIGHT_RELOCATE_PAIR,
1392  RELOCATE_NEIGHBORS,
1393  EXCHANGE,
1394  EXCHANGE_PAIR,
1395  CROSS,
1396  CROSS_EXCHANGE,
1397  TWO_OPT,
1398  OR_OPT,
1399  GLOBAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS,
1400  LOCAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS,
1401  GLOBAL_CHEAPEST_INSERTION_PATH_LNS,
1402  LOCAL_CHEAPEST_INSERTION_PATH_LNS,
1403  GLOBAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS,
1404  LOCAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS,
1405  RELOCATE_EXPENSIVE_CHAIN,
1406  LIN_KERNIGHAN,
1407  TSP_OPT,
1408  MAKE_ACTIVE,
1409  RELOCATE_AND_MAKE_ACTIVE,
1410  MAKE_ACTIVE_AND_RELOCATE,
1411  MAKE_INACTIVE,
1412  MAKE_CHAIN_INACTIVE,
1413  SWAP_ACTIVE,
1414  EXTENDED_SWAP_ACTIVE,
1415  NODE_PAIR_SWAP,
1416  PATH_LNS,
1417  FULL_PATH_LNS,
1418  TSP_LNS,
1419  INACTIVE_LNS,
1420  EXCHANGE_RELOCATE_PAIR,
1421  RELOCATE_SUBTRIP,
1422  EXCHANGE_SUBTRIP,
1423  LOCAL_SEARCH_OPERATOR_COUNTER
1424  };
1425 
1429  template <typename T>
1430  struct ValuedNodes {
1431  std::vector<int64> indices;
1432  T value;
1433  };
1434  struct DisjunctionValues {
1435  int64 penalty;
1436  int64 max_cardinality;
1437  };
1438  typedef ValuedNodes<DisjunctionValues> Disjunction;
1439 
1442  struct CostCacheElement {
1447  int index;
1448  CostClassIndex cost_class_index;
1449  int64 cost;
1450  };
1451 
1453  void Initialize();
1454  void AddNoCycleConstraintInternal();
1455  bool AddDimensionWithCapacityInternal(
1456  const std::vector<int>& evaluator_indices, int64 slack_max,
1457  std::vector<int64> vehicle_capacities, bool fix_start_cumul_to_zero,
1458  const std::string& name);
1459  bool AddDimensionDependentDimensionWithVehicleCapacityInternal(
1460  const std::vector<int>& pure_transits,
1461  const std::vector<int>& dependent_transits,
1462  const RoutingDimension* base_dimension, int64 slack_max,
1463  std::vector<int64> vehicle_capacities, bool fix_start_cumul_to_zero,
1464  const std::string& name);
1465  bool InitializeDimensionInternal(
1466  const std::vector<int>& evaluator_indices,
1467  const std::vector<int>& state_dependent_evaluator_indices,
1468  int64 slack_max, bool fix_start_cumul_to_zero,
1469  RoutingDimension* dimension);
1470  DimensionIndex GetDimensionIndex(const std::string& dimension_name) const;
1471 
1499  void StoreDimensionCumulOptimizers(const RoutingSearchParameters& parameters);
1500 
1501  void ComputeCostClasses(const RoutingSearchParameters& parameters);
1502  void ComputeVehicleClasses();
1510  void ComputeVehicleTypes();
1520  void FinalizeVisitTypes();
1521  int64 GetArcCostForClassInternal(int64 from_index, int64 to_index,
1522  CostClassIndex cost_class_index) const;
1523  void AppendHomogeneousArcCosts(const RoutingSearchParameters& parameters,
1524  int node_index,
1525  std::vector<IntVar*>* cost_elements);
1526  void AppendArcCosts(const RoutingSearchParameters& parameters, int node_index,
1527  std::vector<IntVar*>* cost_elements);
1528  Assignment* DoRestoreAssignment();
1529  static const CostClassIndex kCostClassIndexOfZeroCost;
1530  int64 SafeGetCostClassInt64OfVehicle(int64 vehicle) const {
1531  DCHECK_LT(0, vehicles_);
1532  return (vehicle >= 0 ? GetCostClassIndexOfVehicle(vehicle)
1533  : kCostClassIndexOfZeroCost)
1534  .value();
1535  }
1536  int64 GetDimensionTransitCostSum(int64 i, int64 j,
1537  const CostClass& cost_class) const;
1539  IntVar* CreateDisjunction(DisjunctionIndex disjunction);
1541  void AddPickupAndDeliverySetsInternal(const std::vector<int64>& pickups,
1542  const std::vector<int64>& deliveries);
1545  IntVar* CreateSameVehicleCost(int vehicle_index);
1548  int FindNextActive(int index, const std::vector<int64>& indices) const;
1549 
1552  bool RouteCanBeUsedByVehicle(const Assignment& assignment, int start_index,
1553  int vehicle) const;
1561  bool ReplaceUnusedVehicle(int unused_vehicle, int active_vehicle,
1562  Assignment* compact_assignment) const;
1563 
1564  void QuietCloseModel();
1565  void QuietCloseModelWithParameters(
1566  const RoutingSearchParameters& parameters) {
1567  if (!closed_) {
1569  }
1570  }
1571 
1573  bool SolveMatchingModel(Assignment* assignment,
1574  const RoutingSearchParameters& parameters);
1575 #ifndef SWIG
1576  bool AppendAssignmentIfFeasible(
1578  const Assignment& assignment,
1579  std::vector<std::unique_ptr<Assignment>>* assignments);
1580 #endif
1581  void LogSolution(const RoutingSearchParameters& parameters,
1583  const std::string& description, int64 solution_cost,
1584  int64 start_time_ms);
1587  Assignment* CompactAssignmentInternal(const Assignment& assignment,
1588  bool check_compact_assignment) const;
1593  std::string FindErrorInSearchParametersForModel(
1594  const RoutingSearchParameters& search_parameters) const;
1596  void SetupSearch(const RoutingSearchParameters& search_parameters);
1598  // TODO(user): Document each auxiliary method.
1599  Assignment* GetOrCreateAssignment();
1600  Assignment* GetOrCreateTmpAssignment();
1601  RegularLimit* GetOrCreateLimit();
1602  RegularLimit* GetOrCreateLocalSearchLimit();
1603  RegularLimit* GetOrCreateLargeNeighborhoodSearchLimit();
1604  RegularLimit* GetOrCreateFirstSolutionLargeNeighborhoodSearchLimit();
1605  LocalSearchOperator* CreateInsertionOperator();
1606  LocalSearchOperator* CreateMakeInactiveOperator();
1607  void CreateNeighborhoodOperators(const RoutingSearchParameters& parameters);
1608  LocalSearchOperator* GetNeighborhoodOperators(
1609  const RoutingSearchParameters& search_parameters) const;
1610  std::vector<LocalSearchFilter*> GetOrCreateLocalSearchFilters(
1611  const RoutingSearchParameters& parameters);
1612  LocalSearchFilterManager* GetOrCreateLocalSearchFilterManager(
1613  const RoutingSearchParameters& parameters);
1614  std::vector<LocalSearchFilter*> GetOrCreateFeasibilityFilters(
1615  const RoutingSearchParameters& parameters);
1616  LocalSearchFilterManager* GetOrCreateFeasibilityFilterManager(
1617  const RoutingSearchParameters& parameters);
1618  LocalSearchFilterManager* GetOrCreateStrongFeasibilityFilterManager(
1619  const RoutingSearchParameters& parameters);
1620  DecisionBuilder* CreateSolutionFinalizer(SearchLimit* lns_limit);
1621  DecisionBuilder* CreateFinalizerForMinimizedAndMaximizedVariables();
1622  void CreateFirstSolutionDecisionBuilders(
1623  const RoutingSearchParameters& search_parameters);
1624  DecisionBuilder* GetFirstSolutionDecisionBuilder(
1625  const RoutingSearchParameters& search_parameters) const;
1626  IntVarFilteredDecisionBuilder* GetFilteredFirstSolutionDecisionBuilderOrNull(
1627  const RoutingSearchParameters& parameters) const;
1628  LocalSearchPhaseParameters* CreateLocalSearchParameters(
1629  const RoutingSearchParameters& search_parameters);
1630  DecisionBuilder* CreateLocalSearchDecisionBuilder(
1631  const RoutingSearchParameters& search_parameters);
1632  void SetupDecisionBuilders(const RoutingSearchParameters& search_parameters);
1633  void SetupMetaheuristics(const RoutingSearchParameters& search_parameters);
1634  void SetupAssignmentCollector(
1635  const RoutingSearchParameters& search_parameters);
1636  void SetupTrace(const RoutingSearchParameters& search_parameters);
1637  void SetupSearchMonitors(const RoutingSearchParameters& search_parameters);
1638  bool UsesLightPropagation(
1639  const RoutingSearchParameters& search_parameters) const;
1640  GetTabuVarsCallback tabu_var_callback_;
1641 
1642  int GetVehicleStartClass(int64 start) const;
1643 
1644  void InitSameVehicleGroups(int number_of_groups) {
1645  same_vehicle_group_.assign(Size(), 0);
1646  same_vehicle_groups_.assign(number_of_groups, {});
1647  }
1648  void SetSameVehicleGroup(int index, int group) {
1649  same_vehicle_group_[index] = group;
1650  same_vehicle_groups_[group].push_back(index);
1651  }
1652 
1654  std::unique_ptr<Solver> solver_;
1655  int nodes_;
1656  int vehicles_;
1657  int max_active_vehicles_;
1658  Constraint* no_cycle_constraint_ = nullptr;
1660  std::vector<IntVar*> nexts_;
1661  std::vector<IntVar*> vehicle_vars_;
1662  std::vector<IntVar*> active_;
1663  // The following vectors are indexed by vehicle index.
1664  std::vector<IntVar*> vehicle_active_;
1665  std::vector<IntVar*> vehicle_costs_considered_;
1670  std::vector<IntVar*> is_bound_to_end_;
1671  mutable RevSwitch is_bound_to_end_ct_added_;
1673  absl::flat_hash_map<std::string, DimensionIndex> dimension_name_to_index_;
1675  // clang-format off
1679  std::vector<std::unique_ptr<GlobalDimensionCumulOptimizer> >
1680  global_dimension_optimizers_;
1681  gtl::ITIVector<DimensionIndex, int> global_optimizer_index_;
1682  std::vector<std::unique_ptr<LocalDimensionCumulOptimizer> >
1683  local_dimension_optimizers_;
1684  std::vector<std::unique_ptr<LocalDimensionCumulOptimizer> >
1685  local_dimension_mp_optimizers_;
1686  // clang-format off
1687  gtl::ITIVector<DimensionIndex, int> local_optimizer_index_;
1688  std::string primary_constrained_dimension_;
1690  IntVar* cost_ = nullptr;
1691  std::vector<int> vehicle_to_transit_cost_;
1692  std::vector<int64> fixed_cost_of_vehicle_;
1693  std::vector<CostClassIndex> cost_class_index_of_vehicle_;
1694  bool has_vehicle_with_zero_cost_class_;
1695  std::vector<int64> linear_cost_factor_of_vehicle_;
1696  std::vector<int64> quadratic_cost_factor_of_vehicle_;
1697  bool vehicle_amortized_cost_factors_set_;
1708  std::vector<bool> consider_empty_route_costs_;
1709 #ifndef SWIG
1711 #endif // SWIG
1712  bool costs_are_homogeneous_across_vehicles_;
1713  bool cache_callbacks_;
1714  mutable std::vector<CostCacheElement> cost_cache_;
1715  std::vector<VehicleClassIndex> vehicle_class_index_of_vehicle_;
1716 #ifndef SWIG
1718 #endif // SWIG
1719  VehicleTypeContainer vehicle_type_container_;
1720  std::function<int(int64)> vehicle_start_class_callback_;
1723  std::vector<std::vector<DisjunctionIndex> > index_to_disjunctions_;
1725  std::vector<ValuedNodes<int64> > same_vehicle_costs_;
1727 #ifndef SWIG
1728  std::vector<absl::flat_hash_set<int>> allowed_vehicles_;
1729 #endif // SWIG
1730  IndexPairs pickup_delivery_pairs_;
1732  std::vector<std::pair<DisjunctionIndex, DisjunctionIndex> >
1733  pickup_delivery_disjunctions_;
1734  // clang-format off
1735  // If node_index is a pickup, index_to_pickup_index_pairs_[node_index] is the
1736  // vector of pairs {pair_index, pickup_index} such that
1737  // (pickup_delivery_pairs_[pair_index].first)[pickup_index] == node_index
1738  std::vector<std::vector<std::pair<int, int> > > index_to_pickup_index_pairs_;
1739  // Same as above for deliveries.
1740  std::vector<std::vector<std::pair<int, int> > >
1741  index_to_delivery_index_pairs_;
1742  // clang-format on
1743  std::vector<PickupAndDeliveryPolicy> vehicle_pickup_delivery_policy_;
1744  // Same vehicle group to which a node belongs.
1745  std::vector<int> same_vehicle_group_;
1746  // Same vehicle node groups.
1747  std::vector<std::vector<int>> same_vehicle_groups_;
1748  // Node visit types
1749  // Variable index to visit type index.
1750  std::vector<int> index_to_visit_type_;
1751  // Variable index to VisitTypePolicy.
1752  std::vector<VisitTypePolicy> index_to_type_policy_;
1753  // clang-format off
1754  std::vector<std::vector<int> > single_nodes_of_type_;
1755  std::vector<std::vector<int> > pair_indices_of_type_;
1756 
1757  std::vector<absl::flat_hash_set<int> >
1758  hard_incompatible_types_per_type_index_;
1759  bool has_hard_type_incompatibilities_;
1760  std::vector<absl::flat_hash_set<int> >
1761  temporal_incompatible_types_per_type_index_;
1762  bool has_temporal_type_incompatibilities_;
1763 
1764  std::vector<std::vector<absl::flat_hash_set<int> > >
1765  same_vehicle_required_type_alternatives_per_type_index_;
1766  bool has_same_vehicle_type_requirements_;
1767  std::vector<std::vector<absl::flat_hash_set<int> > >
1768  required_type_alternatives_when_adding_type_index_;
1769  std::vector<std::vector<absl::flat_hash_set<int> > >
1770  required_type_alternatives_when_removing_type_index_;
1771  bool has_temporal_type_requirements_;
1772  absl::flat_hash_map</*type*/int, absl::flat_hash_set<VisitTypePolicy> >
1773  trivially_infeasible_visit_types_to_policies_;
1774  // clang-format on
1775 
1776  // Visit types sorted topologically based on required-->dependent requirement
1777  // arcs between the types (if the requirement/dependency graph is acyclic).
1778  std::vector<int> topologically_sorted_visit_types_;
1779  int num_visit_types_;
1780  // Two indices are equivalent if they correspond to the same node (as given
1781  // to the constructors taking a RoutingIndexManager).
1782  std::vector<int> index_to_equivalence_class_;
1783  std::vector<int> index_to_vehicle_;
1784  std::vector<int64> starts_;
1785  std::vector<int64> ends_;
1786  // TODO(user): b/62478706 Once the port is done, this shouldn't be needed
1787  // anymore.
1788  RoutingIndexManager manager_;
1789  int start_end_count_;
1790  // Model status
1791  bool closed_ = false;
1792  Status status_ = ROUTING_NOT_SOLVED;
1793  bool enable_deep_serialization_ = true;
1794 
1795  // Search data
1796  std::vector<DecisionBuilder*> first_solution_decision_builders_;
1797  std::vector<IntVarFilteredDecisionBuilder*>
1798  first_solution_filtered_decision_builders_;
1799  Solver::IndexEvaluator2 first_solution_evaluator_;
1800  FirstSolutionStrategy::Value automatic_first_solution_strategy_ =
1801  FirstSolutionStrategy::UNSET;
1802  std::vector<LocalSearchOperator*> local_search_operators_;
1803  std::vector<SearchMonitor*> monitors_;
1804  SolutionCollector* collect_assignments_ = nullptr;
1805  SolutionCollector* collect_one_assignment_ = nullptr;
1806  SolutionCollector* packed_dimensions_assignment_collector_ = nullptr;
1807  DecisionBuilder* solve_db_ = nullptr;
1808  DecisionBuilder* improve_db_ = nullptr;
1809  DecisionBuilder* restore_assignment_ = nullptr;
1810  DecisionBuilder* restore_tmp_assignment_ = nullptr;
1811  Assignment* assignment_ = nullptr;
1812  Assignment* preassignment_ = nullptr;
1813  Assignment* tmp_assignment_ = nullptr;
1814  std::vector<IntVar*> extra_vars_;
1815  std::vector<IntervalVar*> extra_intervals_;
1816  std::vector<LocalSearchOperator*> extra_operators_;
1817  LocalSearchFilterManager* local_search_filter_manager_ = nullptr;
1818  LocalSearchFilterManager* feasibility_filter_manager_ = nullptr;
1819  LocalSearchFilterManager* strong_feasibility_filter_manager_ = nullptr;
1820  std::vector<LocalSearchFilter*> extra_filters_;
1821 #ifndef SWIG
1822  std::vector<std::pair<IntVar*, int64>> finalizer_variable_cost_pairs_;
1823  std::vector<std::pair<IntVar*, int64>> finalizer_variable_target_pairs_;
1824  absl::flat_hash_map<IntVar*, int> finalizer_variable_cost_index_;
1825  absl::flat_hash_set<IntVar*> finalizer_variable_target_set_;
1826  std::unique_ptr<SweepArranger> sweep_arranger_;
1827 #endif
1828 
1829  RegularLimit* limit_ = nullptr;
1830  RegularLimit* ls_limit_ = nullptr;
1831  RegularLimit* lns_limit_ = nullptr;
1832  RegularLimit* first_solution_lns_limit_ = nullptr;
1833 
1834  typedef std::pair<int64, int64> CacheKey;
1835  typedef absl::flat_hash_map<CacheKey, int64> TransitCallbackCache;
1836  typedef absl::flat_hash_map<CacheKey, StateDependentTransit>
1837  StateDependentTransitCallbackCache;
1838 
1839  std::vector<TransitCallback1> unary_transit_evaluators_;
1840  std::vector<TransitCallback2> transit_evaluators_;
1841  // The following vector stores a boolean per transit_evaluator_, indicating
1842  // whether the transits are all positive.
1843  // is_transit_evaluator_positive_ will be set to true only when registering a
1844  // callback via RegisterPositiveTransitCallback(), and to false otherwise.
1845  // The actual positivity of the transit values will only be checked in debug
1846  // mode, when calling RegisterPositiveTransitCallback().
1847  // Therefore, RegisterPositiveTransitCallback() should only be called when the
1848  // transits are known to be positive, as the positivity of a callback will
1849  // allow some improvements in the solver, but will entail in errors if the
1850  // transits are falsely assumed positive.
1851  std::vector<bool> is_transit_evaluator_positive_;
1852  std::vector<VariableIndexEvaluator2> state_dependent_transit_evaluators_;
1853  std::vector<std::unique_ptr<StateDependentTransitCallbackCache>>
1854  state_dependent_transit_evaluators_cache_;
1855 
1856  friend class RoutingDimension;
1858 
1860 };
1861 
1863 class RoutingModelVisitor : public BaseObject {
1864  public:
1866  static const char kLightElement[];
1867  static const char kLightElement2[];
1868  static const char kRemoveValues[];
1869 };
1870 
1871 #if !defined(SWIG)
1872 class DisjunctivePropagator {
1875  public:
1881  struct Tasks {
1883  std::vector<int64> start_min;
1884  std::vector<int64> start_max;
1885  std::vector<int64> duration_min;
1886  std::vector<int64> duration_max;
1887  std::vector<int64> end_min;
1888  std::vector<int64> end_max;
1889  std::vector<bool> is_preemptible;
1890  std::vector<const SortedDisjointIntervalList*> forbidden_intervals;
1891  std::vector<std::pair<int64, int64>> distance_duration;
1894 
1895  void Clear() {
1896  start_min.clear();
1897  start_max.clear();
1898  duration_min.clear();
1899  duration_max.clear();
1900  end_min.clear();
1901  end_max.clear();
1902  is_preemptible.clear();
1903  forbidden_intervals.clear();
1904  distance_duration.clear();
1905  span_min = 0;
1906  span_max = kint64max;
1907  num_chain_tasks = 0;
1908  }
1909  };
1910 
1913  bool Propagate(Tasks* tasks);
1914 
1916  bool Precedences(Tasks* tasks);
1919  bool MirrorTasks(Tasks* tasks);
1921  bool EdgeFinding(Tasks* tasks);
1924  bool DetectablePrecedencesWithChain(Tasks* tasks);
1926  bool ForbiddenIntervals(Tasks* tasks);
1928  bool DistanceDuration(Tasks* tasks);
1931  bool ChainSpanMin(Tasks* tasks);
1936  bool ChainSpanMinDynamic(Tasks* tasks);
1937 
1938  private:
1941  sat::ThetaLambdaTree<int64> theta_lambda_tree_;
1943  std::vector<int> tasks_by_start_min_;
1944  std::vector<int> tasks_by_end_max_;
1945  std::vector<int> event_of_task_;
1946  std::vector<int> nonchain_tasks_by_start_max_;
1948  std::vector<int64> total_duration_before_;
1949 };
1950 
1952  std::vector<int64> min_travels;
1953  std::vector<int64> max_travels;
1954  std::vector<int64> pre_travels;
1955  std::vector<int64> post_travels;
1956 };
1957 
1958 void AppendTasksFromPath(const std::vector<int64>& path,
1959  const TravelBounds& travel_bounds,
1960  const RoutingDimension& dimension,
1962 void AppendTasksFromIntervals(const std::vector<IntervalVar*>& intervals,
1964 void FillPathEvaluation(const std::vector<int64>& path,
1965  const RoutingModel::TransitCallback2& evaluator,
1966  std::vector<int64>* values);
1967 void FillTravelBoundsOfVehicle(int vehicle, const std::vector<int64>& path,
1968  const RoutingDimension& dimension,
1969  TravelBounds* travel_bounds);
1970 #endif // !defined(SWIG)
1971 
1982 class GlobalVehicleBreaksConstraint : public Constraint {
1983  public:
1984  explicit GlobalVehicleBreaksConstraint(const RoutingDimension* dimension);
1985  std::string DebugString() const override {
1986  return "GlobalVehicleBreaksConstraint";
1987  }
1988 
1989  void Post() override;
1990  void InitialPropagate() override;
1991 
1992  private:
1993  void PropagateNode(int node);
1994  void PropagateVehicle(int vehicle);
1995  void PropagateMaxBreakDistance(int vehicle);
1996 
1997  const RoutingModel* model_;
1998  const RoutingDimension* const dimension_;
1999  std::vector<Demon*> vehicle_demons_;
2000  std::vector<int64> path_;
2001 
2006  void FillPartialPathOfVehicle(int vehicle);
2007  void FillPathTravels(const std::vector<int64>& path);
2008 
2019  class TaskTranslator {
2020  public:
2021  TaskTranslator(IntVar* start, int64 before_start, int64 after_start)
2022  : start_(start),
2023  before_start_(before_start),
2024  after_start_(after_start) {}
2025  explicit TaskTranslator(IntervalVar* interval) : interval_(interval) {}
2026  TaskTranslator() {}
2027 
2028  void SetStartMin(int64 value) {
2029  if (start_ != nullptr) {
2030  start_->SetMin(CapAdd(before_start_, value));
2031  } else if (interval_ != nullptr) {
2032  interval_->SetStartMin(value);
2033  }
2034  }
2035  void SetStartMax(int64 value) {
2036  if (start_ != nullptr) {
2037  start_->SetMax(CapAdd(before_start_, value));
2038  } else if (interval_ != nullptr) {
2039  interval_->SetStartMax(value);
2040  }
2041  }
2042  void SetDurationMin(int64 value) {
2043  if (interval_ != nullptr) {
2044  interval_->SetDurationMin(value);
2045  }
2046  }
2047  void SetEndMin(int64 value) {
2048  if (start_ != nullptr) {
2049  start_->SetMin(CapSub(value, after_start_));
2050  } else if (interval_ != nullptr) {
2051  interval_->SetEndMin(value);
2052  }
2053  }
2054  void SetEndMax(int64 value) {
2055  if (start_ != nullptr) {
2056  start_->SetMax(CapSub(value, after_start_));
2057  } else if (interval_ != nullptr) {
2058  interval_->SetEndMax(value);
2059  }
2060  }
2061 
2062  private:
2063  IntVar* start_ = nullptr;
2064  int64 before_start_;
2065  int64 after_start_;
2066  IntervalVar* interval_ = nullptr;
2067  };
2068 
2070  std::vector<TaskTranslator> task_translators_;
2071 
2073  DisjunctivePropagator disjunctive_propagator_;
2074  DisjunctivePropagator::Tasks tasks_;
2075 
2077  TravelBounds travel_bounds_;
2078 };
2079 
2081  public:
2082  explicit TypeRegulationsChecker(const RoutingModel& model);
2084 
2085  bool CheckVehicle(int vehicle,
2086  const std::function<int64(int64)>& next_accessor);
2087 
2088  protected:
2089 #ifndef SWIG
2091 #endif // SWIG
2092 
2109  };
2110 
2115  bool TypeOccursOnRoute(int type) const;
2122  bool TypeCurrentlyOnRoute(int type, int pos) const;
2123 
2124  void InitializeCheck(int vehicle,
2125  const std::function<int64(int64)>& next_accessor);
2126  virtual void OnInitializeCheck() {}
2127  virtual bool HasRegulationsToCheck() const = 0;
2128  virtual bool CheckTypeRegulations(int type, VisitTypePolicy policy,
2129  int pos) = 0;
2130  virtual bool FinalizeCheck() const { return true; }
2131 
2133 
2134  private:
2135  std::vector<TypePolicyOccurrence> occurrences_of_type_;
2136  std::vector<int64> current_route_visits_;
2137 };
2138 
2141  public:
2143  bool check_hard_incompatibilities);
2145 
2146  private:
2147  bool HasRegulationsToCheck() const override;
2148  bool CheckTypeRegulations(int type, VisitTypePolicy policy, int pos) override;
2152  bool check_hard_incompatibilities_;
2153 };
2154 
2157  public:
2161 
2162  private:
2163  bool HasRegulationsToCheck() const override;
2164  void OnInitializeCheck() override {
2165  types_with_same_vehicle_requirements_on_route_.clear();
2166  }
2167  // clang-format off
2170  bool CheckRequiredTypesCurrentlyOnRoute(
2171  const std::vector<absl::flat_hash_set<int> >& required_type_alternatives,
2172  int pos);
2173  // clang-format on
2174  bool CheckTypeRegulations(int type, VisitTypePolicy policy, int pos) override;
2175  bool FinalizeCheck() const override;
2176 
2177  absl::flat_hash_set<int> types_with_same_vehicle_requirements_on_route_;
2178 };
2179 
2220 class TypeRegulationsConstraint : public Constraint {
2221  public:
2222  explicit TypeRegulationsConstraint(const RoutingModel& model);
2223 
2224  void Post() override;
2225  void InitialPropagate() override;
2226 
2227  private:
2228  void PropagateNodeRegulations(int node);
2229  void CheckRegulationsOnVehicle(int vehicle);
2230 
2231  const RoutingModel& model_;
2232  TypeIncompatibilityChecker incompatibility_checker_;
2233  TypeRequirementChecker requirement_checker_;
2234  std::vector<Demon*> vehicle_demons_;
2235 };
2236 #if !defined SWIG
2237 class SimpleBoundCosts {
2250  public:
2251  struct BoundCost {
2254  };
2255  SimpleBoundCosts(int num_bounds, BoundCost default_bound_cost)
2256  : bound_costs_(num_bounds, default_bound_cost) {}
2257  BoundCost& bound_cost(int element) { return bound_costs_[element]; }
2258  BoundCost bound_cost(int element) const { return bound_costs_[element]; }
2259  int Size() { return bound_costs_.size(); }
2262 
2263  private:
2264  std::vector<BoundCost> bound_costs_;
2265 };
2266 #endif // !defined SWIG
2267 
2285 // TODO(user): Break constraints need to know the service time of nodes
2289  public:
2292  RoutingModel* model() const { return model_; }
2296  int64 GetTransitValue(int64 from_index, int64 to_index, int64 vehicle) const;
2300  int64 vehicle_class) const {
2301  return model_->TransitCallback(class_evaluators_[vehicle_class])(from_index,
2302  to_index);
2303  }
2306  IntVar* CumulVar(int64 index) const { return cumuls_[index]; }
2307  IntVar* TransitVar(int64 index) const { return transits_[index]; }
2308  IntVar* FixedTransitVar(int64 index) const { return fixed_transits_[index]; }
2309  IntVar* SlackVar(int64 index) const { return slacks_[index]; }
2310 
2311 #if !defined(SWIGPYTHON)
2312  const std::vector<IntVar*>& cumuls() const { return cumuls_; }
2315  const std::vector<IntVar*>& fixed_transits() const { return fixed_transits_; }
2316  const std::vector<IntVar*>& transits() const { return transits_; }
2317  const std::vector<IntVar*>& slacks() const { return slacks_; }
2318 #if !defined(SWIGCSHARP) && !defined(SWIGJAVA)
2319  const std::vector<SortedDisjointIntervalList>& forbidden_intervals() const {
2321  return forbidden_intervals_;
2322  }
2324  SortedDisjointIntervalList GetAllowedIntervalsInRange(int64 index,
2325  int64 min_value,
2326  int64 max_value) const;
2330  int64 min_value) const {
2331  DCHECK_LT(index, forbidden_intervals_.size());
2333  forbidden_intervals_[index];
2334  const auto first_forbidden_interval_it =
2335  forbidden_intervals.FirstIntervalGreaterOrEqual(min_value);
2336  if (first_forbidden_interval_it != forbidden_intervals.end() &&
2337  min_value >= first_forbidden_interval_it->start) {
2339  return CapAdd(first_forbidden_interval_it->end, 1);
2340  }
2342  return min_value;
2343  }
2349  int64 max_value) const {
2350  DCHECK_LT(index, forbidden_intervals_.size());
2352  forbidden_intervals_[index];
2353  const auto last_forbidden_interval_it =
2354  forbidden_intervals.LastIntervalLessOrEqual(max_value);
2355  if (last_forbidden_interval_it != forbidden_intervals.end() &&
2356  max_value <= last_forbidden_interval_it->end) {
2358  return CapSub(last_forbidden_interval_it->start, 1);
2359  }
2361  return max_value;
2362  }
2364  const std::vector<int64>& vehicle_capacities() const {
2365  return vehicle_capacities_;
2366  }
2370  return model_->TransitCallback(
2371  class_evaluators_[vehicle_to_class_[vehicle]]);
2372  }
2377  int vehicle) const {
2378  return model_->UnaryTransitCallbackOrNull(
2379  class_evaluators_[vehicle_to_class_[vehicle]]);
2380  }
2383  bool AreVehicleTransitsPositive(int vehicle) const {
2384  return model()->is_transit_evaluator_positive_
2385  [class_evaluators_[vehicle_to_class_[vehicle]]];
2386  }
2387  int vehicle_to_class(int vehicle) const { return vehicle_to_class_[vehicle]; }
2388 #endif
2389 #endif
2390  void SetSpanUpperBoundForVehicle(int64 upper_bound, int vehicle);
2409 
2410 #ifndef SWIG
2416  const PiecewiseLinearFunction& cost);
2423  int64 index) const;
2424 #endif
2425 
2434  void SetCumulVarSoftUpperBound(int64 index, int64 upper_bound,
2435  int64 coefficient);
2447 
2460  void SetCumulVarSoftLowerBound(int64 index, int64 lower_bound,
2461  int64 coefficient);
2488  // TODO(user): Remove if !defined when routing.i is repaired.
2489 #if !defined(SWIGPYTHON)
2490  void SetBreakIntervalsOfVehicle(std::vector<IntervalVar*> breaks, int vehicle,
2491  int pre_travel_evaluator,
2492  int post_travel_evaluator);
2493 #endif // !defined(SWIGPYTHON)
2494 
2496  void SetBreakIntervalsOfVehicle(std::vector<IntervalVar*> breaks, int vehicle,
2497  std::vector<int64> node_visit_transits);
2498 
2503  void SetBreakDistanceDurationOfVehicle(int64 distance, int64 duration,
2504  int vehicle);
2507  void InitializeBreaks();
2509  bool HasBreakConstraints() const;
2510 #if !defined(SWIGPYTHON)
2514  std::vector<IntervalVar*> breaks, int vehicle,
2515  std::vector<int64> node_visit_transits,
2516  std::function<int64(int64, int64)> group_delays);
2517 
2519  const std::vector<IntervalVar*>& GetBreakIntervalsOfVehicle(
2520  int vehicle) const;
2523  // clang-format off
2524  const std::vector<std::pair<int64, int64> >&
2525  GetBreakDistanceDurationOfVehicle(int vehicle) const;
2526  // clang-format on
2527 #endif
2528  int GetPreTravelEvaluatorOfVehicle(int vehicle) const;
2529  int GetPostTravelEvaluatorOfVehicle(int vehicle) const;
2530 
2532  const RoutingDimension* base_dimension() const { return base_dimension_; }
2540  int64 ShortestTransitionSlack(int64 node) const;
2541 
2543  const std::string& name() const { return name_; }
2544 
2546 #ifndef SWIG
2548  return path_precedence_graph_;
2549  }
2550 #endif // SWIG
2551 
2561  typedef std::function<int64(int, int)> PickupToDeliveryLimitFunction;
2562 
2564  PickupToDeliveryLimitFunction limit_function, int pair_index);
2565 
2566  bool HasPickupToDeliveryLimits() const;
2567 #ifndef SWIG
2568  int64 GetPickupToDeliveryLimitForPair(int pair_index, int pickup,
2569  int delivery) const;
2570 
2575  };
2576 
2578  node_precedences_.push_back(precedence);
2579  }
2580  const std::vector<NodePrecedence>& GetNodePrecedences() const {
2581  return node_precedences_;
2582  }
2583 #endif // SWIG
2584 
2585  void AddNodePrecedence(int64 first_node, int64 second_node, int64 offset) {
2586  AddNodePrecedence({first_node, second_node, offset});
2587  }
2588 
2589  int64 GetSpanUpperBoundForVehicle(int vehicle) const {
2590  return vehicle_span_upper_bounds_[vehicle];
2591  }
2592 #ifndef SWIG
2593  const std::vector<int64>& vehicle_span_upper_bounds() const {
2594  return vehicle_span_upper_bounds_;
2595  }
2596 #endif // SWIG
2598  return vehicle_span_cost_coefficients_[vehicle];
2599  }
2600 #ifndef SWIG
2601  const std::vector<int64>& vehicle_span_cost_coefficients() const {
2602  return vehicle_span_cost_coefficients_;
2603  }
2604 #endif // SWIG
2606  return global_span_cost_coefficient_;
2607  }
2608 
2610  DCHECK_GE(global_optimizer_offset_, 0);
2611  return global_optimizer_offset_;
2612  }
2614  if (vehicle >= local_optimizer_offset_for_vehicle_.size()) {
2615  return 0;
2616  }
2617  DCHECK_GE(local_optimizer_offset_for_vehicle_[vehicle], 0);
2618  return local_optimizer_offset_for_vehicle_[vehicle];
2619  }
2620 #if !defined SWIG
2624  int vehicle) {
2625  if (!HasSoftSpanUpperBounds()) {
2626  vehicle_soft_span_upper_bound_ = absl::make_unique<SimpleBoundCosts>(
2627  model_->vehicles(), SimpleBoundCosts::BoundCost{kint64max, 0});
2628  }
2629  vehicle_soft_span_upper_bound_->bound_cost(vehicle) = bound_cost;
2630  }
2631  bool HasSoftSpanUpperBounds() const {
2632  return vehicle_soft_span_upper_bound_ != nullptr;
2633  }
2635  int vehicle) const {
2636  DCHECK(HasSoftSpanUpperBounds());
2637  return vehicle_soft_span_upper_bound_->bound_cost(vehicle);
2638  }
2642  SimpleBoundCosts::BoundCost bound_cost, int vehicle) {
2644  vehicle_quadratic_cost_soft_span_upper_bound_ =
2645  absl::make_unique<SimpleBoundCosts>(
2646  model_->vehicles(), SimpleBoundCosts::BoundCost{kint64max, 0});
2647  }
2648  vehicle_quadratic_cost_soft_span_upper_bound_->bound_cost(vehicle) =
2649  bound_cost;
2650  }
2652  return vehicle_quadratic_cost_soft_span_upper_bound_ != nullptr;
2653  }
2655  int vehicle) const {
2657  return vehicle_quadratic_cost_soft_span_upper_bound_->bound_cost(vehicle);
2658  }
2659 #endif
2660 
2661  private:
2662  struct SoftBound {
2663  IntVar* var;
2664  int64 bound;
2666  };
2667 
2668  struct PiecewiseLinearCost {
2669  PiecewiseLinearCost() : var(nullptr), cost(nullptr) {}
2670  IntVar* var;
2671  std::unique_ptr<PiecewiseLinearFunction> cost;
2672  };
2673 
2674  class SelfBased {};
2675  RoutingDimension(RoutingModel* model, std::vector<int64> vehicle_capacities,
2676  const std::string& name,
2677  const RoutingDimension* base_dimension);
2678  RoutingDimension(RoutingModel* model, std::vector<int64> vehicle_capacities,
2679  const std::string& name, SelfBased);
2680  void Initialize(const std::vector<int>& transit_evaluators,
2681  const std::vector<int>& state_dependent_transit_evaluators,
2682  int64 slack_max);
2683  void InitializeCumuls();
2684  void InitializeTransits(
2685  const std::vector<int>& transit_evaluators,
2686  const std::vector<int>& state_dependent_transit_evaluators,
2687  int64 slack_max);
2688  void InitializeTransitVariables(int64 slack_max);
2690  void SetupCumulVarSoftUpperBoundCosts(
2691  std::vector<IntVar*>* cost_elements) const;
2693  void SetupCumulVarSoftLowerBoundCosts(
2694  std::vector<IntVar*>* cost_elements) const;
2695  void SetupCumulVarPiecewiseLinearCosts(
2696  std::vector<IntVar*>* cost_elements) const;
2699  void SetupGlobalSpanCost(std::vector<IntVar*>* cost_elements) const;
2700  void SetupSlackAndDependentTransitCosts() const;
2702  void CloseModel(bool use_light_propagation);
2703 
2704  void SetOffsetForGlobalOptimizer(int64 offset) {
2705  global_optimizer_offset_ = std::max(Zero(), offset);
2706  }
2708  void SetVehicleOffsetsForLocalOptimizer(std::vector<int64> offsets) {
2710  std::transform(offsets.begin(), offsets.end(), offsets.begin(),
2711  [](int64 offset) { return std::max(Zero(), offset); });
2712  local_optimizer_offset_for_vehicle_ = std::move(offsets);
2713  }
2714 
2715  std::vector<IntVar*> cumuls_;
2716  std::vector<SortedDisjointIntervalList> forbidden_intervals_;
2717  std::vector<IntVar*> capacity_vars_;
2718  const std::vector<int64> vehicle_capacities_;
2719  std::vector<IntVar*> transits_;
2720  std::vector<IntVar*> fixed_transits_;
2723  std::vector<int> class_evaluators_;
2724  std::vector<int64> vehicle_to_class_;
2725 #ifndef SWIG
2726  ReverseArcListGraph<int, int> path_precedence_graph_;
2727 #endif
2728  // For every {first_node, second_node, offset} element in node_precedences_,
2729  // if both first_node and second_node are performed, then
2730  // cumuls_[second_node] must be greater than (or equal to)
2731  // cumuls_[first_node] + offset.
2732  std::vector<NodePrecedence> node_precedences_;
2733 
2734  // The transits of a dimension may depend on its cumuls or the cumuls of
2735  // another dimension. There can be no cycles, except for self loops, a
2736  // typical example for this is a time dimension.
2737  const RoutingDimension* const base_dimension_;
2738 
2739  // Values in state_dependent_class_evaluators_ correspond to the evaluators
2740  // in RoutingModel::state_dependent_transit_evaluators_ for each vehicle
2741  // class.
2742  std::vector<int> state_dependent_class_evaluators_;
2743  std::vector<int64> state_dependent_vehicle_to_class_;
2744 
2745  // For each pickup/delivery pair_index for which limits have been set,
2746  // pickup_to_delivery_limits_per_pair_index_[pair_index] contains the
2747  // PickupToDeliveryLimitFunction for the pickup and deliveries in this pair.
2748  std::vector<PickupToDeliveryLimitFunction>
2749  pickup_to_delivery_limits_per_pair_index_;
2750 
2751  // Used if some vehicle has breaks in this dimension, typically time.
2752  bool break_constraints_are_initialized_ = false;
2753  // clang-format off
2754  std::vector<std::vector<IntervalVar*> > vehicle_break_intervals_;
2755  std::vector<std::vector<std::pair<int64, int64> > >
2756  vehicle_break_distance_duration_;
2757  // clang-format on
2758  // For each vehicle, stores the part of travel that is made directly
2759  // after (before) the departure (arrival) node of the travel.
2760  // These parts of the travel are non-interruptible, in particular by a break.
2761  std::vector<int> vehicle_pre_travel_evaluators_;
2762  std::vector<int> vehicle_post_travel_evaluators_;
2763 
2764  std::vector<IntVar*> slacks_;
2765  std::vector<IntVar*> dependent_transits_;
2766  std::vector<int64> vehicle_span_upper_bounds_;
2767  int64 global_span_cost_coefficient_;
2768  std::vector<int64> vehicle_span_cost_coefficients_;
2769  std::vector<SoftBound> cumul_var_soft_upper_bound_;
2770  std::vector<SoftBound> cumul_var_soft_lower_bound_;
2771  std::vector<PiecewiseLinearCost> cumul_var_piecewise_linear_cost_;
2772  RoutingModel* const model_;
2773  const std::string name_;
2774  int64 global_optimizer_offset_;
2775  std::vector<int64> local_optimizer_offset_for_vehicle_;
2777  std::unique_ptr<SimpleBoundCosts> vehicle_soft_span_upper_bound_;
2778  std::unique_ptr<SimpleBoundCosts>
2779  vehicle_quadratic_cost_soft_span_upper_bound_;
2780  friend class RoutingModel;
2782 
2784 };
2785 
2786 #ifndef SWIG
2787 class SweepArranger {
2790  public:
2791  explicit SweepArranger(const std::vector<std::pair<int64, int64>>& points);
2792  virtual ~SweepArranger() {}
2793  void ArrangeIndices(std::vector<int64>* indices);
2794  void SetSectors(int sectors) { sectors_ = sectors; }
2795 
2796  private:
2797  std::vector<int> coordinates_;
2798  int sectors_;
2799 
2800  DISALLOW_COPY_AND_ASSIGN(SweepArranger);
2801 };
2802 #endif
2803 
2806 DecisionBuilder* MakeSetValuesFromTargets(Solver* solver,
2807  std::vector<IntVar*> variables,
2808  std::vector<int64> targets);
2809 
2810 #ifndef SWIG
2811 // Helper class that stores vehicles by their type. Two vehicles have the same
2812 // "vehicle type" iff they have the same cost class and start/end nodes.
2814  public:
2816  const RoutingModel::VehicleTypeContainer& vehicle_type_container)
2817  : vehicle_type_container_(&vehicle_type_container) {}
2818 
2819  int NumTypes() const { return vehicle_type_container_->NumTypes(); }
2820 
2821  int Type(int vehicle) const { return vehicle_type_container_->Type(vehicle); }
2822 
2823  void Reset() {
2824  sorted_vehicle_classes_per_type_ =
2825  vehicle_type_container_->sorted_vehicle_classes_per_type;
2826  const std::vector<std::deque<int>>& vehicles_per_class =
2827  vehicle_type_container_->vehicles_per_vehicle_class;
2828  vehicles_per_vehicle_class_.resize(vehicles_per_class.size());
2829  for (int i = 0; i < vehicles_per_vehicle_class_.size(); i++) {
2830  vehicles_per_vehicle_class_[i].resize(vehicles_per_class[i].size());
2831  std::copy(vehicles_per_class[i].begin(), vehicles_per_class[i].end(),
2832  vehicles_per_vehicle_class_[i].begin());
2833  }
2834  }
2835 
2836  int GetVehicleOfType(int type) const {
2837  DCHECK_LT(type, NumTypes());
2838  const std::set<VehicleClassEntry>& vehicle_classes =
2839  sorted_vehicle_classes_per_type_[type];
2840  if (vehicle_classes.empty()) {
2841  return -1;
2842  }
2843  const int vehicle_class = (vehicle_classes.begin())->vehicle_class;
2844  DCHECK(!vehicles_per_vehicle_class_[vehicle_class].empty());
2845  return vehicles_per_vehicle_class_[vehicle_class][0];
2846  }
2847 
2848  void ReinjectVehicleOfClass(int vehicle, int vehicle_class,
2849  int64 fixed_cost) {
2850  std::vector<int>& vehicles = vehicles_per_vehicle_class_[vehicle_class];
2851  if (vehicles.empty()) {
2852  // Add the vehicle class entry to the set (it was removed when
2853  // vehicles_per_vehicle_class_[vehicle_class] got empty).
2854  std::set<VehicleClassEntry>& vehicle_classes =
2855  sorted_vehicle_classes_per_type_[Type(vehicle)];
2856  const auto& insertion =
2857  vehicle_classes.insert({vehicle_class, fixed_cost});
2858  DCHECK(insertion.second);
2859  }
2860  vehicles.push_back(vehicle);
2861  }
2862 
2863  // Searches for the best compatible vehicle of the given type, i.e. the first
2864  // vehicle v of type 'type' for which vehicle_is_compatible(v) returns true.
2865  // If a compatible vehicle is found, its index is removed from
2866  // vehicles_per_vehicle_class_ and returned.
2867  // Returns -1 otherwise.
2869  int type, std::function<bool(int)> vehicle_is_compatible);
2870 
2871  private:
2872  using VehicleClassEntry =
2874  const RoutingModel::VehicleTypeContainer* const vehicle_type_container_;
2875  // clang-format off
2876  std::vector<std::set<VehicleClassEntry> > sorted_vehicle_classes_per_type_;
2877  std::vector<std::vector<int> > vehicles_per_vehicle_class_;
2878  // clang-format on
2879 };
2880 
2893 
2895 // TODO(user): Eventually move this to the core CP solver library
2897 class IntVarFilteredDecisionBuilder : public DecisionBuilder {
2898  public:
2900  std::unique_ptr<IntVarFilteredHeuristic> heuristic);
2901 
2903 
2904  Decision* Next(Solver* solver) override;
2905 
2906  std::string DebugString() const override;
2907 
2909  int64 number_of_decisions() const;
2910  int64 number_of_rejects() const;
2911 
2912  private:
2913  const std::unique_ptr<IntVarFilteredHeuristic> heuristic_;
2914 };
2915 
2918  public:
2919  IntVarFilteredHeuristic(Solver* solver, const std::vector<IntVar*>& vars,
2920  LocalSearchFilterManager* filter_manager);
2921 
2923 
2926  Assignment* const BuildSolution();
2927 
2930  int64 number_of_decisions() const { return number_of_decisions_; }
2931  int64 number_of_rejects() const { return number_of_rejects_; }
2932 
2933  virtual std::string DebugString() const { return "IntVarFilteredHeuristic"; }
2934 
2935  protected:
2937  void ResetSolution();
2939  virtual bool InitializeSolution() { return true; }
2941  virtual bool BuildSolutionInternal() = 0;
2945  bool Commit();
2947  virtual bool StopSearch() { return false; }
2951  if (!is_in_delta_[index]) {
2952  delta_->FastAdd(vars_[index])->SetValue(value);
2953  delta_indices_.push_back(index);
2954  is_in_delta_[index] = true;
2955  } else {
2956  delta_->SetValue(vars_[index], value);
2957  }
2958  }
2962  return assignment_->IntVarContainer().Element(index).Value();
2963  }
2965  bool Contains(int64 index) const {
2966  return assignment_->IntVarContainer().Element(index).Var() != nullptr;
2967  }
2970  int Size() const { return vars_.size(); }
2972  IntVar* Var(int64 index) const { return vars_[index]; }
2974  void SynchronizeFilters();
2975 
2976  Assignment* const assignment_;
2977 
2978  private:
2981  bool FilterAccept();
2982 
2983  Solver* solver_;
2984  const std::vector<IntVar*> vars_;
2985  Assignment* const delta_;
2986  std::vector<int> delta_indices_;
2987  std::vector<bool> is_in_delta_;
2988  Assignment* const empty_;
2989  LocalSearchFilterManager* filter_manager_;
2991  int64 number_of_decisions_;
2992  int64 number_of_rejects_;
2993 };
2994 
2997  public:
2999  LocalSearchFilterManager* filter_manager);
3002  const Assignment* BuildSolutionFromRoutes(
3003  const std::function<int64(int64)>& next_accessor);
3004  RoutingModel* model() const { return model_; }
3006  int GetStartChainEnd(int vehicle) const { return start_chain_ends_[vehicle]; }
3008  int GetEndChainStart(int vehicle) const { return end_chain_starts_[vehicle]; }
3014 
3015  protected:
3016  bool StopSearch() override { return model_->CheckLimit(); }
3017  virtual void SetVehicleIndex(int64 node, int vehicle) {}
3018  virtual void ResetVehicleIndices() {}
3019 
3020  private:
3022  bool InitializeSolution() override;
3023 
3024  RoutingModel* const model_;
3025  std::vector<int64> start_chain_ends_;
3026  std::vector<int64> end_chain_starts_;
3027 };
3028 
3030  public:
3033  RoutingModel* model, std::function<int64(int64, int64, int64)> evaluator,
3034  std::function<int64(int64)> penalty_evaluator,
3035  LocalSearchFilterManager* filter_manager);
3037 
3038  protected:
3039  typedef std::pair<int64, int64> ValuedPosition;
3040  struct StartEndValue {
3042  int vehicle;
3043 
3044  bool operator<(const StartEndValue& other) const {
3045  return std::tie(distance, vehicle) <
3046  std::tie(other.distance, other.vehicle);
3047  }
3048  };
3049  typedef std::pair<StartEndValue, /*seed_node*/ int> Seed;
3050 
3056  // clang-format off
3057  std::vector<std::vector<StartEndValue> >
3058  ComputeStartEndDistanceForVehicles(const std::vector<int>& vehicles);
3059 
3064  template <class Queue>
3066  std::vector<std::vector<StartEndValue> >* start_end_distances_per_node,
3067  Queue* priority_queue);
3068  // clang-format on
3069 
3074  void InsertBetween(int64 node, int64 predecessor, int64 successor);
3080  int64 node_to_insert, int64 start, int64 next_after_start, int64 vehicle,
3081  std::vector<ValuedPosition>* valued_positions);
3087  int64 insert_after,
3088  int64 insert_before,
3089  int vehicle) const;
3092  int64 GetUnperformedValue(int64 node_to_insert) const;
3093 
3094  std::function<int64(int64, int64, int64)> evaluator_;
3095  std::function<int64(int64)> penalty_evaluator_;
3096 };
3097 
3107  public:
3121  };
3122 
3125  RoutingModel* model, std::function<int64(int64, int64, int64)> evaluator,
3126  std::function<int64(int64)> penalty_evaluator,
3127  LocalSearchFilterManager* filter_manager,
3130  bool BuildSolutionInternal() override;
3131  std::string DebugString() const override {
3132  return "GlobalCheapestInsertionFilteredHeuristic";
3133  }
3134 
3135  private:
3136  class PairEntry;
3137  class NodeEntry;
3138  typedef absl::flat_hash_set<PairEntry*> PairEntries;
3139  typedef absl::flat_hash_set<NodeEntry*> NodeEntries;
3140 
3148  void InsertNodesByRequirementTopologicalOrder();
3149 
3156  void InsertPairs();
3157 
3165  void InsertNodesOnRoutes(const std::vector<int>& nodes,
3166  const absl::flat_hash_set<int>& vehicles);
3167 
3173  void SequentialInsertNodes(const std::vector<int>& nodes);
3174 
3178  void DetectUsedVehicles(std::vector<bool>* is_vehicle_used,
3179  std::vector<int>* unused_vehicles,
3180  absl::flat_hash_set<int>* used_vehicles);
3181 
3185  void InsertFarthestNodesAsSeeds();
3186 
3195  template <class Queue>
3196  int InsertSeedNode(
3197  std::vector<std::vector<StartEndValue>>* start_end_distances_per_node,
3198  Queue* priority_queue, std::vector<bool>* is_vehicle_used);
3199  // clang-format on
3200 
3203  void InitializePairPositions(
3204  AdjustablePriorityQueue<PairEntry>* priority_queue,
3205  std::vector<PairEntries>* pickup_to_entries,
3206  std::vector<PairEntries>* delivery_to_entries);
3212  void InitializeInsertionEntriesPerformingPair(
3213  int64 pickup, int64 delivery, int64 penalty,
3214  AdjustablePriorityQueue<PairEntry>* priority_queue,
3215  std::vector<PairEntries>* pickup_to_entries,
3216  std::vector<PairEntries>* delivery_to_entries);
3219  void UpdatePairPositions(int vehicle, int64 insert_after,
3220  AdjustablePriorityQueue<PairEntry>* priority_queue,
3221  std::vector<PairEntries>* pickup_to_entries,
3222  std::vector<PairEntries>* delivery_to_entries) {
3223  UpdatePickupPositions(vehicle, insert_after, priority_queue,
3224  pickup_to_entries, delivery_to_entries);
3225  UpdateDeliveryPositions(vehicle, insert_after, priority_queue,
3226  pickup_to_entries, delivery_to_entries);
3227  }
3230  void UpdatePickupPositions(int vehicle, int64 pickup_insert_after,
3231  AdjustablePriorityQueue<PairEntry>* priority_queue,
3232  std::vector<PairEntries>* pickup_to_entries,
3233  std::vector<PairEntries>* delivery_to_entries);
3236  void UpdateDeliveryPositions(
3237  int vehicle, int64 delivery_insert_after,
3238  AdjustablePriorityQueue<PairEntry>* priority_queue,
3239  std::vector<PairEntries>* pickup_to_entries,
3240  std::vector<PairEntries>* delivery_to_entries);
3243  void DeletePairEntry(PairEntry* entry,
3244  AdjustablePriorityQueue<PairEntry>* priority_queue,
3245  std::vector<PairEntries>* pickup_to_entries,
3246  std::vector<PairEntries>* delivery_to_entries);
3249  void InitializePositions(const std::vector<int>& nodes,
3250  AdjustablePriorityQueue<NodeEntry>* priority_queue,
3251  std::vector<NodeEntries>* position_to_node_entries,
3252  const absl::flat_hash_set<int>& vehicles);
3258  void InitializeInsertionEntriesPerformingNode(
3259  int64 node, int64 penalty, const absl::flat_hash_set<int>& vehicles,
3260  AdjustablePriorityQueue<NodeEntry>* priority_queue,
3261  std::vector<NodeEntries>* position_to_node_entries);
3264  void UpdatePositions(const std::vector<int>& nodes, int vehicle,
3265  int64 insert_after,
3266  AdjustablePriorityQueue<NodeEntry>* priority_queue,
3267  std::vector<NodeEntries>* node_entries);
3270  void DeleteNodeEntry(NodeEntry* entry,
3271  AdjustablePriorityQueue<NodeEntry>* priority_queue,
3272  std::vector<NodeEntries>* node_entries);
3273 
3276  void ComputeNeighborhoods();
3277 
3282  void AddNeighborForCostClass(int cost_class, int64 node_index,
3283  int64 neighbor_index, bool neighbor_is_pickup,
3284  bool neighbor_is_delivery);
3285 
3288  bool IsNeighborForCostClass(int cost_class, int64 node_index,
3289  int64 neighbor_index) const;
3290 
3292  const std::vector<int64>& GetPickupNeighborsOfNodeForCostClass(
3293  int cost_class, int64 node_index) const {
3294  if (gci_params_.neighbors_ratio == 1) {
3295  return pickup_nodes_;
3296  }
3297  return node_index_to_pickup_neighbors_by_cost_class_[node_index][cost_class]
3298  ->PositionsSetAtLeastOnce();
3299  }
3300 
3302  const std::vector<int64>& GetDeliveryNeighborsOfNodeForCostClass(
3303  int cost_class, int64 node_index) const {
3304  if (gci_params_.neighbors_ratio == 1) {
3305  return delivery_nodes_;
3306  }
3307  return node_index_to_delivery_neighbors_by_cost_class_
3308  [node_index][cost_class]
3309  ->PositionsSetAtLeastOnce();
3310  }
3311 
3313  const std::vector<int64>& GetSingleNeighborsOfNodeForCostClass(
3314  int cost_class, int64 node_index) const {
3315  if (gci_params_.neighbors_ratio == 1) {
3316  return single_nodes_;
3317  }
3318  return node_index_to_single_neighbors_by_cost_class_[node_index][cost_class]
3319  ->PositionsSetAtLeastOnce();
3320  }
3321 
3323  std::vector<const std::vector<int64>*> GetNeighborsOfNodeForCostClass(
3324  int cost_class, int64 node_index) const {
3325  return {&GetSingleNeighborsOfNodeForCostClass(cost_class, node_index),
3326  &GetPickupNeighborsOfNodeForCostClass(cost_class, node_index),
3327  &GetDeliveryNeighborsOfNodeForCostClass(cost_class, node_index)};
3328  }
3329 
3330  void ResetVehicleIndices() override {
3331  node_index_to_vehicle_.assign(node_index_to_vehicle_.size(), -1);
3332  }
3333 
3334  void SetVehicleIndex(int64 node, int vehicle) override {
3335  DCHECK_LT(node, node_index_to_vehicle_.size());
3336  node_index_to_vehicle_[node] = vehicle;
3337  }
3338 
3341  bool CheckVehicleIndices() const;
3342 
3343  GlobalCheapestInsertionParameters gci_params_;
3345  std::vector<int> node_index_to_vehicle_;
3346 
3347  // clang-format off
3348  std::vector<std::vector<std::unique_ptr<SparseBitset<int64> > > >
3349  node_index_to_single_neighbors_by_cost_class_;
3350  std::vector<std::vector<std::unique_ptr<SparseBitset<int64> > > >
3351  node_index_to_pickup_neighbors_by_cost_class_;
3352  std::vector<std::vector<std::unique_ptr<SparseBitset<int64> > > >
3353  node_index_to_delivery_neighbors_by_cost_class_;
3354  // clang-format on
3355 
3359  std::vector<int64> single_nodes_;
3360  std::vector<int64> pickup_nodes_;
3361  std::vector<int64> delivery_nodes_;
3362 };
3363 
3371  public:
3374  RoutingModel* model, std::function<int64(int64, int64, int64)> evaluator,
3375  LocalSearchFilterManager* filter_manager);
3377  bool BuildSolutionInternal() override;
3378  std::string DebugString() const override {
3379  return "LocalCheapestInsertionFilteredHeuristic";
3380  }
3381 
3382  private:
3388  void ComputeEvaluatorSortedPositions(int64 node,
3389  std::vector<int64>* sorted_positions);
3394  void ComputeEvaluatorSortedPositionsOnRouteAfter(
3395  int64 node, int64 start, int64 next_after_start,
3396  std::vector<int64>* sorted_positions);
3397 
3398  std::vector<std::vector<StartEndValue>> start_end_distances_per_node_;
3399 };
3400 
3404  public:
3406  LocalSearchFilterManager* filter_manager);
3408  bool BuildSolutionInternal() override;
3409 
3410  private:
3411  class PartialRoutesAndLargeVehicleIndicesFirst {
3412  public:
3413  explicit PartialRoutesAndLargeVehicleIndicesFirst(
3414  const CheapestAdditionFilteredHeuristic& builder)
3415  : builder_(builder) {}
3416  bool operator()(int vehicle1, int vehicle2) const;
3417 
3418  private:
3419  const CheapestAdditionFilteredHeuristic& builder_;
3420  };
3422  template <typename Iterator>
3423  std::vector<int64> GetPossibleNextsFromIterator(int64 node, Iterator start,
3424  Iterator end) const {
3425  const int size = model()->Size();
3426  std::vector<int64> nexts;
3427  for (Iterator it = start; it != end; ++it) {
3428  const int64 next = *it;
3429  if (next != node && (next >= size || !Contains(next))) {
3430  nexts.push_back(next);
3431  }
3432  }
3433  return nexts;
3434  }
3436  virtual void SortSuccessors(int64 node, std::vector<int64>* successors) = 0;
3437  virtual int64 FindTopSuccessor(int64 node,
3438  const std::vector<int64>& successors) = 0;
3439 };
3440 
3445  public:
3448  RoutingModel* model, std::function<int64(int64, int64)> evaluator,
3449  LocalSearchFilterManager* filter_manager);
3451  std::string DebugString() const override {
3452  return "EvaluatorCheapestAdditionFilteredHeuristic";
3453  }
3454 
3455  private:
3457  void SortSuccessors(int64 node, std::vector<int64>* successors) override;
3458  int64 FindTopSuccessor(int64 node,
3459  const std::vector<int64>& successors) override;
3460 
3461  std::function<int64(int64, int64)> evaluator_;
3462 };
3463 
3468  public:
3471  RoutingModel* model, Solver::VariableValueComparator comparator,
3472  LocalSearchFilterManager* filter_manager);
3474  std::string DebugString() const override {
3475  return "ComparatorCheapestAdditionFilteredHeuristic";
3476  }
3477 
3478  private:
3480  void SortSuccessors(int64 node, std::vector<int64>* successors) override;
3481  int64 FindTopSuccessor(int64 node,
3482  const std::vector<int64>& successors) override;
3483 
3484  Solver::VariableValueComparator comparator_;
3485 };
3486 
3496  public:
3500  double neighbors_ratio = 1.0;
3506  bool add_reverse_arcs = false;
3509  double arc_coefficient = 1.0;
3510  };
3511 
3513  const RoutingIndexManager* manager,
3515  LocalSearchFilterManager* filter_manager);
3516  ~SavingsFilteredHeuristic() override;
3517  bool BuildSolutionInternal() override;
3518 
3519  protected:
3520  typedef std::pair</*saving*/ int64, /*saving index*/ int64> Saving;
3521 
3522  template <typename S>
3524 
3525  virtual double ExtraSavingsMemoryMultiplicativeFactor() const = 0;
3526 
3527  virtual void BuildRoutesFromSavings() = 0;
3528 
3530  int64 GetVehicleTypeFromSaving(const Saving& saving) const {
3531  return saving.second / size_squared_;
3532  }
3534  int64 GetBeforeNodeFromSaving(const Saving& saving) const {
3535  return (saving.second % size_squared_) / Size();
3536  }
3538  int64 GetAfterNodeFromSaving(const Saving& saving) const {
3539  return (saving.second % size_squared_) % Size();
3540  }
3542  int64 GetSavingValue(const Saving& saving) const { return saving.first; }
3543 
3553  int StartNewRouteWithBestVehicleOfType(int type, int64 before_node,
3554  int64 after_node);
3555 
3556  // clang-format off
3557  std::unique_ptr<SavingsContainer<Saving> > savings_container_;
3558  // clang-format on
3559  std::unique_ptr<VehicleTypeCurator> vehicle_type_curator_;
3560 
3561  private:
3566  // clang-format off
3567  void AddSymmetricArcsToAdjacencyLists(
3568  std::vector<std::vector<int64> >* adjacency_lists);
3569  // clang-format on
3570 
3577  void ComputeSavings();
3579  Saving BuildSaving(int64 saving, int vehicle_type, int before_node,
3580  int after_node) const {
3581  return std::make_pair(saving, vehicle_type * size_squared_ +
3582  before_node * Size() + after_node);
3583  }
3584 
3588  int64 MaxNumNeighborsPerNode(int num_vehicle_types) const;
3589 
3590  const RoutingIndexManager* const manager_;
3591  const SavingsParameters savings_params_;
3592  int64 size_squared_;
3593 
3595 };
3596 
3598  public:
3600  const RoutingIndexManager* manager,
3602  LocalSearchFilterManager* filter_manager)
3603  : SavingsFilteredHeuristic(model, manager, parameters, filter_manager) {}
3605  std::string DebugString() const override {
3606  return "SequentialSavingsFilteredHeuristic";
3607  }
3608 
3609  private:
3614  void BuildRoutesFromSavings() override;
3615  double ExtraSavingsMemoryMultiplicativeFactor() const override { return 1.0; }
3616 };
3617 
3619  public:
3621  const RoutingIndexManager* manager,
3623  LocalSearchFilterManager* filter_manager)
3624  : SavingsFilteredHeuristic(model, manager, parameters, filter_manager) {}
3626  std::string DebugString() const override {
3627  return "ParallelSavingsFilteredHeuristic";
3628  }
3629 
3630  private:
3641  void BuildRoutesFromSavings() override;
3642 
3643  double ExtraSavingsMemoryMultiplicativeFactor() const override { return 2.0; }
3644 
3649  void MergeRoutes(int first_vehicle, int second_vehicle, int64 before_node,
3650  int64 after_node);
3651 
3653  std::vector<int64> first_node_on_route_;
3654  std::vector<int64> last_node_on_route_;
3658  std::vector<int> vehicle_of_first_or_last_node_;
3659 };
3660 
3664 
3666  public:
3668  LocalSearchFilterManager* filter_manager,
3669  bool use_minimum_matching);
3671  bool BuildSolutionInternal() override;
3672  std::string DebugString() const override {
3673  return "ChristofidesFilteredHeuristic";
3674  }
3675 
3676  private:
3677  const bool use_minimum_matching_;
3678 };
3679 #endif // SWIG
3680 
3685 bool SolveModelWithSat(const RoutingModel& model,
3686  const RoutingSearchParameters& search_parameters,
3687  const Assignment* initial_solution,
3688  Assignment* solution);
3689 
3691 
3693  public:
3694  BasePathFilter(const std::vector<IntVar*>& nexts, int next_domain_size);
3695  ~BasePathFilter() override {}
3696  bool Accept(const Assignment* delta, const Assignment* deltadelta,
3697  int64 objective_min, int64 objective_max) override;
3698  void OnSynchronize(const Assignment* delta) override;
3699 
3700  protected:
3701  static const int64 kUnassigned;
3702 
3703  int64 GetNext(int64 node) const {
3704  return (new_nexts_[node] == kUnassigned)
3705  ? (IsVarSynced(node) ? Value(node) : kUnassigned)
3706  : new_nexts_[node];
3707  }
3708  int NumPaths() const { return starts_.size(); }
3709  int64 Start(int i) const { return starts_[i]; }
3710  int GetPath(int64 node) const { return paths_[node]; }
3711  int Rank(int64 node) const { return ranks_[node]; }
3712  bool IsDisabled() const { return status_ == DISABLED; }
3713  const std::vector<int64>& GetTouchedPathStarts() const {
3714  return touched_paths_.PositionsSetAtLeastOnce();
3715  }
3716  const std::vector<int64>& GetNewSynchronizedUnperformedNodes() const {
3717  return new_synchronized_unperformed_nodes_.PositionsSetAtLeastOnce();
3718  }
3719 
3720  private:
3721  enum Status { UNKNOWN, ENABLED, DISABLED };
3722 
3723  virtual bool DisableFiltering() const { return false; }
3724  virtual void OnBeforeSynchronizePaths() {}
3725  virtual void OnAfterSynchronizePaths() {}
3726  virtual void OnSynchronizePathFromStart(int64 start) {}
3727  virtual void InitializeAcceptPath() {}
3728  virtual bool AcceptPath(int64 path_start, int64 chain_start,
3729  int64 chain_end) = 0;
3730  virtual bool FinalizeAcceptPath(const Assignment* delta, int64 objective_min,
3731  int64 objective_max) {
3732  return true;
3733  }
3735  void ComputePathStarts(std::vector<int64>* path_starts,
3736  std::vector<int>* index_to_path);
3737  bool HavePathsChanged();
3738  void SynchronizeFullAssignment();
3739  void UpdateAllRanks();
3740  void UpdatePathRanksFromStart(int start);
3741 
3742  std::vector<int64> node_path_starts_;
3743  std::vector<int64> starts_;
3744  std::vector<int> paths_;
3745  SparseBitset<int64> new_synchronized_unperformed_nodes_;
3746  std::vector<int64> new_nexts_;
3747  std::vector<int> delta_touched_;
3748  SparseBitset<> touched_paths_;
3749  SparseBitset<> touched_path_nodes_;
3750  std::vector<int> ranks_;
3751 
3752  Status status_;
3753 };
3754 
3759 // TODO(user): Also call the solution finalizer on variables, with the
3765 // TODO(user): Avoid such false negatives.
3767  public:
3768  explicit CPFeasibilityFilter(const RoutingModel* routing_model);
3769  ~CPFeasibilityFilter() override {}
3770  std::string DebugString() const override { return "CPFeasibilityFilter"; }
3771  bool Accept(const Assignment* delta, const Assignment* deltadelta,
3772  int64 objective_min, int64 objective_max) override;
3773  void OnSynchronize(const Assignment* delta) override;
3774 
3775  private:
3776  void AddDeltaToAssignment(const Assignment* delta, Assignment* assignment);
3777 
3778  static const int64 kUnassigned;
3779  const RoutingModel* const model_;
3780  Solver* const solver_;
3781  Assignment* const assignment_;
3782  Assignment* const temp_assignment_;
3783  DecisionBuilder* const restore_;
3784 };
3785 
3786 #if !defined(SWIG)
3787 IntVarLocalSearchFilter* MakeMaxActiveVehiclesFilter(
3788  const RoutingModel& routing_model);
3789 IntVarLocalSearchFilter* MakeNodeDisjunctionFilter(
3790  const RoutingModel& routing_model);
3791 IntVarLocalSearchFilter* MakeVehicleAmortizedCostFilter(
3792  const RoutingModel& routing_model);
3793 IntVarLocalSearchFilter* MakeTypeRegulationsFilter(
3794  const RoutingModel& routing_model);
3796  const std::vector<RoutingDimension*>& dimensions,
3797  const RoutingSearchParameters& parameters, bool filter_objective_cost,
3798  std::vector<LocalSearchFilter*>* filters);
3799 IntVarLocalSearchFilter* MakePathCumulFilter(
3800  const RoutingDimension& dimension,
3801  const RoutingSearchParameters& parameters,
3802  bool propagate_own_objective_value, bool filter_objective_cost,
3803  bool can_use_lp = true);
3804 IntVarLocalSearchFilter* MakeCumulBoundsPropagatorFilter(
3805  const RoutingDimension& dimension);
3806 IntVarLocalSearchFilter* MakeGlobalLPCumulFilter(
3807  GlobalDimensionCumulOptimizer* optimizer, bool filter_objective_cost);
3808 IntVarLocalSearchFilter* MakePickupDeliveryFilter(
3809  const RoutingModel& routing_model, const RoutingModel::IndexPairs& pairs,
3810  const std::vector<RoutingModel::PickupAndDeliveryPolicy>& vehicle_policies);
3811 IntVarLocalSearchFilter* MakeVehicleVarFilter(
3812  const RoutingModel& routing_model);
3813 IntVarLocalSearchFilter* MakeVehicleBreaksFilter(
3814  const RoutingModel& routing_model, const RoutingDimension& dimension);
3815 IntVarLocalSearchFilter* MakeCPFeasibilityFilter(
3816  const RoutingModel* routing_model);
3817 #endif
3818 
3819 } // namespace operations_research
3820 #endif // OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_H_
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:6556
operations_research::SavingsFilteredHeuristic::vehicle_type_curator_
std::unique_ptr< VehicleTypeCurator > vehicle_type_curator_
Definition: routing.h:3559
operations_research::RoutingModel::IndexPair
RoutingIndexPair IndexPair
Definition: routing.h:245
operations_research::IntVarFilteredHeuristic::InitializeSolution
virtual bool InitializeSolution()
Virtual method to initialize the solution.
Definition: routing.h:2939
operations_research::TypeIncompatibilityChecker::TypeIncompatibilityChecker
TypeIncompatibilityChecker(const RoutingModel &model, bool check_hard_incompatibilities)
Definition: routing.cc:6272
operations_research::ChristofidesFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3672
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:3956
operations_research::IntVarFilteredHeuristic
Generic filter-based heuristic applied to IntVars.
Definition: routing.h:2917
var
IntVar * var
Definition: expr_array.cc:1858
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:1802
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:4212
operations_research::RoutingModel::IsMatchingModel
bool IsMatchingModel() const
Returns true if a vehicle/node matching problem is detected.
Definition: routing_flow.cc:34
operations_research::ComparatorCheapestAdditionFilteredHeuristic::~ComparatorCheapestAdditionFilteredHeuristic
~ComparatorCheapestAdditionFilteredHeuristic() override
Definition: routing.h:3473
operations_research::RoutingDimension::AddNodePrecedence
void AddNodePrecedence(int64 first_node, int64 second_node, int64 offset)
Definition: routing.h:2585
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:6705
operations_research::RoutingDimension::NodePrecedence::first_node
int64 first_node
Definition: routing.h:2572
operations_research::RoutingModel::GetCostClassIndexOfVehicle
CostClassIndex GetCostClassIndexOfVehicle(int64 vehicle) const
Get the cost class index of the given vehicle.
Definition: routing.h:1226
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:2299
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::VehicleTypeCurator::Type
int Type(int vehicle) const
Definition: routing.h:2821
operations_research::TravelBounds::pre_travels
std::vector< int64 > pre_travels
Definition: routing.h:1954
operations_research::RoutingModel::PICKUP_AND_DELIVERY_NO_ORDER
@ PICKUP_AND_DELIVERY_NO_ORDER
Any precedence is accepted.
Definition: routing.h:230
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:5531
operations_research::RoutingDimension::vehicle_span_upper_bounds
const std::vector< int64 > & vehicle_span_upper_bounds() const
Definition: routing.h:2593
operations_research::BasePathFilter::GetTouchedPathStarts
const std::vector< int64 > & GetTouchedPathStarts() const
Definition: routing.h:3713
operations_research::CheapestInsertionFilteredHeuristic::StartEndValue::operator<
bool operator<(const StartEndValue &other) const
Definition: routing.h:3044
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:3639
operations_research::DisjunctivePropagator::Tasks::start_max
std::vector< int64 > start_max
Definition: routing.h:1884
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::RoutingModel::UnaryTransitCallbackOrNull
const TransitCallback1 & UnaryTransitCallbackOrNull(int callback_index) const
Definition: routing.h:410
operations_research::RoutingDimension::HasPickupToDeliveryLimits
bool HasPickupToDeliveryLimits() const
Definition: routing.cc:6916
operations_research::RoutingModel::solver
Solver * solver() const
Returns the underlying constraint solver.
Definition: routing.h:1299
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::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:4164
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:6822
operations_research::IntVarLocalSearchFilter::Value
int64 Value(int index) const
Definition: constraint_solveri.h:1835
routing_parameters.pb.h
operations_research::RoutingModel::ConsiderEmptyRouteCostsForVehicle
void ConsiderEmptyRouteCostsForVehicle(bool consider_costs, int vehicle)
Definition: routing.h:926
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:2348
operations_research::CapSub
int64 CapSub(int64 x, int64 y)
Definition: saturated_arithmetic.h:154
operations_research::RoutingModelVisitor::kLightElement
static const char kLightElement[]
Constraint types.
Definition: routing.h:1866
operations_research::RoutingDimension::model
RoutingModel * model() const
Returns the model on which the dimension was created.
Definition: routing.h:2292
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:5873
operations_research::CPFeasibilityFilter::DebugString
std::string DebugString() const override
Definition: routing.h:3770
operations_research::RoutingModel::HasTypeRegulations
bool HasTypeRegulations() const
Returns true iff the model has any incompatibilities or requirements set on node types.
Definition: routing.h:852
operations_research::RoutingDimension::GetPathPrecedenceGraph
const ReverseArcListGraph< int, int > & GetPathPrecedenceGraph() const
Accessors.
Definition: routing.h:2547
operations_research::RoutingModel::StateDependentTransit::transit_plus_identity
RangeMinMaxIndexFunction * transit_plus_identity
f(x)
Definition: routing.h:264
operations_research::CheapestInsertionFilteredHeuristic::ValuedPosition
std::pair< int64, int64 > ValuedPosition
Definition: routing.h:3039
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:3090
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:6593
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
util::ReverseArcListGraph
Definition: graph.h:460
operations_research::RoutingModel::AddIntervalToAssignment
void AddIntervalToAssignment(IntervalVar *const interval)
Definition: routing.cc:5556
max
int64 max
Definition: alldiff_cst.cc:139
operations_research::RoutingModel::RegisterPositiveUnaryTransitCallback
int RegisterPositiveUnaryTransitCallback(TransitCallback1 callback)
Definition: routing.cc:876
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:6265
operations_research::RoutingModel::RoutingDimension
friend class RoutingDimension
Definition: routing.h:1856
bound
int64 bound
Definition: routing_search.cc:972
operations_research::SweepArranger::~SweepArranger
virtual ~SweepArranger()
Definition: routing.h:2792
operations_research::RoutingTransitCallback1
std::function< int64(int64)> RoutingTransitCallback1
Definition: routing_types.h:41
operations_research::BasePathFilter::BasePathFilter
BasePathFilter(const std::vector< IntVar * > &nexts, int next_domain_size)
Definition: routing_search.cc:288
adjustable_priority_queue.h
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:6884
operations_research::ComparatorCheapestAdditionFilteredHeuristic::ComparatorCheapestAdditionFilteredHeuristic
ComparatorCheapestAdditionFilteredHeuristic(RoutingModel *model, Solver::VariableValueComparator comparator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
Definition: routing_search.cc:4546
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:1164
operations_research::CheapestInsertionFilteredHeuristic::StartEndValue::distance
int64 distance
Definition: routing.h:3041
operations_research::EvaluatorCheapestAdditionFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3451
operations_research::RoutingFilteredHeuristic::GetStartChainEnd
int GetStartChainEnd(int vehicle) const
Returns the end of the start chain of vehicle,.
Definition: routing.h:3006
operations_research::DisjunctivePropagator::Tasks::span_min
int64 span_min
Definition: routing.h:1892
operations_research::RoutingModel::VehicleTypeContainer::type_index_of_vehicle
std::vector< int > type_index_of_vehicle
Definition: routing.h:374
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:1671
lp_data.h
operations_research::RoutingModel
Definition: routing.h:211
operations_research::RoutingModel::CostClass::DimensionCost::cost_coefficient
int64 cost_coefficient
Definition: routing.h:297
operations_research::RoutingModel::AddToAssignment
void AddToAssignment(IntVar *const var)
Adds an extra variable to the vehicle routing assignment.
Definition: routing.cc:5552
operations_research::RoutingModel::End
int64 End(int vehicle) const
Returns the variable index of the ending node of a vehicle route.
Definition: routing.h:1157
operations_research::TypeRegulationsConstraint::InitialPropagate
void InitialPropagate() override
Definition: routing.cc:6427
operations_research::CheapestInsertionFilteredHeuristic::~CheapestInsertionFilteredHeuristic
~CheapestInsertionFilteredHeuristic() override
Definition: routing.h:3036
operations_research::IntVarFilteredHeuristic::~IntVarFilteredHeuristic
virtual ~IntVarFilteredHeuristic()
Definition: routing.h:2922
operations_research::VehicleTypeCurator::GetCompatibleVehicleOfType
int GetCompatibleVehicleOfType(int type, std::function< bool(int)> vehicle_is_compatible)
Definition: routing_search.cc:2672
operations_research::RoutingModel::GetVehicleClassIndexOfVehicle
VehicleClassIndex GetVehicleClassIndexOfVehicle(int64 vehicle) const
Definition: routing.h:1245
operations_research::RoutingModel::GetSingleNodesOfType
const std::vector< int > & GetSingleNodesOfType(int type) const
Definition: routing.cc:4062
operations_research::IntVarFilteredHeuristic::Commit
bool Commit()
Commits the modifications to the current solution if these modifications are "filter-feasible",...
Definition: routing_search.cc:2810
operations_research::GlobalVehicleBreaksConstraint
GlobalVehicleBreaksConstraint ensures breaks constraints are enforced on all vehicles in the dimensio...
Definition: routing.h:1982
operations_research::FillPathEvaluation
void FillPathEvaluation(const std::vector< int64 > &path, const RoutingModel::TransitCallback2 &evaluator, std::vector< int64 > *values)
Definition: routing.cc:6177
operations_research::DisjunctivePropagator::Tasks::Clear
void Clear()
Definition: routing.h:1895
operations_research::IntVarFilteredDecisionBuilder::number_of_decisions
int64 number_of_decisions() const
Returns statistics from its underlying heuristic.
Definition: routing_search.cc:2723
operations_research::RoutingModel::CostsAreHomogeneousAcrossVehicles
bool CostsAreHomogeneousAcrossVehicles() const
Whether costs are homogeneous across all vehicles.
Definition: routing.h:1206
operations_research::GlobalCheapestInsertionFilteredHeuristic::~GlobalCheapestInsertionFilteredHeuristic
~GlobalCheapestInsertionFilteredHeuristic() override
Definition: routing.h:3129
operations_research::IntVarFilteredHeuristic::StopSearch
virtual bool StopSearch()
Returns true if the search must be stopped.
Definition: routing.h:2947
operations_research::RoutingDimension::fixed_transits
const std::vector< IntVar * > & fixed_transits() const
Definition: routing.h:2315
operations_research::GlobalCheapestInsertionFilteredHeuristic::BuildSolutionInternal
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
Definition: routing_search.cc:3337
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::GetDeliveryIndexPairs
const std::vector< std::pair< int, int > > & GetDeliveryIndexPairs(int64 node_index) const
Same as above for deliveries.
Definition: routing.cc:1734
operations_research::RoutingModel::TransitCallback1
RoutingTransitCallback1 TransitCallback1
Definition: routing.h:240
operations_research::RoutingModelInspector
Definition: routing.cc:1909
operations_research::RoutingFilteredHeuristic
Filter-based heuristic dedicated to routing.
Definition: routing.h:2996
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::GlobalDimensionCumulOptimizer
Definition: routing_lp_scheduling.h:679
operations_research::RoutingModel::VehicleClass::dimension_capacities
gtl::ITIVector< DimensionIndex, int64 > dimension_capacities
Definition: routing.h:341
operations_research::MakeTypeRegulationsFilter
IntVarLocalSearchFilter * MakeTypeRegulationsFilter(const RoutingModel &routing_model)
Definition: routing_search.cc:818
operations_research::CheapestInsertionFilteredHeuristic::penalty_evaluator_
std::function< int64(int64)> penalty_evaluator_
Definition: routing.h:3095
operations_research::RoutingModel::DisjunctionIndex
RoutingDisjunctionIndex DisjunctionIndex
Definition: routing.h:238
logging.h
operations_research::SavingsFilteredHeuristic::BuildRoutesFromSavings
virtual void BuildRoutesFromSavings()=0
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:3119
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:2950
operations_research::TypeIncompatibilityChecker::~TypeIncompatibilityChecker
~TypeIncompatibilityChecker() override
Definition: routing.h:2144
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::IntVarLocalSearchFilter::IsVarSynced
bool IsVarSynced(int index) const
Definition: constraint_solveri.h:1839
operations_research::PiecewiseLinearFunction
Definition: piecewise_linear_function.h:101
operations_research::RoutingModel::GetMutableDimension
RoutingDimension * GetMutableDimension(const std::string &dimension_name) const
Returns a dimension from its name.
Definition: routing.cc:1282
operations_research::RoutingDimension::SlackVar
IntVar * SlackVar(int64 index) const
Definition: routing.h:2309
operations_research::TypeRegulationsConstraint
The following constraint ensures that incompatibilities and requirements between types are respected.
Definition: routing.h:2220
operations_research::BasePathFilter::kUnassigned
static const int64 kUnassigned
Definition: routing.h:3701
operations_research::RoutingDimension::SetSpanCostCoefficientForAllVehicles
void SetSpanCostCoefficientForAllVehicles(int64 coefficient)
Definition: routing.cc:6564
operations_research::SavingsFilteredHeuristic::SavingsContainer
Definition: routing.h:3523
operations_research::RoutingModel::CostClassIndex
RoutingCostClassIndex CostClassIndex
Definition: routing.h:236
operations_research::RoutingModel::StateDependentTransit::transit
RangeIntToIntFunction * transit
Definition: routing.h:263
operations_research::TravelBounds::max_travels
std::vector< int64 > max_travels
Definition: routing.h:1953
operations_research::LocalCheapestInsertionFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3378
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:6662
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:6713
operations_research::RoutingModel::AddVariableMinimizedByFinalizer
void AddVariableMinimizedByFinalizer(IntVar *var)
Adds a variable to minimize in the solution finalizer.
Definition: routing.cc:5542
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:3503
value
int64 value
Definition: demon_profiler.cc:43
operations_research::RoutingIndexManager
Manager for any NodeIndex <-> variable index conversion.
Definition: routing_index_manager.h:48
operations_research::RoutingModel::GetPickupAndDeliveryDisjunctions
const std::vector< std::pair< DisjunctionIndex, DisjunctionIndex > > & GetPickupAndDeliveryDisjunctions() const
Definition: routing.h:737
operations_research::ComparatorCheapestAdditionFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3474
operations_research::RoutingModel::StateDependentTransit
What follows is relevant for models with time/state dependent transits.
Definition: routing.h:262
operations_research::RoutingModel::IsEnd
bool IsEnd(int64 index) const
Returns true if 'index' represents the last node of a route.
Definition: routing.h:1161
operations_research::RoutingModel::GetNumberOfVisitTypes
int GetNumberOfVisitTypes() const
Definition: routing.h:780
operations_research::RoutingModel::GetVisitTypePolicy
VisitTypePolicy GetVisitTypePolicy(int64 index) const
Definition: routing.cc:4072
operations_research::TypeRequirementChecker::TypeRequirementChecker
TypeRequirementChecker(const RoutingModel &model)
Definition: routing.h:2158
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::RoutingDimension::GetSpanCostCoefficientForVehicle
int64 GetSpanCostCoefficientForVehicle(int vehicle) const
Definition: routing.h:2597
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:2641
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:2108
operations_research::RoutingModel::VehicleClass::unvisitable_nodes_fprint
uint64 unvisitable_nodes_fprint
Fingerprint of unvisitable non-start/end nodes.
Definition: routing.h:346
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:767
operations_research::RoutingModel::HasTemporalTypeRequirements
bool HasTemporalTypeRequirements() const
Definition: routing.h:846
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:3034
operations_research::RoutingDimension::HasBreakConstraints
bool HasBreakConstraints() const
Returns true if any break interval or break distance was defined.
Definition: routing.cc:6861
operations_research::LocalCheapestInsertionFilteredHeuristic::~LocalCheapestInsertionFilteredHeuristic
~LocalCheapestInsertionFilteredHeuristic() override
Definition: routing.h:3376
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:3113
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:2376
operations_research::RoutingDimension::GetBreakIntervalsOfVehicle
const std::vector< IntervalVar * > & GetBreakIntervalsOfVehicle(int vehicle) const
Returns the break intervals set by SetBreakIntervalsOfVehicle().
Definition: routing.cc:6865
macros.h
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
operations_research::BasePathFilter::Rank
int Rank(int64 node) const
Definition: routing.h:3711
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::SavingsFilteredHeuristic::ExtraSavingsMemoryMultiplicativeFactor
virtual double ExtraSavingsMemoryMultiplicativeFactor() const =0
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::TypeRegulationsChecker::HasRegulationsToCheck
virtual bool HasRegulationsToCheck() const =0
operations_research::RoutingDimension::FixedTransitVar
IntVar * FixedTransitVar(int64 index) const
Definition: routing.h:2308
operations_research::SimpleBoundCosts
A structure meant to store soft bounds and associated violation constants.
Definition: routing.h:2249
operations_research::RoutingModel::GetMutableLocalCumulMPOptimizer
LocalDimensionCumulOptimizer * GetMutableLocalCumulMPOptimizer(const RoutingDimension &dimension) const
Definition: routing.cc:1255
operations_research::RoutingModel::GetCostClassesCount
int GetCostClassesCount() const
Returns the number of different cost classes in the model.
Definition: routing.h:1240
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::VehicleClassIndex
RoutingVehicleClassIndex VehicleClassIndex
Definition: routing.h:239
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:754
operations_research::RoutingFilteredHeuristic::~RoutingFilteredHeuristic
~RoutingFilteredHeuristic() override
Definition: routing.h:3000
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:1612
operations_research::RoutingFilteredHeuristic::StopSearch
bool StopSearch() override
Returns true if the search must be stopped.
Definition: routing.h:3016
operations_research::SimpleBoundCosts::bound_cost
BoundCost bound_cost(int element) const
Definition: routing.h:2258
operations_research::LocalCheapestInsertionFilteredHeuristic
Filter-base decision builder which builds a solution by inserting nodes at their cheapest position.
Definition: routing.h:3370
operations_research::IntVarFilteredDecisionBuilder::DebugString
std::string DebugString() const override
Definition: routing_search.cc:2731
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:3506
operations_research::RoutingModel::AddTemporalTypeIncompatibility
void AddTemporalTypeIncompatibility(int type1, int type2)
Definition: routing.cc:4096
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:1697
operations_research::RoutingModel::ROUTING_INVALID
@ ROUTING_INVALID
Model, model parameters or flags are not valid.
Definition: routing.h:224
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::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:4195
operations_research::RoutingModel::SolveFromAssignmentWithParameters
const Assignment * SolveFromAssignmentWithParameters(const Assignment *assignment, const RoutingSearchParameters &search_parameters, std::vector< const Assignment * > *solutions=nullptr)
Definition: routing.cc:3185
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::SavingsFilteredHeuristic::Saving
std::pair< int64, int64 > Saving
Definition: routing.h:3520
operations_research::MakeMaxActiveVehiclesFilter
IntVarLocalSearchFilter * MakeMaxActiveVehiclesFilter(const RoutingModel &routing_model)
Definition: routing_search.cc:109
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::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::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:5889
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::DisjunctivePropagator::ForbiddenIntervals
bool ForbiddenIntervals(Tasks *tasks)
Tasks might have holes in their domain, this enforces such holes.
Definition: routing_breaks.cc:250
operations_research::CheapestInsertionFilteredHeuristic::GetUnperformedValue
int64 GetUnperformedValue(int64 node_to_insert) const
Returns the cost of unperforming node 'node_to_insert'.
Definition: routing_search.cc:3042
operations_research::RoutingDimension::GetQuadraticCostSoftSpanUpperBoundForVehicle
SimpleBoundCosts::BoundCost GetQuadraticCostSoftSpanUpperBoundForVehicle(int vehicle) const
Definition: routing.h:2654
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:6700
operations_research::DisjunctivePropagator::Tasks::num_chain_tasks
int num_chain_tasks
Definition: routing.h:1882
operations_research::SimpleBoundCosts::operator=
SimpleBoundCosts operator=(const SimpleBoundCosts &)=delete
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:2306
operations_research::SimpleBoundCosts::SimpleBoundCosts
SimpleBoundCosts(int num_bounds, BoundCost default_bound_cost)
Definition: routing.h:2255
operations_research::SavingsFilteredHeuristic::savings_container_
std::unique_ptr< SavingsContainer< Saving > > savings_container_
Definition: routing.h:3557
operations_research::RoutingDimension::GetLocalOptimizerOffsetForVehicle
int64 GetLocalOptimizerOffsetForVehicle(int vehicle) const
Definition: routing.h:2613
operations_research::RoutingModel::RegisterUnaryTransitCallback
int RegisterUnaryTransitCallback(TransitCallback1 callback)
Registers 'callback' and returns its index.
Definition: routing.cc:868
operations_research::RoutingModel::GetMaximumNumberOfActiveVehicles
int GetMaximumNumberOfActiveVehicles() const
Returns the maximum number of active vehicles.
Definition: routing.h:880
operations_research::SequentialSavingsFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3605
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:3116
operations_research::DisjunctivePropagator::Tasks::forbidden_intervals
std::vector< const SortedDisjointIntervalList * > forbidden_intervals
Definition: routing.h:1890
int64
int64_t int64
Definition: integral_types.h:34
routing_enums.pb.h
constraint_solveri.h
operations_research::RoutingModel::CostClass::CostClass
CostClass(int evaluator_index)
Definition: routing.h:309
operations_research::RoutingDimension::NodePrecedence::second_node
int64 second_node
Definition: routing.h:2573
gtl::ITIVector::size
size_type size() const
Definition: int_type_indexed_vector.h:146
operations_research::RoutingModel::GetTemporalTypeIncompatibilitiesOfType
const absl::flat_hash_set< int > & GetTemporalTypeIncompatibilitiesOfType(int type) const
Definition: routing.cc:4113
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:2561
operations_research::DisjunctivePropagator::Tasks::start_min
std::vector< int64 > start_min
Definition: routing.h:1883
operations_research::RoutingDimension::name
const std::string & name() const
Returns the name of the dimension.
Definition: routing.h:2543
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:2950
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:6654
operations_research::SavingsFilteredHeuristic::GetSavingValue
int64 GetSavingValue(const Saving &saving) const
Returns the saving value from a saving.
Definition: routing.h:3542
operations_research::IntVarFilteredDecisionBuilder::~IntVarFilteredDecisionBuilder
~IntVarFilteredDecisionBuilder() override
Definition: routing.h:2902
operations_research::RoutingModel::VehicleClass::start_equivalence_class
int start_equivalence_class
Vehicle start and end equivalence classes.
Definition: routing.h:333
operations_research::RoutingModel::IgnoreDisjunctionsAlreadyForcedToZero
void IgnoreDisjunctionsAlreadyForcedToZero()
SPECIAL: Makes the solver ignore all the disjunctions whose active variables are all trivially zero (...
Definition: routing.cc:1629
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:5753
operations_research::MakeCPFeasibilityFilter
IntVarLocalSearchFilter * MakeCPFeasibilityFilter(const RoutingModel *routing_model)
Definition: routing_search.cc:2661
operations_research::BasePathFilter::GetPath
int GetPath(int64 node) const
Definition: routing.h:3710
operations_research::RoutingFilteredHeuristic::ResetVehicleIndices
virtual void ResetVehicleIndices()
Definition: routing.h:3018
routing_types.h
operations_research::RoutingModel::vehicles
int vehicles() const
Returns the number of vehicle routes in the model.
Definition: routing.h:1317
operations_research::RoutingModel::ActiveVar
IntVar * ActiveVar(int64 index) const
Returns the active variable of the node corresponding to index.
Definition: routing.h:1184
operations_research::RoutingModel::ROUTING_SUCCESS
@ ROUTING_SUCCESS
Problem solved successfully after calling RoutingModel::Solve().
Definition: routing.h:218
operations_research::BasePathFilter::NumPaths
int NumPaths() const
Definition: routing.h:3708
operations_research::FillTravelBoundsOfVehicle
void FillTravelBoundsOfVehicle(int vehicle, const std::vector< int64 > &path, const RoutingDimension &dimension, TravelBounds *travel_bounds)
Definition: routing_breaks.cc:645
index
int index
Definition: pack.cc:508
operations_research::LocalSearchFilterManager
Filter manager: when a move is made, filters are executed to decide whether the solution is feasible ...
Definition: constraint_solveri.h:1765
operations_research::TypeRegulationsChecker::VisitTypePolicy
RoutingModel::VisitTypePolicy VisitTypePolicy
Definition: routing.h:2090
operations_research::RoutingDimension::GetGlobalOptimizerOffset
int64 GetGlobalOptimizerOffset() const
Definition: routing.h:2609
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:1175
operations_research::RoutingModel::sweep_arranger
SweepArranger * sweep_arranger() const
Returns the sweep arranger to be used by routing heuristics.
Definition: routing.h:1138
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:4106
operations_research::LocalCheapestInsertionFilteredHeuristic::BuildSolutionInternal
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
Definition: routing_search.cc:4245
operations_research::SortedDisjointIntervalList
This class represents a sorted list of disjoint, closed intervals.
Definition: sorted_interval_list.h:387
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:4187
operations_research::RoutingModel::SetVisitType
void SetVisitType(int64 index, int type, VisitTypePolicy type_policy)
Definition: routing.cc:4049
operations_research::RoutingModel::ROUTING_NOT_SOLVED
@ ROUTING_NOT_SOLVED
Problem not solved yet (before calling RoutingModel::Solve()).
Definition: routing.h:216
operations_research::RoutingModel::GetDimensionsWithSoftOrSpanCosts
std::vector< RoutingDimension * > GetDimensionsWithSoftOrSpanCosts() const
Returns dimensions with soft or vehicle span costs.
Definition: routing.cc:4979
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:2961
operations_research::TypeRegulationsChecker::~TypeRegulationsChecker
virtual ~TypeRegulationsChecker()
Definition: routing.h:2083
operations_research::MakeVehicleAmortizedCostFilter
IntVarLocalSearchFilter * MakeVehicleAmortizedCostFilter(const RoutingModel &routing_model)
Definition: routing_search.cc:669
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:1683
operations_research::DisjunctivePropagator::Tasks::span_max
int64 span_max
Definition: routing.h:1893
operations_research::SavingsFilteredHeuristic::GetBeforeNodeFromSaving
int64 GetBeforeNodeFromSaving(const Saving &saving) const
Returns the "before node" from a saving.
Definition: routing.h:3534
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
operations_research::BasePathFilter::~BasePathFilter
~BasePathFilter() override
Definition: routing.h:3695
operations_research::ChristofidesFilteredHeuristic::~ChristofidesFilteredHeuristic
~ChristofidesFilteredHeuristic() override
Definition: routing.h:3670
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:2097
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:1042
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::IntVarFilteredDecisionBuilder::Next
Decision * Next(Solver *solver) override
Definition: routing_search.cc:2710
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:3109
operations_research::RoutingModel::Status
Status
Status of the search.
Definition: routing.h:214
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:2369
operations_research::CheapestAdditionFilteredHeuristic
Filtered-base decision builder based on the addition heuristic, extending a path from its start node ...
Definition: routing.h:3403
operations_research::RoutingModel::VariableIndexEvaluator2
std::function< StateDependentTransit(int64, int64)> VariableIndexEvaluator2
Definition: routing.h:267
operations_research::RoutingModel::SetTabuVarsCallback
void SetTabuVarsCallback(GetTabuVarsCallback tabu_var_callback)
Definition: routing.cc:5453
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:3923
operations_research::RoutingModel::TransitCallback2
RoutingTransitCallback2 TransitCallback2
Definition: routing.h:241
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:6900
operations_research::RoutingDimension::NodePrecedence
Definition: routing.h:2571
cost
int64 cost
Definition: routing_flow.cc:130
operations_research::RoutingModel::GetLocalDimensionCumulMPOptimizers
const std::vector< std::unique_ptr< LocalDimensionCumulOptimizer > > & GetLocalDimensionCumulMPOptimizers() const
Definition: routing.h:563
operations_research::TypeRegulationsChecker::TypeRegulationsChecker
TypeRegulationsChecker(const RoutingModel &model)
Definition: routing.cc:6187
operations_research::VehicleTypeCurator::ReinjectVehicleOfClass
void ReinjectVehicleOfClass(int vehicle, int vehicle_class, int64 fixed_cost)
Definition: routing.h:2848
operations_research::VehicleTypeCurator::GetVehicleOfType
int GetVehicleOfType(int type) const
Definition: routing.h:2836
operations_research::CheapestInsertionFilteredHeuristic::evaluator_
std::function< int64(int64, int64, int64)> evaluator_
Definition: routing.h:3094
operations_research::SimpleBoundCosts::BoundCost::bound
int64 bound
Definition: routing.h:2252
operations_research::DisjunctivePropagator::Tasks
A structure to hold tasks described by their features.
Definition: routing.h:1881
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:2103
operations_research::RoutingModel::RegisterStateDependentTransitCallback
int RegisterStateDependentTransitCallback(VariableIndexEvaluator2 callback)
Definition: routing.cc:917
operations_research::IntVarFilteredDecisionBuilder::IntVarFilteredDecisionBuilder
IntVarFilteredDecisionBuilder(std::unique_ptr< IntVarFilteredHeuristic > heuristic)
Definition: routing_search.cc:2706
a
int64 a
Definition: constraint_solver/table.cc:42
operations_research::LocalDimensionCumulOptimizer
Definition: routing_lp_scheduling.h:634
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
constraint_solver.h
operations_research::RoutingModelVisitor::kLightElement2
static const char kLightElement2[]
Definition: routing.h:1867
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:876
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:5030
operations_research::TypeRegulationsChecker
Definition: routing.h:2080
operations_research::RoutingModel::VehicleClass::cost_class_index
CostClassIndex cost_class_index
The cost class of the vehicle.
Definition: routing.h:324
operations_research::BasePathFilter::IsDisabled
bool IsDisabled() const
Definition: routing.h:3712
operations_research::RoutingModel::first_solution_evaluator
const Solver::IndexEvaluator2 & first_solution_evaluator() const
Gets/sets the evaluator used during the search.
Definition: routing.h:939
operations_research::MakeCumulBoundsPropagatorFilter
IntVarLocalSearchFilter * MakeCumulBoundsPropagatorFilter(const RoutingDimension &dimension)
Definition: routing_search.cc:2500
operations_research::RoutingDimension::RoutingModel
friend class RoutingModel
Definition: routing.h:2780
operations_research::EvaluatorCheapestAdditionFilteredHeuristic::EvaluatorCheapestAdditionFilteredHeuristic
EvaluatorCheapestAdditionFilteredHeuristic(RoutingModel *model, std::function< int64(int64, int64)> evaluator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
Definition: routing_search.cc:4505
operations_research::GlobalVehicleBreaksConstraint::InitialPropagate
void InitialPropagate() override
Definition: routing_breaks.cc:724
operations_research::SavingsFilteredHeuristic::SavingsFilteredHeuristicTestPeer
friend class SavingsFilteredHeuristicTestPeer
Definition: routing.h:3594
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:3599
operations_research::RoutingModel::CostClass
Definition: routing.h:271
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:3621
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::AreEmptyRouteCostsConsideredForVehicle
bool AreEmptyRouteCostsConsideredForVehicle(int vehicle) const
Definition: routing.h:931
operations_research::TypeRegulationsChecker::FinalizeCheck
virtual bool FinalizeCheck() const
Definition: routing.h:2130
operations_research::AppendDimensionCumulFilters
void AppendDimensionCumulFilters(const std::vector< RoutingDimension * > &dimensions, const RoutingSearchParameters &parameters, bool filter_objective_cost, std::vector< LocalSearchFilter * > *filters)
Definition: routing_search.cc:2112
operations_research::RoutingModel::SetPickupAndDeliveryPolicyOfVehicle
void SetPickupAndDeliveryPolicyOfVehicle(PickupAndDeliveryPolicy policy, int vehicle)
Definition: routing.cc:1740
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:2618
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::RoutingModel::CostClass::DimensionCost::dimension
const RoutingDimension * dimension
Definition: routing.h:298
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::TypeRequirementChecker
Checker for type requirements.
Definition: routing.h:2156
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:3120
operations_research::BasePathFilter::OnSynchronize
void OnSynchronize(const Assignment *delta) override
Definition: routing_search.cc:451
operations_research::CheapestInsertionFilteredHeuristic::StartEndValue::vehicle
int vehicle
Definition: routing.h:3042
operations_research::RoutingModel::TransitCallback
const TransitCallback2 & TransitCallback(int callback_index) const
Definition: routing.h:406
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:3820
operations_research::IntVarFilteredHeuristic::number_of_rejects
int64 number_of_rejects() const
Definition: routing.h:2931
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:4087
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:1145
operations_research::SavingsFilteredHeuristic::SavingsParameters
Definition: routing.h:3497
operations_research::CapAdd
int64 CapAdd(int64 x, int64 y)
Definition: saturated_arithmetic.h:124
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:4143
operations_research::ChristofidesFilteredHeuristic::ChristofidesFilteredHeuristic
ChristofidesFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager, bool use_minimum_matching)
Definition: routing_search.cc:5560
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:2930
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:5538
operations_research::RoutingModel::Size
int64 Size() const
Returns the number of next variables in the model.
Definition: routing.h:1319
operations_research::RoutingModel::Solve
const Assignment * Solve(const Assignment *assignment=nullptr)
Solves the current routing model; closes the current model.
Definition: routing.cc:3114
operations_research::SavingsFilteredHeuristic::GetVehicleTypeFromSaving
int64 GetVehicleTypeFromSaving(const Saving &saving) const
Returns the cost class from a saving.
Definition: routing.h:3530
operations_research::CPFeasibilityFilter::OnSynchronize
void OnSynchronize(const Assignment *delta) override
Definition: routing_search.cc:2626
operations_research::RoutingModel::GetAmortizedQuadraticCostFactorOfVehicles
const std::vector< int64 > & GetAmortizedQuadraticCostFactorOfVehicles() const
Definition: routing.h:922
operations_research::RoutingModel::ComputeLowerBound
int64 ComputeLowerBound()
Computes a lower bound to the routing problem solving a linear assignment problem.
Definition: routing.cc:3343
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::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:3305
operations_research::RoutingModel::VehicleTypeContainer::VehicleClassEntry::fixed_cost
int64 fixed_cost
Definition: routing.h:359
operations_research::RoutingFilteredHeuristic::GetEndChainStart
int GetEndChainStart(int vehicle) const
Returns the start of the end chain of vehicle,.
Definition: routing.h:3008
operations_research::SweepArranger::SweepArranger
SweepArranger(const std::vector< std::pair< int64, int64 >> &points)
Definition: routing.cc:2960
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:5746
operations_research::RoutingModel::IsStart
bool IsStart(int64 index) const
Returns true if 'index' represents the first node of a route.
Definition: routing.cc:3880
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:6691
operations_research::GlobalVehicleBreaksConstraint::DebugString
std::string DebugString() const override
Definition: routing.h:1985
operations_research::GlobalCheapestInsertionFilteredHeuristic
Filter-based decision builder which builds a solution by inserting nodes at their cheapest position o...
Definition: routing.h:3106
operations_research::RoutingModel::MutablePreAssignment
Assignment * MutablePreAssignment()
Definition: routing.h:1043
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:3018
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:1760
operations_research::TravelBounds::post_travels
std::vector< int64 > post_travels
Definition: routing.h:1955
operations_research::SimpleBoundCosts::bound_cost
BoundCost & bound_cost(int element)
Definition: routing.h:2257
operations_research::RoutingModel::VehicleClass::dimension_end_cumuls_max
gtl::ITIVector< DimensionIndex, int64 > dimension_end_cumuls_max
Definition: routing.h:340
operations_research::RoutingFilteredHeuristic::MakeDisjunctionNodesUnperformed
void MakeDisjunctionNodesUnperformed(int64 node)
Make nodes in the same disjunction as 'node' unperformed.
Definition: routing_search.cc:2931
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:3786
operations_research::RoutingModel::VisitTypePolicy
VisitTypePolicy
Set the node visit types and incompatibilities/requirements between the types (see below).
Definition: routing.h:752
operations_research::DisjunctivePropagator::Tasks::is_preemptible
std::vector< bool > is_preemptible
Definition: routing.h:1889
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:3902
operations_research::RoutingModel::GetNumberOfDisjunctions
int GetNumberOfDisjunctions() const
Returns the number of node disjunctions in the model.
Definition: routing.h:654
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:2623
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::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:6640
operations_research::IntVarFilteredHeuristic::BuildSolutionInternal
virtual bool BuildSolutionInternal()=0
Virtual method to redefine how to build a solution.
operations_research::SweepArranger
Class to arrange indices by by their distance and their angles from the depot.
Definition: routing.h:2789
operations_research::RoutingDimension
Dimensions represent quantities accumulated at nodes along the routes.
Definition: routing.h:2288
operations_research::sat::ThetaLambdaTree< int64 >
int_type_indexed_vector.h
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::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::RoutingDimension::HasSoftSpanUpperBounds
bool HasSoftSpanUpperBounds() const
Definition: routing.h:2631
operations_research::SavingsFilteredHeuristic::GetAfterNodeFromSaving
int64 GetAfterNodeFromSaving(const Saving &saving) const
Returns the "after node" from a saving.
Definition: routing.h:3538
operations_research::RoutingModel::CheckLimit
bool CheckLimit()
Returns true if the search limit has been crossed.
Definition: routing.h:1302
operations_research::RoutingModel::VehicleTypeContainer::NumTypes
int NumTypes() const
Definition: routing.h:367
operations_research::RoutingModel::SetFirstSolutionEvaluator
void SetFirstSolutionEvaluator(Solver::IndexEvaluator2 evaluator)
Takes ownership of evaluator.
Definition: routing.h:944
operations_research::EvaluatorCheapestAdditionFilteredHeuristic::~EvaluatorCheapestAdditionFilteredHeuristic
~EvaluatorCheapestAdditionFilteredHeuristic() override
Definition: routing.h:3450
operations_research::RoutingModel::VehicleTypeContainer::VehicleClassEntry::operator<
bool operator<(const VehicleClassEntry &other) const
Definition: routing.h:361
operations_research::DisjunctivePropagator::Tasks::duration_min
std::vector< int64 > duration_min
Definition: routing.h:1885
operations_research::TypeRegulationsChecker::model_
const RoutingModel & model_
Definition: routing.h:2132
operations_research::VehicleTypeCurator::VehicleTypeCurator
VehicleTypeCurator(const RoutingModel::VehicleTypeContainer &vehicle_type_container)
Definition: routing.h:2815
operations_research::RoutingModel::UnperformedPenalty
int64 UnperformedPenalty(int64 var_index) const
Get the "unperformed" penalty of a node.
Definition: routing.cc:4208
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::RoutingModel::VehicleClass::fixed_cost
int64 fixed_cost
Contrarily to CostClass, here we need strict equivalence.
Definition: routing.h:326
operations_research::MakeVehicleVarFilter
IntVarLocalSearchFilter * MakeVehicleVarFilter(const RoutingModel &routing_model)
Definition: routing_search.cc:2442
operations_research::RoutingModel::VehicleVar
IntVar * VehicleVar(int64 index) const
Returns the vehicle variable of the node corresponding to index.
Definition: routing.h:1197
operations_research::RoutingModel::SetSweepArranger
void SetSweepArranger(SweepArranger *sweep_arranger)
Definition: routing.h:1134
operations_research::SparseBitset::PositionsSetAtLeastOnce
const std::vector< IntegerType > & PositionsSetAtLeastOnce() const
Definition: bitset.h:815
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::RoutingDimension::TransitVar
IntVar * TransitVar(int64 index) const
Definition: routing.h:2307
operations_research::RoutingDimension::InitializeBreaks
void InitializeBreaks()
Sets up vehicle_break_intervals_, vehicle_break_distance_duration_, pre_travel_evaluators and post_tr...
Definition: routing.cc:6851
operations_research::TravelBounds::min_travels
std::vector< int64 > min_travels
Definition: routing.h:1952
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:1874
operations_research::RoutingModel::GetDimensions
const std::vector< RoutingDimension * > & GetDimensions() const
Returns all dimensions of the model.
Definition: routing.h:546
operations_research::AppendTasksFromIntervals
void AppendTasksFromIntervals(const std::vector< IntervalVar * > &intervals, DisjunctivePropagator::Tasks *tasks)
Definition: routing_breaks.cc:673
operations_research::RoutingModel::SetFixedCostOfVehicle
void SetFixedCostOfVehicle(int64 cost, int vehicle)
Sets the fixed cost of one vehicle route.
Definition: routing.cc:1316
operations_research::SimpleBoundCosts::SimpleBoundCosts
SimpleBoundCosts(const SimpleBoundCosts &)=delete
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:1340
operations_research::ParallelSavingsFilteredHeuristic::~ParallelSavingsFilteredHeuristic
~ParallelSavingsFilteredHeuristic() override
Definition: routing.h:3625
operations_research::RoutingModel::RoutingModel
RoutingModel(const RoutingIndexManager &index_manager)
Constructor taking an index manager.
Definition: routing.cc:759
operations_research::RoutingDimension::GetPostTravelEvaluatorOfVehicle
int GetPostTravelEvaluatorOfVehicle(int vehicle) const
Definition: routing.cc:6878
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::DisjunctivePropagator::Tasks::duration_max
std::vector< int64 > duration_max
Definition: routing.h:1886
operations_research::MakeGlobalLPCumulFilter
IntVarLocalSearchFilter * MakeGlobalLPCumulFilter(GlobalDimensionCumulOptimizer *optimizer, bool filter_objective_cost)
Definition: routing_search.cc:2599
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
uint64
uint64_t uint64
Definition: integral_types.h:39
operations_research::sat::Value
std::function< int64(const Model &)> Value(IntegerVariable v)
Definition: integer.h:1396
operations_research::RoutingModel::ActiveVehicleVar
IntVar * ActiveVehicleVar(int vehicle) const
Returns the active variable of the vehicle.
Definition: routing.h:1187
operations_research::RoutingModel::DimensionIndex
RoutingDimensionIndex DimensionIndex
Definition: routing.h:237
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::VehicleTypeCurator
Definition: routing.h:2813
operations_research::DisjunctivePropagator::Tasks::end_max
std::vector< int64 > end_max
Definition: routing.h:1888
operations_research::SavingsFilteredHeuristic
Filter-based decision builder which builds a solution by using Clarke & Wright's Savings heuristic.
Definition: routing.h:3495
operations_research::RoutingDimension::transits
const std::vector< IntVar * > & transits() const
Definition: routing.h:2316
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:3010
operations_research::RoutingModel::GetAutomaticFirstSolutionStrategy
operations_research::FirstSolutionStrategy::Value GetAutomaticFirstSolutionStrategy() const
Returns the automatic first solution strategy selected.
Definition: routing.h:1329
operations_research::RoutingModel::VehicleTypeContainer::Type
int Type(int vehicle) const
Definition: routing.h:369
operations_research::RoutingModel::SetPickupAndDeliveryPolicyOfAllVehicles
void SetPickupAndDeliveryPolicyOfAllVehicles(PickupAndDeliveryPolicy policy)
Sets the Pickup and delivery policy of all vehicles.
Definition: routing.cc:1746
operations_research::RoutingDimension::GetSpanUpperBoundForVehicle
int64 GetSpanUpperBoundForVehicle(int vehicle) const
Definition: routing.h:2589
operations_research::RoutingIndexPair
std::pair< std::vector< int64 >, std::vector< int64 > > RoutingIndexPair
Definition: routing_types.h:44
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:6574
operations_research::RoutingModel::GetNumberOfRejectsInFirstSolution
int64 GetNumberOfRejectsInFirstSolution(const RoutingSearchParameters &search_parameters) const
Definition: routing.cc:3613
operations_research::RoutingFilteredHeuristic::RoutingFilteredHeuristic
RoutingFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager)
Definition: routing_search.cc:2850
theta_tree.h
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:3509
operations_research::RoutingModel::PickupAndDeliveryPolicy
PickupAndDeliveryPolicy
Types of precedence policy applied to pickup and delivery pairs.
Definition: routing.h:228
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::BasePathFilter
Generic path-based filter class.
Definition: routing.h:3692
operations_research::Queue
Definition: constraint_solver.cc:208
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::TypeRequirementChecker::~TypeRequirementChecker
~TypeRequirementChecker() override
Definition: routing.h:2160
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:4078
operations_research::RoutingDimension::global_span_cost_coefficient
int64 global_span_cost_coefficient() const
Definition: routing.h:2605
sorted_interval_list.h
operations_research::IntVarFilteredHeuristic::ResetSolution
void ResetSolution()
Resets the data members for a new solution.
Definition: routing_search.cc:2756
operations_research::RoutingModel::ApplyLocks
IntVar * ApplyLocks(const std::vector< int64 > &locks)
Applies a lock chain to the next search.
Definition: routing.cc:3578
operations_research::RoutingIndexPairs
std::vector< RoutingIndexPair > RoutingIndexPairs
Definition: routing_types.h:45
operations_research::RoutingModelVisitor
Routing model visitor.
Definition: routing.h:1863
operations_research::RoutingModel::RemainingTime
absl::Duration RemainingTime() const
Returns the time left in the search limit.
Definition: routing.h:1308
operations_research::IntVarFilteredHeuristic::Var
IntVar * Var(int64 index) const
Returns the variable of index 'index'.
Definition: routing.h:2972
operations_research::RoutingModel::CostClass::DimensionCost::transit_evaluator_class
int64 transit_evaluator_class
Definition: routing.h:296
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
operations_research::CPFeasibilityFilter
This filter accepts deltas for which the assignment satisfies the constraints of the Solver.
Definition: routing.h:3766
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::RoutingModel::SetFixedCostOfAllVehicles
void SetFixedCostOfAllVehicles(int64 cost)
Sets the fixed cost of all vehicle routes.
Definition: routing.cc:1305
callback
MPCallback * callback
Definition: gurobi_interface.cc:440
operations_research::RoutingModel::GetAmortizedLinearCostFactorOfVehicles
const std::vector< int64 > & GetAmortizedLinearCostFactorOfVehicles() const
Definition: routing.h:919
operations_research::GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionParameters
Definition: routing.h:3108
operations_research::RoutingFilteredHeuristic::SetVehicleIndex
virtual void SetVehicleIndex(int64 node, int vehicle)
Definition: routing.h:3017
model
GRBmodel * model
Definition: gurobi_interface.cc:195
operations_research::RoutingModel::nodes
int nodes() const
Sizes and indices Returns the number of nodes in the model.
Definition: routing.h:1315
operations_research::ParallelSavingsFilteredHeuristic
Definition: routing.h:3618
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::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:2060
operations_research::CheapestAdditionFilteredHeuristic::~CheapestAdditionFilteredHeuristic
~CheapestAdditionFilteredHeuristic() override
Definition: routing.h:3407
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:3492
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:6649
operations_research::RoutingDimension::NodePrecedence::offset
int64 offset
Definition: routing.h:2574
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::GetVisitType
int GetVisitType(int64 index) const
Definition: routing.cc:4057
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:3912
operations_research::RoutingModel::VehicleClass::dimension_end_cumuls_min
gtl::ITIVector< DimensionIndex, int64 > dimension_end_cumuls_min
Definition: routing.h:339
operations_research::RoutingFilteredHeuristic::MakeUnassignedNodesUnperformed
void MakeUnassignedNodesUnperformed()
Make all unassigned nodes unperformed.
Definition: routing_search.cc:2940
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:6259
operations_research::MakeVehicleBreaksFilter
IntVarLocalSearchFilter * MakeVehicleBreaksFilter(const RoutingModel &routing_model, const RoutingDimension &dimension)
Definition: routing_breaks.cc:1060
operations_research::TypeRegulationsChecker::CheckVehicle
bool CheckVehicle(int vehicle, const std::function< int64(int64)> &next_accessor)
Definition: routing.cc:6190
operations_research::IntVarLocalSearchFilter
Definition: constraint_solveri.h:1813
operations_research::CheapestAdditionFilteredHeuristic::BuildSolutionInternal
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
Definition: routing_search.cc:4358
operations_research::TypeRegulationsChecker::TypePolicyOccurrence
Definition: routing.h:2093
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::RoutingModel::GetPickupAndDeliveryPolicyOfVehicle
PickupAndDeliveryPolicy GetPickupAndDeliveryPolicyOfVehicle(int vehicle) const
Definition: routing.cc:1755
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:2532
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:2383
operations_research::RoutingModel::VehicleTypeContainer::VehicleClassEntry
Definition: routing.h:357
graph.h
operations_research::RoutingFilteredHeuristic::model
RoutingModel * model() const
Definition: routing.h:3004
operations_research::IntVarFilteredHeuristic::Size
int Size() const
Returns the number of variables the decision builder is trying to instantiate.
Definition: routing.h:2970
operations_research::RoutingModel::GetMutableLocalCumulOptimizer
LocalDimensionCumulOptimizer * GetMutableLocalCumulOptimizer(const RoutingDimension &dimension) const
Definition: routing.cc:1243
AdjustablePriorityQueue
Definition: adjustable_priority_queue.h:38
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:2314
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:762
operations_research::RoutingModel::ROUTING_FAIL
@ ROUTING_FAIL
No solution found to the problem after calling RoutingModel::Solve().
Definition: routing.h:220
coefficient
int64 coefficient
Definition: routing_search.cc:973
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:1905
operations_research::SimpleBoundCosts::BoundCost::cost
int64 cost
Definition: routing.h:2253
operations_research::RoutingModel::VehicleTypeContainer
Struct used to sort and store vehicles by their type.
Definition: routing.h:356
operations_research::DisjunctivePropagator::Tasks::distance_duration
std::vector< std::pair< int64, int64 > > distance_duration
Definition: routing.h:1891
operations_research::LocalSearchFilter
Local Search Filters are used for fast neighbor pruning.
Definition: constraint_solveri.h:1724
operations_research::RoutingModel::RegisterPositiveTransitCallback
int RegisterPositiveTransitCallback(TransitCallback2 callback)
Definition: routing.cc:910
operations_research::RoutingDimension::~RoutingDimension
~RoutingDimension()
Definition: routing.cc:5922
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::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:2048
operations_research::RoutingModel::StateDependentTransitCallback
const VariableIndexEvaluator2 & StateDependentTransitCallback(int callback_index) const
Definition: routing.h:414
operations_research::RoutingDimension::GetPickupToDeliveryLimitForPair
int64 GetPickupToDeliveryLimitForPair(int pair_index, int pickup, int delivery) const
Definition: routing.cc:6920
operations_research::RoutingModel::GetPickupAndDeliveryPairs
const IndexPairs & GetPickupAndDeliveryPairs() const
Returns pickup and delivery pairs currently in the model.
Definition: routing.h:733
operations_research::RoutingModelVisitor::kRemoveValues
static const char kRemoveValues[]
Definition: routing.h:1868
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:3500
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:3605
operations_research::BasePathFilter::Start
int64 Start(int i) const
Definition: routing.h:3709
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:6519
operations_research::TypeRegulationsConstraint::TypeRegulationsConstraint
TypeRegulationsConstraint(const RoutingModel &model)
Definition: routing.cc:6379
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:2959
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::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:1596
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:300
operations_research::RoutingDimension::GetSoftSpanUpperBoundForVehicle
SimpleBoundCosts::BoundCost GetSoftSpanUpperBoundForVehicle(int vehicle) const
Definition: routing.h:2634
operations_research::SequentialSavingsFilteredHeuristic::~SequentialSavingsFilteredHeuristic
~SequentialSavingsFilteredHeuristic() override
Definition: routing.h:3604
operations_research::MakePickupDeliveryFilter
IntVarLocalSearchFilter * MakePickupDeliveryFilter(const RoutingModel &routing_model, const RoutingModel::IndexPairs &pairs, const std::vector< RoutingModel::PickupAndDeliveryPolicy > &vehicle_policies)
Definition: routing_search.cc:2369
operations_research::RoutingDimension::vehicle_span_cost_coefficients
const std::vector< int64 > & vehicle_span_cost_coefficients() const
Definition: routing.h:2601
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::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:2778
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:3154
operations_research::GlobalVehicleBreaksConstraint::Post
void Post() override
Definition: routing_breaks.cc:695
operations_research::RoutingModel::kNoPenalty
static const int64 kNoPenalty
Constant used to express a hard constraint instead of a soft penalty.
Definition: routing.h:382
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::RoutingModel::GetLocalDimensionCumulOptimizers
const std::vector< std::unique_ptr< LocalDimensionCumulOptimizer > > & GetLocalDimensionCumulOptimizers() const
Definition: routing.h:559
operations_research::ChristofidesFilteredHeuristic
Christofides addition heuristic.
Definition: routing.h:3665
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:5518
operations_research::RoutingDimension::GetNodePrecedences
const std::vector< NodePrecedence > & GetNodePrecedences() const
Definition: routing.h:2580
operations_research::GlobalCheapestInsertionFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3131
operations_research::RoutingModel::IndexPairs
RoutingIndexPairs IndexPairs
Definition: routing.h:246
operations_research::RoutingModel::GetVehicleTypeContainer
const VehicleTypeContainer & GetVehicleTypeContainer() const
Definition: routing.h:1257
operations_research::RoutingDimension::slacks
const std::vector< IntVar * > & slacks() const
Definition: routing.h:2317
operations_research::RoutingModel::SetPrimaryConstrainedDimension
void SetPrimaryConstrainedDimension(const std::string &dimension_name)
Set the given dimension as "primary constrained".
Definition: routing.h:590
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:6525
operations_research::TypeRegulationsChecker::InitializeCheck
void InitializeCheck(int vehicle, const std::function< int64(int64)> &next_accessor)
Definition: routing.cc:6234
operations_research::VehicleTypeCurator::Reset
void Reset()
Definition: routing.h:2823
hash.h
operations_research::SequentialSavingsFilteredHeuristic::SequentialSavingsFilteredHeuristic
SequentialSavingsFilteredHeuristic(RoutingModel *model, const RoutingIndexManager *manager, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
Definition: routing.h:3599
operations_research::RoutingModel::GetVehicleClassesCount
int GetVehicleClassesCount() const
Returns the number of different vehicle classes in the model.
Definition: routing.h:1250
operations_research::RoutingDimension::SetPickupToDeliveryLimitFunctionForPair
void SetPickupToDeliveryLimitFunctionForPair(PickupToDeliveryLimitFunction limit_function, int pair_index)
Definition: routing.cc:6906
operations_research::SimpleBoundCosts::BoundCost
Definition: routing.h:2251
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:3894
operations_research::CheapestInsertionFilteredHeuristic::StartEndValue
Definition: routing.h:3040
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::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:4225
operations_research::RoutingModel::~RoutingModel
~RoutingModel()
Definition: routing.cc:852
delta
int64 delta
Definition: resource.cc:1684
operations_research::TravelBounds
Definition: routing.h:1951
operations_research::TypeIncompatibilityChecker
Checker for type incompatibilities.
Definition: routing.h:2140
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:1692
operations_research::DisjunctivePropagator::EdgeFinding
bool EdgeFinding(Tasks *tasks)
Does edge-finding deductions on all tasks.
Definition: routing_breaks.cc:136
b
int64 b
Definition: constraint_solver/table.cc:43
operations_research::RoutingModel::GetDepot
int64 GetDepot() const
Returns the variable index of the first starting or ending node of all routes.
Definition: routing.cc:1806
operations_research::GlobalVehicleBreaksConstraint::GlobalVehicleBreaksConstraint
GlobalVehicleBreaksConstraint(const RoutingDimension *dimension)
Definition: routing_breaks.cc:687
operations_research::CPFeasibilityFilter::CPFeasibilityFilter
CPFeasibilityFilter(const RoutingModel *routing_model)
Definition: routing_search.cc:2608
DISALLOW_COPY_AND_ASSIGN
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: macros.h:29
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:2329
operations_research::RoutingModel::CostVar
IntVar * CostVar() const
Returns the global cost variable which is being minimized.
Definition: routing.h:1199
adjustable_priority_queue-inl.h
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:2965
operations_research::TypeRegulationsChecker::CheckTypeRegulations
virtual bool CheckTypeRegulations(int type, VisitTypePolicy policy, int pos)=0
operations_research::GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionParameters::is_sequential
bool is_sequential
Whether the routes are constructed sequentially or in parallel.
Definition: routing.h:3110
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::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:6569
operations_research::BasePathFilter::GetNext
int64 GetNext(int64 node) const
Definition: routing.h:3703
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:1178
gtl::ITIVector< DimensionIndex, int64 >
operations_research::SweepArranger::ArrangeIndices
void ArrangeIndices(std::vector< int64 > *indices)
Definition: routing.cc:2970
capacity
int64 capacity
Definition: routing_flow.cc:129
interval
IntervalVar * interval
Definition: resource.cc:98
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::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:3487
next
Block * next
Definition: constraint_solver.cc:667
range_query_function.h
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:3661
operations_research::RoutingDimension::vehicle_capacities
const std::vector< int64 > & vehicle_capacities() const
Returns the capacities for all vehicles.
Definition: routing.h:2364
operations_research::ParallelSavingsFilteredHeuristic::ParallelSavingsFilteredHeuristic
ParallelSavingsFilteredHeuristic(RoutingModel *model, const RoutingIndexManager *manager, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
Definition: routing.h:3620
operations_research::BasePathFilter::GetNewSynchronizedUnperformedNodes
const std::vector< int64 > & GetNewSynchronizedUnperformedNodes() const
Definition: routing.h:3716
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:3773
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::IntVarFilteredHeuristic::assignment_
Assignment *const assignment_
Definition: routing.h:2976
operations_research::IntVarFilteredHeuristic::IntVarFilteredHeuristic
IntVarFilteredHeuristic(Solver *solver, const std::vector< IntVar * > &vars, LocalSearchFilterManager *filter_manager)
Definition: routing_search.cc:2740
operations_research::ComparatorCheapestAdditionFilteredHeuristic
A CheapestAdditionFilteredHeuristic where the notion of 'cheapest arc' comes from an arc comparator.
Definition: routing.h:3467
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:1232
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:1211
operations_research::RoutingModel::HasHardTypeIncompatibilities
bool HasHardTypeIncompatibilities() const
Returns true iff any hard (resp.
Definition: routing.h:798
operations_research::IntVarFilteredDecisionBuilder::number_of_rejects
int64 number_of_rejects() const
Definition: routing_search.cc:2727
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::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:4202
operations_research::RoutingModel::GetPairIndicesOfType
const std::vector< int > & GetPairIndicesOfType(int type) const
Definition: routing.cc:4067
operations_research::CPFeasibilityFilter::~CPFeasibilityFilter
~CPFeasibilityFilter() override
Definition: routing.h:3769
operations_research::IntVarFilteredHeuristic::DebugString
virtual std::string DebugString() const
Definition: routing.h:2933
operations_research::EvaluatorCheapestAdditionFilteredHeuristic
A CheapestAdditionFilteredHeuristic where the notion of 'cheapest arc' comes from an arc evaluator.
Definition: routing.h:3444
operations_research::RoutingModel::VehicleClass::dimension_start_cumuls_max
gtl::ITIVector< DimensionIndex, int64 > dimension_start_cumuls_max
Definition: routing.h:338
lp_types.h
operations_research::RoutingModel::HasSameVehicleTypeRequirements
bool HasSameVehicleTypeRequirements() const
Returns true iff any same-route (resp.
Definition: routing.h:843
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:1252
operations_research::RoutingModel::GetNonZeroCostClassesCount
int GetNonZeroCostClassesCount() const
Ditto, minus the 'always zero', built-in cost class.
Definition: routing.h:1242
operations_research::RoutingModel::VehicleClass::end_equivalence_class
int end_equivalence_class
Definition: routing.h:334
operations_research::RoutingModel::CostClass::DimensionCost::operator<
bool operator<(const DimensionCost &cost) const
Definition: routing.h:299
operations_research::RoutingModel::VehicleTypeContainer::VehicleClassEntry::vehicle_class
int vehicle_class
Definition: routing.h:358
operations_research::DisjunctivePropagator::DistanceDuration
bool DistanceDuration(Tasks *tasks)
Propagates distance_duration constraints, if any.
Definition: routing_breaks.cc:286
operations_research::SavingsFilteredHeuristic::SavingsFilteredHeuristic
SavingsFilteredHeuristic(RoutingModel *model, const RoutingIndexManager *manager, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
Definition: routing_search.cc:4999
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::SavingsFilteredHeuristic::BuildSolutionInternal
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
Definition: routing_search.cc:5016
operations_research::SavingsFilteredHeuristic::~SavingsFilteredHeuristic
~SavingsFilteredHeuristic() override
Definition: routing_search.cc:5014
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:4121
routing_index_manager.h
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:4298
operations_research::RoutingModel::Start
int64 Start(int vehicle) const
Model inspection.
Definition: routing.h:1155
operations_research::RoutingDimension::forbidden_intervals
const std::vector< SortedDisjointIntervalList > & forbidden_intervals() const
Returns forbidden intervals for each node.
Definition: routing.h:2320
operations_research::RoutingDimension::vehicle_to_class
int vehicle_to_class(int vehicle) const
Definition: routing.h:2387
operations_research::CheapestInsertionFilteredHeuristic::Seed
std::pair< StartEndValue, int > Seed
Definition: routing.h:3049
operations_research::IntVarFilteredDecisionBuilder
Decision builder building a solution using heuristics with local search filters to evaluate its feasi...
Definition: routing.h:2897
operations_research::ChristofidesFilteredHeuristic::BuildSolutionInternal
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
Definition: routing_search.cc:5567
operations_research::CheapestInsertionFilteredHeuristic
Definition: routing.h:3029
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:6598
operations_research::RoutingDimension::HasQuadraticCostSoftSpanUpperBounds
bool HasQuadraticCostSoftSpanUpperBounds() const
Definition: routing.h:2651
operations_research::RoutingModel::GetTopologicallySortedVisitTypes
const std::vector< int > & GetTopologicallySortedVisitTypes() const
Definition: routing.h:781
commandlineflags.h
operations_research::DisjunctivePropagator::Tasks::end_min
std::vector< int64 > end_min
Definition: routing.h:1887
parameters
SatParameters parameters
Definition: cp_model_fz_solver.cc:107
operations_research::IntVarFilteredHeuristic::BuildSolution
Assignment *const BuildSolution()
Builds a solution.
Definition: routing_search.cc:2766
operations_research::RoutingTransitCallback2
std::function< int64(int64, int64)> RoutingTransitCallback2
Definition: routing_types.h:42
operations_research::MakeNodeDisjunctionFilter
IntVarLocalSearchFilter * MakeNodeDisjunctionFilter(const RoutingModel &routing_model)
Definition: routing_search.cc:280
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::RoutingModel::VehicleClass
Definition: routing.h:322
name
const std::string name
Definition: default_search.cc:807
operations_research::SweepArranger::SetSectors
void SetSectors(int sectors)
Definition: routing.h:2794
operations_research::RoutingModel::RegisterTransitCallback
int RegisterTransitCallback(TransitCallback2 callback)
Definition: routing.cc:884
operations_research::CheapestAdditionFilteredHeuristic::CheapestAdditionFilteredHeuristic
CheapestAdditionFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager)
Definition: routing_search.cc:4354
parameters.pb.h
operations_research::RoutingModel::VehicleCostsConsideredVar
IntVar * VehicleCostsConsideredVar(int vehicle) const
Returns the variable specifying whether or not costs are considered for vehicle.
Definition: routing.h:1192
operations_research::RoutingModel::HasTemporalTypeIncompatibilities
bool HasTemporalTypeIncompatibilities() const
Definition: routing.h:801
operations_research::RangeIntToIntFunction
Definition: range_query_function.h:28
operations_research::TypeRegulationsChecker::OnInitializeCheck
virtual void OnInitializeCheck()
Definition: routing.h:2126
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::status
Status status() const
Returns the current status of the routing model.
Definition: routing.h:1018
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:759
kint64max
static const int64 kint64max
Definition: integral_types.h:62
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:3884
operations_research::RangeMinMaxIndexFunction
Definition: range_query_function.h:58
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:1728
operations_research::TypeRegulationsConstraint::Post
void Post() override
Definition: routing.cc:6412
lp_solver.h
operations_research::SimpleBoundCosts::Size
int Size()
Definition: routing.h:2259
operations_research::RoutingModel::VehicleTypeContainer::vehicles_per_vehicle_class
std::vector< std::deque< int > > vehicles_per_vehicle_class
Definition: routing.h:377
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:3630
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:4232
operations_research::ParallelSavingsFilteredHeuristic::DebugString
std::string DebugString() const override
Definition: routing.h:3626
operations_research::RoutingDimension::AddNodePrecedence
void AddNodePrecedence(NodePrecedence precedence)
Definition: routing.h:2577
operations_research::SequentialSavingsFilteredHeuristic
Definition: routing.h:3597
operations_research::VehicleTypeCurator::NumTypes
int NumTypes() const
Definition: routing.h:2819
operations_research::IntVarFilteredHeuristic::SynchronizeFilters
void SynchronizeFilters()
Synchronizes filters with an assignment (the current solution).
Definition: routing_search.cc:2838