14 #ifndef OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_SEARCH_H_ 15 #define OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_SEARCH_H_ 17 #include <sys/types.h> 29 #include "absl/container/flat_hash_set.h" 43 class IntVarFilteredHeuristic;
45 class VehicleTypeCurator {
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);
1071 #endif // OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_SEARCH_H_ bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
int Type(int vehicle) const
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...
std::function< bool(int64_t, int64_t, int64_t)> VariableValueComparator
int64_t Value(int64_t index) const
Returns the value of the variable of index 'index' in the last committed solution.
std::string DebugString() const override
~LocalCheapestInsertionFilteredHeuristic() override
CheapestAdditionFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager)
std::string DebugString() const override
~RoutingFilteredHeuristic() override
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
std::unique_ptr< VehicleTypeCurator > vehicle_type_curator_
std::unique_ptr< SavingsContainer< Saving > > savings_container_
IntVarElement * FastAdd(IntVar *const var)
Adds without checking if variable has been previously added.
~SavingsFilteredHeuristic() override
int64_t GetUnperformedValue(int64_t node_to_insert) const
Returns the cost of unperforming node 'node_to_insert'.
IntVar * VehicleVar(int64_t index) const
Returns the vehicle variable of the node corresponding to index.
bool Contains(int64_t index) const
Returns true if the variable of index 'index' is in the current solution.
void SetValue(const IntVar *const var, int64_t value)
int Size() const
Returns the number of variables the decision builder is trying to instantiate.
virtual ~IntVarFilteredHeuristic()
Filter-based heuristic dedicated to routing.
void ReinjectVehicleOfClass(int vehicle, int vehicle_class, int64_t fixed_cost)
double farthest_seeds_ratio
The ratio of routes on which to insert farthest nodes as seeds before starting the cheapest insertion...
bool add_reverse_arcs
If add_reverse_arcs is true, the neighborhood relationships are considered symmetrically.
int64_t GetVehicleTypeFromSaving(const Saving &saving) const
Returns the cost class from a saving.
virtual double ExtraSavingsMemoryMultiplicativeFactor() const =0
IntVarFilteredHeuristic(Solver *solver, const std::vector< IntVar * > &vars, LocalSearchFilterManager *filter_manager)
IntVar * Var(int64_t index) const
Returns the variable of index 'index'.
RoutingModel * model() const
std::string DebugString() const override
double neighbors_ratio
If neighbors_ratio < 1 then for each node only this ratio of its neighbors leading to the smallest ar...
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.
int64_t End(int vehicle) const
Returns the variable index of the ending node of a vehicle route.
int64_t number_of_decisions() const
Returns statistics on search, number of decisions sent to filters, number of decisions rejected by fi...
int64_t GetBeforeNodeFromSaving(const Saving &saving) const
Returns the "before node" from a saving.
std::function< int64_t(int64_t)> penalty_evaluator_
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...
const E & Element(const V *const var) const
static int64_t FastInt64Round(double x)
Decision * Next(Solver *solver) override
This is the main method of the decision builder class.
A DecisionBuilder is responsible for creating the search tree.
EvaluatorCheapestAdditionFilteredHeuristic(RoutingModel *model, std::function< int64_t(int64_t, int64_t)> evaluator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
const Assignment * BuildSolutionFromRoutes(const std::function< int64_t(int64_t)> &next_accessor)
Builds a solution starting from the routes formed by the next accessor.
std::string DebugString() const override
bool StopSearch() override
Returns true if the search must be stopped.
ComparatorCheapestAdditionFilteredHeuristic(RoutingModel *model, Solver::VariableValueComparator comparator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
Filter-base decision builder which builds a solution by inserting nodes at their cheapest position.
Generic filter-based heuristic applied to IntVars.
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.
A CheapestAdditionFilteredHeuristic where the notion of 'cheapest arc' comes from an arc evaluator.
Christofides addition heuristic.
void ResetSolution()
Resets the data members for a new solution.
Filter manager: when a move is made, filters are executed to decide whether the solution is feasible ...
void MakeUnassignedNodesUnperformed()
Make all unassigned nodes unperformed.
int64_t number_of_rejects() const
RoutingFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager)
double arc_coefficient
arc_coefficient is a strictly positive parameter indicating the coefficient of the arc being consider...
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
bool BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
A CheapestAdditionFilteredHeuristic where the notion of 'cheapest arc' comes from an arc comparator.
std::pair< int64_t, int64_t > Saving
~CheapestAdditionFilteredHeuristic() override
~CheapestInsertionFilteredHeuristic() override
virtual void ResetVehicleIndices()
~IntVarFilteredDecisionBuilder() override
virtual bool BuildSolutionInternal()=0
Virtual method to redefine how to build a solution.
bool VehicleIsEmpty(int vehicle) const
double max_memory_usage_bytes
The number of neighbors considered for each node is also adapted so that the stored Savings don't use...
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,...
friend class SavingsFilteredHeuristicTestPeer
virtual bool StopSearch()
Returns true if the search must be stopped.
double neighbors_ratio
If neighbors_ratio < 1 then for each node only this ratio of its neighbors leading to the smallest ar...
bool operator<(const NodeInsertion &other) const
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...
~ComparatorCheapestAdditionFilteredHeuristic() override
Filter-based decision builder which builds a solution by using Clarke & Wright's Savings heuristic.
std::string DebugString() const override
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.
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 BuildSolutionInternal() override
Virtual method to redefine how to build a solution.
bool operator<(const StartEndValue &other) const
void MakePartiallyPerformedPairsUnperformed()
Make all partially performed pickup and delivery pairs unperformed.
An Assignment is a variable -> domains mapping, used to report solutions to the user.
virtual uint64_t Size() const =0
This method returns the number of values in the domain of the variable.
The class IntVar is a subset of IntExpr.
int64_t num_allowed_vehicles
void SetValue(int64_t index, int64_t value)
Modifies the current solution by setting the variable of index 'index' to value 'value'.
Assignment *const assignment_
Filter-based decision builder which builds a solution by inserting nodes at their cheapest position o...
FirstSolutionStrategy_Value
void SynchronizeFilters()
Synchronizes filters with an assignment (the current solution).
LocalCheapestInsertionFilteredHeuristic(RoutingModel *model, std::function< int64_t(int64_t, int64_t, int64_t)> evaluator, LocalSearchFilterManager *filter_manager)
Takes ownership of evaluator.
Decision builder building a solution using heuristics with local search filters to evaluate its feasi...
std::string DebugString() const override
#define DCHECK(condition)
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.
std::pair< StartEndValue, int > Seed
~ParallelSavingsFilteredHeuristic() override
int64_t GetSavingValue(const Saving &saving) const
Returns the saving value from a saving.
ChristofidesFilteredHeuristic(RoutingModel *model, LocalSearchFilterManager *filter_manager, bool use_minimum_matching)
int vehicles() const
Returns the number of vehicle routes in the model.
RoutingIndexPair IndexPair
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...
void ArrangeIndices(std::vector< int64_t > *indices)
SavingsFilteredHeuristic(RoutingModel *model, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
Filtered-base decision builder based on the addition heuristic, extending a path from its start node ...
bool Commit()
Commits the modifications to the current solution if these modifications are "filter-feasible",...
A Decision represents a choice point in the search tree.
~SequentialSavingsFilteredHeuristic() override
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 SetVehicleIndex(int64_t node, int vehicle)
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.
Collection of objects used to extend the Constraint Solver library.
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.
const std::vector< T * > * Raw() const
void SetSectors(int sectors)
SweepArranger(const std::vector< std::pair< int64_t, int64_t >> &points)
DecisionBuilder * MakeAllUnperformed(RoutingModel *model)
int GetLowestFixedCostVehicleOfType(int type) const
int64_t Size() const
Returns the number of next variables in the model.
bool is_sequential
Whether the routes are constructed sequentially or in parallel.
void MakeDisjunctionNodesUnperformed(int64_t node)
Make nodes in the same disjunction as 'node' unperformed.
SequentialSavingsFilteredHeuristic(RoutingModel *model, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
virtual void BuildRoutesFromSavings()=0
std::string DebugString() const override
int GetEndChainStart(int vehicle) const
Returns the start of the end chain of vehicle,.
ParallelSavingsFilteredHeuristic(RoutingModel *model, SavingsParameters parameters, LocalSearchFilterManager *filter_manager)
virtual bool InitializeSolution()
Virtual method to initialize the solution.
std::function< int64_t(int64_t, int64_t, int64_t)> evaluator_
bool use_neighbors_ratio_for_initialization
If true, only closest neighbors (see neighbors_ratio and min_neighbors) are considered as insertion p...
bool CheckLimit()
Returns true if the search limit has been crossed.
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...
~EvaluatorCheapestAdditionFilteredHeuristic() override
int GetStartChainEnd(int vehicle) const
Returns the end of the start chain of vehicle,.
IntVarFilteredDecisionBuilder(std::unique_ptr< IntVarFilteredHeuristic > heuristic)
const IntContainer & IntVarContainer() const
Assignment *const BuildSolution()
Builds a solution.
int Type(int vehicle) const
std::string DebugString() const override
Class to arrange indices by by their distance and their angles from the depot.
VehicleTypeCurator(const RoutingModel::VehicleTypeContainer &vehicle_type_container)
#define DCHECK_LT(val1, val2)
~ChristofidesFilteredHeuristic() override
int64_t GetAfterNodeFromSaving(const Saving &saving) const
Returns the "after node" from a saving.
~GlobalCheapestInsertionFilteredHeuristic() override
DecisionBuilder * MakeSweepDecisionBuilder(RoutingModel *model, bool check_assignment)
virtual std::string DebugString() const
int64_t number_of_rejects() const
int64_t number_of_decisions() const
Returns statistics from its underlying heuristic.