14#ifndef OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_SEARCH_H_
15#define OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_SEARCH_H_
29#include "absl/container/flat_hash_set.h"
43class IntVarFilteredHeuristic;
52 : vehicle_type_container_(&vehicle_type_container) {}
56 int Type(
int vehicle)
const {
return vehicle_type_container_->
Type(vehicle); }
60 void Reset(
const std::function<
bool(
int)>& store_vehicle);
64 void Update(
const std::function<
bool(
int)>& remove_vehicle);
68 const std::set<VehicleClassEntry>& vehicle_classes =
69 sorted_vehicle_classes_per_type_[type];
70 if (vehicle_classes.empty()) {
80 std::vector<int>& vehicles = vehicles_per_vehicle_class_[
vehicle_class];
81 if (vehicles.empty()) {
84 std::set<VehicleClassEntry>& vehicle_classes =
85 sorted_vehicle_classes_per_type_[
Type(vehicle)];
86 const auto& insertion =
90 vehicles.push_back(vehicle);
96 int type,
const std::function<
bool(
int)>& vehicle_is_compatible)
const;
106 int type, std::function<
bool(
int)> vehicle_is_compatible,
107 std::function<
bool(
int)> stop_and_return_vehicle);
110 using VehicleClassEntry =
114 std::vector<std::set<VehicleClassEntry> > sorted_vehicle_classes_per_type_;
115 std::vector<std::vector<int> > vehicles_per_vehicle_class_;
123 bool has_node_precedences,
124 bool has_single_vehicle_node);
145 std::unique_ptr<IntVarFilteredHeuristic> heuristic);
158 const std::unique_ptr<IntVarFilteredHeuristic> heuristic_;
178 virtual std::string
DebugString()
const {
return "IntVarFilteredHeuristic"; }
196 if (!is_in_delta_[
index]) {
198 delta_indices_.push_back(
index);
199 is_in_delta_[
index] =
true;
215 int Size()
const {
return vars_.size(); }
229 const std::vector<IntVar*> vars_;
231 std::vector<int> delta_indices_;
232 std::vector<bool> is_in_delta_;
236 int64_t number_of_decisions_;
237 int64_t number_of_rejects_;
248 const std::function<int64_t(int64_t)>& next_accessor);
275 bool InitializeSolution()
override;
278 std::vector<int64_t> start_chain_ends_;
279 std::vector<int64_t> end_chain_starts_;
287 std::function<int64_t(int64_t, int64_t, int64_t)> evaluator,
288 std::function<int64_t(int64_t)> penalty_evaluator,
322 std::vector<std::vector<StartEndValue> >
329 template <
class Queue>
331 std::vector<std::vector<StartEndValue> >* start_end_distances_per_node,
332 Queue* priority_queue);
339 void InsertBetween(int64_t node, int64_t predecessor, int64_t successor);
345 int64_t node_to_insert, int64_t
start, int64_t next_after_start,
346 int vehicle, std::vector<NodeInsertion>* node_insertions);
354 int64_t insert_after,
355 int64_t insert_before,
361 std::function<int64_t(int64_t, int64_t, int64_t)>
evaluator_;
402 std::function<int64_t(int64_t, int64_t, int64_t)> evaluator,
403 std::function<int64_t(int64_t)> penalty_evaluator,
409 return "GlobalCheapestInsertionFilteredHeuristic";
416 typedef absl::flat_hash_set<PairEntry*> PairEntries;
417 typedef absl::flat_hash_set<NodeEntry*> NodeEntries;
425 bool InsertPairsAndNodesByRequirementTopologicalOrder();
434 const std::map<int64_t, std::vector<int>>& pair_indices_by_bucket);
439 bool UseEmptyVehicleTypeCuratorForVehicle(
int vehicle,
440 bool all_vehicles =
true) {
450 bool InsertPairEntryUsingEmptyVehicleTypeCurator(
451 const std::vector<int>& pair_indices, PairEntry*
const pair_entry,
453 std::vector<PairEntries>* pickup_to_entries,
454 std::vector<PairEntries>* delivery_to_entries);
463 bool InsertNodesOnRoutes(
464 const std::map<int64_t, std::vector<int>>& nodes_by_bucket,
465 const absl::flat_hash_set<int>& vehicles);
474 bool InsertNodeEntryUsingEmptyVehicleTypeCurator(
475 const std::vector<int>&
nodes,
bool all_vehicles,
476 NodeEntry*
const node_entry,
478 std::vector<NodeEntries>* position_to_node_entries);
485 bool SequentialInsertNodes(
486 const std::map<int64_t, std::vector<int>>& nodes_by_bucket);
491 void DetectUsedVehicles(std::vector<bool>* is_vehicle_used,
492 std::vector<int>* unused_vehicles,
493 absl::flat_hash_set<int>* used_vehicles);
498 void InsertFarthestNodesAsSeeds();
508 template <
class Queue>
510 std::vector<std::vector<StartEndValue>>* start_end_distances_per_node,
511 Queue* priority_queue, std::vector<bool>* is_vehicle_used);
516 bool InitializePairPositions(
517 const std::vector<int>& pair_indices,
519 std::vector<PairEntries>* pickup_to_entries,
520 std::vector<PairEntries>* delivery_to_entries);
526 void InitializeInsertionEntriesPerformingPair(
527 int64_t pickup, int64_t delivery,
529 std::vector<PairEntries>* pickup_to_entries,
530 std::vector<PairEntries>* delivery_to_entries);
534 bool UpdateAfterPairInsertion(
535 const std::vector<int>& pair_indices,
int vehicle, int64_t pickup,
536 int64_t pickup_position, int64_t delivery, int64_t delivery_position,
538 std::vector<PairEntries>* pickup_to_entries,
539 std::vector<PairEntries>* delivery_to_entries);
542 bool UpdatePairPositions(
const std::vector<int>& pair_indices,
int vehicle,
543 int64_t insert_after,
545 std::vector<PairEntries>* pickup_to_entries,
546 std::vector<PairEntries>* delivery_to_entries) {
547 return UpdatePickupPositions(pair_indices, vehicle, insert_after,
548 priority_queue, pickup_to_entries,
549 delivery_to_entries) &&
550 UpdateDeliveryPositions(pair_indices, vehicle, insert_after,
551 priority_queue, pickup_to_entries,
552 delivery_to_entries);
556 bool UpdatePickupPositions(
const std::vector<int>& pair_indices,
int vehicle,
557 int64_t pickup_insert_after,
559 std::vector<PairEntries>* pickup_to_entries,
560 std::vector<PairEntries>* delivery_to_entries);
563 bool UpdateDeliveryPositions(
564 const std::vector<int>& pair_indices,
int vehicle,
565 int64_t delivery_insert_after,
567 std::vector<PairEntries>* pickup_to_entries,
568 std::vector<PairEntries>* delivery_to_entries);
571 void DeletePairEntry(PairEntry* entry,
573 std::vector<PairEntries>* pickup_to_entries,
574 std::vector<PairEntries>* delivery_to_entries);
579 void AddPairEntry(int64_t pickup, int64_t pickup_insert_after,
580 int64_t delivery, int64_t delivery_insert_after,
583 std::vector<PairEntries>* pickup_entries,
584 std::vector<PairEntries>* delivery_entries)
const;
587 void UpdatePairEntry(
588 PairEntry*
const pair_entry,
593 int64_t GetInsertionValueForPairAtPositions(int64_t pickup,
594 int64_t pickup_insert_after,
596 int64_t delivery_insert_after,
601 bool InitializePositions(
const std::vector<int>&
nodes,
602 const absl::flat_hash_set<int>& vehicles,
604 std::vector<NodeEntries>* position_to_node_entries);
610 void InitializeInsertionEntriesPerformingNode(
611 int64_t node,
const absl::flat_hash_set<int>& vehicles,
613 std::vector<NodeEntries>* position_to_node_entries);
616 bool UpdatePositions(
const std::vector<int>&
nodes,
int vehicle,
617 int64_t insert_after,
bool all_vehicles,
619 std::vector<NodeEntries>* node_entries);
622 void DeleteNodeEntry(NodeEntry* entry,
624 std::vector<NodeEntries>* node_entries);
629 void AddNodeEntry(int64_t node, int64_t insert_after,
int vehicle,
632 std::vector<NodeEntries>* node_entries)
const;
635 void UpdateNodeEntry(
636 NodeEntry*
const node_entry,
641 void ComputeNeighborhoods();
645 bool IsNeighborForCostClass(
int cost_class, int64_t node_index,
646 int64_t neighbor_index)
const;
649 const std::vector<int64_t>& GetNeighborsOfNodeForCostClass(
650 int cost_class, int64_t node_index)
const {
653 : node_index_to_neighbors_by_cost_class_[node_index][cost_class]
654 ->PositionsSetAtLeastOnce();
657 int64_t NumNonStartEndNodes()
const {
661 int64_t NumNeighbors()
const {
664 NumNonStartEndNodes()));
667 void ResetVehicleIndices()
override {
668 node_index_to_vehicle_.assign(node_index_to_vehicle_.size(), -1);
671 void SetVehicleIndex(int64_t node,
int vehicle)
override {
672 DCHECK_LT(node, node_index_to_vehicle_.size());
673 node_index_to_vehicle_[node] = vehicle;
678 bool CheckVehicleIndices()
const;
681 int64_t GetBucketOfNode(
int node)
const {
687 int64_t max_pickup_bucket = 0;
688 for (int64_t pickup : index_pair.first) {
689 max_pickup_bucket =
std::max(max_pickup_bucket, GetBucketOfNode(pickup));
691 int64_t max_delivery_bucket = 0;
692 for (int64_t delivery : index_pair.second) {
693 max_delivery_bucket =
694 std::max(max_delivery_bucket, GetBucketOfNode(delivery));
696 return std::min(max_pickup_bucket, max_delivery_bucket);
704 for (T*
const entry : *priority_queue->
Raw()) {
707 priority_queue->
Clear();
711 GlobalCheapestInsertionParameters gci_params_;
713 std::vector<int> node_index_to_vehicle_;
716 std::vector<std::vector<std::unique_ptr<SparseBitset<int64_t> > > >
717 node_index_to_neighbors_by_cost_class_;
720 std::unique_ptr<VehicleTypeCurator> empty_vehicle_type_curator_;
725 std::vector<int64_t> all_nodes_;
739 std::function<int64_t(int64_t, int64_t, int64_t)> evaluator,
744 return "LocalCheapestInsertionFilteredHeuristic";
752 void ComputeEvaluatorSortedPositions(
753 int64_t node, std::vector<NodeInsertion>* sorted_insertions);
758 void ComputeEvaluatorSortedPositionsOnRouteAfter(
759 int64_t node, int64_t
start, int64_t next_after_start,
int vehicle,
760 std::vector<NodeInsertion>* sorted_insertions);
762 std::vector<std::vector<StartEndValue>> start_end_distances_per_node_;
775 class PartialRoutesAndLargeVehicleIndicesFirst {
777 explicit PartialRoutesAndLargeVehicleIndicesFirst(
779 : builder_(builder) {}
780 bool operator()(
int vehicle1,
int vehicle2)
const;
786 template <
typename Iterator>
787 std::vector<int64_t> GetPossibleNextsFromIterator(int64_t node,
789 Iterator
end)
const {
791 std::vector<int64_t> nexts;
792 for (Iterator it =
start; it !=
end; ++it) {
793 const int64_t
next = *it;
795 nexts.push_back(
next);
801 virtual void SortSuccessors(int64_t node,
802 std::vector<int64_t>* successors) = 0;
803 virtual int64_t FindTopSuccessor(int64_t node,
804 const std::vector<int64_t>& successors) = 0;
818 return "EvaluatorCheapestAdditionFilteredHeuristic";
823 void SortSuccessors(int64_t node, std::vector<int64_t>* successors)
override;
824 int64_t FindTopSuccessor(int64_t node,
825 const std::vector<int64_t>& successors)
override;
827 std::function<int64_t(int64_t, int64_t)> evaluator_;
841 return "ComparatorCheapestAdditionFilteredHeuristic";
846 void SortSuccessors(int64_t node, std::vector<int64_t>* successors)
override;
847 int64_t FindTopSuccessor(int64_t node,
848 const std::vector<int64_t>& successors)
override;
884 typedef std::pair< int64_t, int64_t>
Saving;
886 template <
typename S>
895 return saving.second / size_squared_;
899 return (saving.second % size_squared_) /
Size();
903 return (saving.second % size_squared_) %
Size();
931 void AddSymmetricArcsToAdjacencyLists(
932 std::vector<std::vector<int64_t> >* adjacency_lists);
943 bool ComputeSavings();
945 Saving BuildSaving(int64_t saving,
int vehicle_type,
int before_node,
946 int after_node)
const {
947 return std::make_pair(saving, vehicle_type * size_squared_ +
948 before_node *
Size() + after_node);
954 int64_t MaxNumNeighborsPerNode(
int num_vehicle_types)
const;
956 const SavingsParameters savings_params_;
957 int64_t size_squared_;
970 return "SequentialSavingsFilteredHeuristic";
978 void BuildRoutesFromSavings()
override;
979 double ExtraSavingsMemoryMultiplicativeFactor()
const override {
return 1.0; }
990 return "ParallelSavingsFilteredHeuristic";
1004 void BuildRoutesFromSavings()
override;
1006 double ExtraSavingsMemoryMultiplicativeFactor()
const override {
return 2.0; }
1012 void MergeRoutes(
int first_vehicle,
int second_vehicle, int64_t before_node,
1013 int64_t after_node);
1016 std::vector<int64_t> first_node_on_route_;
1017 std::vector<int64_t> last_node_on_route_;
1021 std::vector<int> vehicle_of_first_or_last_node_;
1032 bool use_minimum_matching);
1036 return "ChristofidesFilteredHeuristic";
1040 const bool use_minimum_matching_;
1048 const std::vector<std::pair<int64_t, int64_t>>& points);
1054 std::vector<int> coordinates_;
1064 bool check_assignment);
#define DCHECK_LT(val1, val2)
#define DCHECK(condition)
const std::vector< T * > * Raw() const
const E & Element(const V *const var) const
An Assignment is a variable -> domains mapping, used to report solutions to the user.
void SetValue(const IntVar *const var, int64_t value)
const IntContainer & IntVarContainer() const
IntVarElement * FastAdd(IntVar *const var)
Adds without checking if variable has been previously added.
Filtered-base decision builder based on the addition heuristic, extending a path from its start node ...
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
~CheapestAdditionFilteredHeuristic() override
CheapestAdditionFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager)
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...
std::function< int64_t(int64_t, int64_t, int64_t)> evaluator_
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,...
int64_t GetInsertionCostForNodeAtPosition(int64_t node_to_insert, int64_t insert_after, int64_t insert_before, int vehicle) const
Returns the cost of inserting 'node_to_insert' between 'insert_after' and 'insert_before' on the 'veh...
~CheapestInsertionFilteredHeuristic() override
int64_t GetUnperformedValue(int64_t node_to_insert) const
Returns the cost of unperforming node 'node_to_insert'.
std::function< int64_t(int64_t)> penalty_evaluator_
CheapestInsertionFilteredHeuristic(RoutingModel *model, std::function< int64_t(int64_t, int64_t, int64_t)> evaluator, std::function< int64_t(int64_t)> penalty_evaluator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
void InsertBetween(int64_t node, int64_t predecessor, int64_t successor)
Inserts 'node' just after 'predecessor', and just before 'successor', resulting in the following subs...
void AppendInsertionPositionsAfter(int64_t node_to_insert, int64_t start, int64_t next_after_start, int vehicle, std::vector< NodeInsertion > *node_insertions)
Helper method to the ComputeEvaluatorSortedPositions* methods.
std::pair< StartEndValue, int > Seed
Christofides addition heuristic.
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
~ChristofidesFilteredHeuristic() override
std::string DebugString() const override
ChristofidesFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager, bool use_minimum_matching)
A CheapestAdditionFilteredHeuristic where the notion of 'cheapest arc' comes from an arc comparator.
ComparatorCheapestAdditionFilteredHeuristic(RoutingModel *model, Solver::VariableValueComparator comparator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
~ComparatorCheapestAdditionFilteredHeuristic() override
std::string DebugString() const override
A DecisionBuilder is responsible for creating the search tree.
A Decision represents a choice point in the search tree.
A CheapestAdditionFilteredHeuristic where the notion of 'cheapest arc' comes from an arc evaluator.
EvaluatorCheapestAdditionFilteredHeuristic(RoutingModel *model, std::function< int64_t(int64_t, int64_t)> evaluator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
~EvaluatorCheapestAdditionFilteredHeuristic() override
std::string DebugString() const override
Filter-based decision builder which builds a solution by inserting nodes at their cheapest position o...
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
GlobalCheapestInsertionFilteredHeuristic(RoutingModel *model, std::function< int64_t(int64_t, int64_t, int64_t)> evaluator, std::function< int64_t(int64_t)> penalty_evaluator, LocalSearchFilterManager *filter_manager, GlobalCheapestInsertionParameters parameters)
Takes ownership of evaluators.
~GlobalCheapestInsertionFilteredHeuristic() override
std::string DebugString() const override
Decision builder building a solution using heuristics with local search filters to evaluate its feasi...
~IntVarFilteredDecisionBuilder() override
Decision * Next(Solver *solver) override
This is the main method of the decision builder class.
int64_t number_of_decisions() const
Returns statistics from its underlying heuristic.
IntVarFilteredDecisionBuilder(std::unique_ptr< IntVarFilteredHeuristic > heuristic)
std::string DebugString() const override
int64_t number_of_rejects() const
Generic filter-based heuristic applied to IntVars.
void SetValue(int64_t index, int64_t value)
Modifies the current solution by setting the variable of index 'index' to value 'value'.
virtual bool BuildSolutionInternal()=0
Virtual method to redefine how to build a solution.
int Size() const
Returns the number of variables the decision builder is trying to instantiate.
bool Contains(int64_t index) const
Returns true if the variable of index 'index' is in the current solution.
bool Commit()
Commits the modifications to the current solution if these modifications are "filter-feasible",...
virtual ~IntVarFilteredHeuristic()
virtual bool StopSearch()
Returns true if the search must be stopped.
Assignment *const assignment_
void ResetSolution()
Resets the data members for a new solution.
void SynchronizeFilters()
Synchronizes filters with an assignment (the current solution).
virtual std::string DebugString() const
virtual bool InitializeSolution()
Virtual method to initialize the solution.
int64_t number_of_decisions() const
Returns statistics on search, number of decisions sent to filters, number of decisions rejected by fi...
IntVar * Var(int64_t index) const
Returns the variable of index 'index'.
int64_t Value(int64_t index) const
Returns the value of the variable of index 'index' in the last committed solution.
IntVarFilteredHeuristic(Solver *solver, const std::vector< IntVar * > &vars, LocalSearchFilterManager *filter_manager)
Assignment *const BuildSolution()
Builds a solution.
int64_t number_of_rejects() const
The class IntVar is a subset of IntExpr.
virtual uint64_t Size() const =0
This method returns the number of values in the domain of the variable.
Filter-base decision builder which builds a solution by inserting nodes at their cheapest position.
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
~LocalCheapestInsertionFilteredHeuristic() override
LocalCheapestInsertionFilteredHeuristic(RoutingModel *model, std::function< int64_t(int64_t, int64_t, int64_t)> evaluator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
std::string DebugString() const override
Filter manager: when a move is made, filters are executed to decide whether the solution is feasible ...
static int64_t FastInt64Round(double x)
ParallelSavingsFilteredHeuristic(RoutingModel *model, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
~ParallelSavingsFilteredHeuristic() override
std::string DebugString() const override
Filter-based heuristic dedicated to routing.
~RoutingFilteredHeuristic() override
int GetStartChainEnd(int vehicle) const
Returns the end of the start chain of vehicle,.
virtual void SetVehicleIndex(int64_t node, int vehicle)
int GetEndChainStart(int vehicle) const
Returns the start of the end chain of vehicle,.
RoutingModel * model() const
void MakeDisjunctionNodesUnperformed(int64_t node)
Make nodes in the same disjunction as 'node' unperformed.
bool StopSearch() override
Returns true if the search must be stopped.
void MakeUnassignedNodesUnperformed()
Make all unassigned nodes unperformed.
virtual void ResetVehicleIndices()
void MakePartiallyPerformedPairsUnperformed()
Make all partially performed pickup and delivery pairs unperformed.
bool VehicleIsEmpty(int vehicle) const
const Assignment * BuildSolutionFromRoutes(const std::function< int64_t(int64_t)> &next_accessor)
Builds a solution starting from the routes formed by the next accessor.
RoutingFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager)
RoutingIndexPair IndexPair
bool CheckLimit()
Returns true if the search limit has been crossed.
IntVar * VehicleVar(int64_t index) const
Returns the vehicle variable of the node corresponding to index.
int64_t Size() const
Returns the number of next variables in the model.
int vehicles() const
Returns the number of vehicle routes in the model.
int64_t End(int vehicle) const
Returns the variable index of the ending node of a vehicle route.
Filter-based decision builder which builds a solution by using Clarke & Wright's Savings heuristic.
SavingsFilteredHeuristic(RoutingModel *model, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
int64_t GetVehicleTypeFromSaving(const Saving &saving) const
Returns the cost class from a saving.
std::unique_ptr< VehicleTypeCurator > vehicle_type_curator_
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
int64_t GetAfterNodeFromSaving(const Saving &saving) const
Returns the "after node" from a saving.
int64_t GetSavingValue(const Saving &saving) const
Returns the saving value from a saving.
std::pair< int64_t, int64_t > Saving
std::unique_ptr< SavingsContainer< Saving > > savings_container_
~SavingsFilteredHeuristic() override
virtual double ExtraSavingsMemoryMultiplicativeFactor() const =0
friend class SavingsFilteredHeuristicTestPeer
int64_t GetBeforeNodeFromSaving(const Saving &saving) const
Returns the "before node" from a saving.
int StartNewRouteWithBestVehicleOfType(int type, int64_t before_node, int64_t after_node)
Finds the best available vehicle of type "type" to start a new route to serve the arc before_node-->a...
virtual void BuildRoutesFromSavings()=0
~SequentialSavingsFilteredHeuristic() override
SequentialSavingsFilteredHeuristic(RoutingModel *model, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
std::string DebugString() const override
std::function< bool(int64_t, int64_t, int64_t)> VariableValueComparator
Class to arrange indices by by their distance and their angles from the depot.
SweepArranger(const std::vector< std::pair< int64_t, int64_t > > &points)
void ArrangeIndices(std::vector< int64_t > *indices)
void SetSectors(int sectors)
Helper class that manages vehicles.
void Update(const std::function< bool(int)> &remove_vehicle)
Goes through all the currently stored vehicles and removes vehicles for which remove_vehicle() return...
bool HasCompatibleVehicleOfType(int type, const std::function< bool(int)> &vehicle_is_compatible) const
Searches a compatible vehicle of the given type; returns false if none was found.
std::pair< int, int > GetCompatibleVehicleOfType(int type, std::function< bool(int)> vehicle_is_compatible, std::function< bool(int)> stop_and_return_vehicle)
Searches for the best compatible vehicle of the given type, i.e.
VehicleTypeCurator(const RoutingModel::VehicleTypeContainer &vehicle_type_container)
void Reset(const std::function< bool(int)> &store_vehicle)
Resets the vehicles stored, storing only vehicles from the vehicle_type_container_ for which store_ve...
int Type(int vehicle) const
void ReinjectVehicleOfClass(int vehicle, int vehicle_class, int64_t fixed_cost)
int GetLowestFixedCostVehicleOfType(int type) const
Collection of objects used to extend the Constraint Solver library.
DecisionBuilder * MakeAllUnperformed(RoutingModel *model)
FirstSolutionStrategy_Value
FirstSolutionStrategy::Value AutomaticFirstSolutionStrategy(bool has_pickup_deliveries, bool has_node_precedences, bool has_single_vehicle_node)
Returns the best value for the automatic first solution strategy, based on the given model parameters...
DecisionBuilder * MakeSweepDecisionBuilder(RoutingModel *model, bool check_assignment)
std::optional< int64_t > end
bool operator<(const NodeInsertion &other) const
bool operator<(const StartEndValue &other) const
int64_t num_allowed_vehicles
double neighbors_ratio
If neighbors_ratio < 1 then for each node only this ratio of its neighbors leading to the smallest ar...
bool is_sequential
Whether the routes are constructed sequentially or in parallel.
double farthest_seeds_ratio
The ratio of routes on which to insert farthest nodes as seeds before starting the cheapest insertion...
bool use_neighbors_ratio_for_initialization
If true, only closest neighbors (see neighbors_ratio and min_neighbors) are considered as insertion p...
bool add_unperformed_entries
If true, entries are created for making the nodes/pairs unperformed, and when the cost of making a no...
Struct used to sort and store vehicles by their type.
int Type(int vehicle) const
double neighbors_ratio
If neighbors_ratio < 1 then for each node only this ratio of its neighbors leading to the smallest ar...
double arc_coefficient
arc_coefficient is a strictly positive parameter indicating the coefficient of the arc being consider...
double max_memory_usage_bytes
The number of neighbors considered for each node is also adapted so that the stored Savings don't use...
bool add_reverse_arcs
If add_reverse_arcs is true, the neighborhood relationships are considered symmetrically.