Google OR-Tools: ortools/constraint_solver/routing_neighborhoods.h Source File
14#ifndef ORTOOLS_CONSTRAINT_SOLVER_ROUTING_NEIGHBORHOODS_H_
15#define ORTOOLS_CONSTRAINT_SOLVER_ROUTING_NEIGHBORHOODS_H_
26#include "absl/types/span.h"
56template <bool ignore_path_vars>
60 const std::vector<IntVar*>& vars,
61 const std::vector<IntVar*>& secondary_vars,
62 std::function<int(int64_t)> start_empty_path_class,
63 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
64 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
69 std::string DebugString() const override { return "RelocateNeighbors"; }
78 bool MoveChainAndRepair(int64_t before_chain, int64_t chain_end,
88 int64_t Reposition(int64_t before_to_move, int64_t up_to);
94 Solver* solver, const std::vector<IntVar*>& vars,
95 const std::vector<IntVar*>& secondary_vars,
96 std::function<int(int64_t)> start_empty_path_class,
97 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
98 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
102 Solver* solver, const std::vector<IntVar*>& vars,
103 const std::vector<IntVar*>& secondary_vars,
104 std::function<int(int64_t)> start_empty_path_class,
112 std::vector<std::vector<int64_t>> alternative_sets,
118 absl::Span<const int64_t> GetShortestPath(int64_t source, int64_t sink,
119 absl::Span<const int64_t> chain);
123 std::vector<std::vector<int64_t>> alternative_sets_;
124 std::vector<int> to_alternative_set_;
125 std::vector<int64_t> path_predecessor_;
126 std::vector<int64_t> path_;
134template <bool ignore_path_vars>
138 const std::vector<IntVar*>& vars,
139 const std::vector<IntVar*>& secondary_vars,
140 std::function<int(int64_t)> start_empty_path_class,
141 std::vector<std::vector<int64_t>> alternative_sets,
145 std::string DebugString() const override { return "TwoOptWithShortestPath"; }
164 chain_status_.has_alternatives = false;
170 bool has_alternatives = false;
172 ChainStatus chain_status_;
173 ShortestPathOnAlternatives shortest_path_manager_;
178 Solver* solver, const std::vector<IntVar*>& vars,
179 const std::vector<IntVar*>& secondary_vars,
180 std::function<int(int64_t)> start_empty_path_class,
181 std::vector<std::vector<int64_t>> alternative_sets,
202template <bool ignore_path_vars>
206 const std::vector<IntVar*>& vars,
207 const std::vector<IntVar*>& secondary_vars,
208 std::function<int(int64_t)> start_empty_path_class,
209 std::vector<std::vector<int64_t>> alternative_sets,
223 Solver* solver, const std::vector<IntVar*>& vars,
224 const std::vector<IntVar*>& secondary_vars,
225 std::function<int(int64_t)> start_empty_path_class,
226 std::vector<std::vector<int64_t>> alternative_sets,
252template <bool ignore_path_vars>
256 const std::vector<IntVar*>& secondary_vars,
257 std::function<int(int64_t)> start_empty_path_class,
258 const std::vector<PickupDeliveryPair>& pairs);
261 std::string DebugString() const override { return "MakePairActive"; }
279 int FindNextInactivePair(int pair_index) const;
280 bool ContainsActiveNodes(absl::Span<const int64_t> nodes) const;
283 int inactive_pair_first_index_;
284 int inactive_pair_second_index_;
289 Solver* solver, const std::vector<IntVar*>& vars,
290 const std::vector<IntVar*>& secondary_vars,
291 std::function<int(int64_t)> start_empty_path_class,
292 const std::vector<PickupDeliveryPair>& pairs);
295template <bool ignore_path_vars>
299 const std::vector<IntVar*>& secondary_vars,
300 std::function<int(int64_t)> start_empty_path_class,
301 const std::vector<PickupDeliveryPair>& pairs);
304 std::string DebugString() const override { return "MakePairInActive"; }
308 Solver* solver, const std::vector<IntVar*>& vars,
309 const std::vector<IntVar*>& secondary_vars,
310 std::function<int(int64_t)> start_empty_path_class,
311 const std::vector<PickupDeliveryPair>& pairs);
321template <bool ignore_path_vars>
325 const std::vector<IntVar*>& secondary_vars,
326 std::function<int(int64_t)> start_empty_path_class,
327 const std::vector<PickupDeliveryPair>& pairs);
331 std::string DebugString() const override { return "PairRelocateOperator"; }
347 static constexpr int kPairFirstNode = 0;
348 static constexpr int kPairFirstNodeDestination = 1;
353 Solver* solver, const std::vector<IntVar*>& vars,
354 const std::vector<IntVar*>& secondary_vars,
355 std::function<int(int64_t)> start_empty_path_class,
356 const std::vector<PickupDeliveryPair>& pairs);
360template <bool ignore_path_vars>
364 const std::vector<IntVar*>& vars,
365 const std::vector<IntVar*>& secondary_vars,
366 std::function<int(int64_t)> start_empty_path_class,
367 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
368 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
369 const std::vector<PickupDeliveryPair>& pairs);
373 std::string DebugString() const override { return "GroupPairAndRelocate"; }
377 Solver* solver, const std::vector<IntVar*>& vars,
378 const std::vector<IntVar*>& secondary_vars,
379 std::function<int(int64_t)> start_empty_path_class,
380 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
381 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
382 const std::vector<PickupDeliveryPair>& pairs);
385 Solver* solver, const std::vector<IntVar*>& vars,
386 const std::vector<IntVar*>& secondary_vars,
387 std::function<int(int64_t)> start_empty_path_class,
388 const std::vector<PickupDeliveryPair>& pairs);
401template <bool ignore_path_vars>
405 const std::vector<IntVar*>& vars,
406 const std::vector<IntVar*>& secondary_vars,
407 std::function<int(int64_t)> start_empty_path_class,
408 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
409 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
410 const std::vector<PickupDeliveryPair>& pairs,
411 std::function<bool(int64_t)> force_lifo = nullptr);
424 Solver* solver, const std::vector<IntVar*>& vars,
425 const std::vector<IntVar*>& secondary_vars,
426 std::function<int(int64_t)> start_empty_path_class,
427 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
428 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
429 const std::vector<PickupDeliveryPair>& pairs,
430 std::function<bool(int64_t)> force_lifo = nullptr);
433 Solver* solver, const std::vector<IntVar*>& vars,
434 const std::vector<IntVar*>& secondary_vars,
435 std::function<int(int64_t)> start_empty_path_class,
436 const std::vector<PickupDeliveryPair>& pairs,
437 std::function<bool(int64_t)> force_lifo = nullptr);
445template <bool ignore_path_vars>
449 const std::vector<IntVar*>& vars,
450 const std::vector<IntVar*>& secondary_vars,
451 std::function<int(int64_t)> start_empty_path_class,
452 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
453 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
454 const std::vector<PickupDeliveryPair>& pairs);
458 std::string DebugString() const override { return "PairExchangeOperator"; }
462 bool ConsiderAlternatives(int64_t ) const override {
465 bool GetPreviousAndSibling(int64_t node, int64_t* previous, int64_t* sibling,
470 Solver* solver, const std::vector<IntVar*>& vars,
471 const std::vector<IntVar*>& secondary_vars,
472 std::function<int(int64_t)> start_empty_path_class,
473 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
474 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
475 const std::vector<PickupDeliveryPair>& pairs);
478 Solver* solver, const std::vector<IntVar*>& vars,
479 const std::vector<IntVar*>& secondary_vars,
480 std::function<int(int64_t)> start_empty_path_class,
481 const std::vector<PickupDeliveryPair>& pairs);
496template <bool ignore_path_vars>
500 const std::vector<IntVar*>& vars,
501 const std::vector<IntVar*>& secondary_vars,
502 std::function<int(int64_t)> start_empty_path_class,
503 const std::vector<PickupDeliveryPair>& pairs);
517 bool GetPreviousAndSibling(int64_t node, int64_t* previous, int64_t* sibling,
518 int64_t* sibling_previous) const;
519 bool MoveNode(int pair, int node, int64_t nodes[2][2], int64_t dest[2][2],
521 bool LoadAndCheckDest(int pair, int node, int64_t base_node,
522 int64_t nodes[2][2], int64_t dest[2][2]) const;
524 static constexpr int kFirstPairFirstNode = 0;
525 static constexpr int kSecondPairFirstNode = 1;
526 static constexpr int kFirstPairFirstNodeDestination = 2;
527 static constexpr int kFirstPairSecondNodeDestination = 3;
528 static constexpr int kSecondPairFirstNodeDestination = 4;
529 static constexpr int kSecondPairSecondNodeDestination = 5;
533 Solver* solver, const std::vector<IntVar*>& vars,
534 const std::vector<IntVar*>& secondary_vars,
535 std::function<int(int64_t)> start_empty_path_class,
536 const std::vector<PickupDeliveryPair>& pairs);
551 const std::vector<IntVar*>& path_vars,
552 const std::vector<PickupDeliveryPair>& pairs);
557 std::string DebugString() const override { return "SwapIndexPairOperator"; }
564 void SetNext(int64_t from, int64_t to, int64_t path) {
565 DCHECK_LT(from, number_of_nexts_);
568 DCHECK_LT(from + number_of_nexts_, Size());
569 SetValue(from + number_of_nexts_, path);
573 const std::vector<PickupDeliveryPair> pairs_;
579 std::vector<int64_t> prevs_;
580 const int number_of_nexts_;
586template <bool ignore_path_vars>
590 const std::vector<IntVar*>& vars,
591 const std::vector<IntVar*>& secondary_vars,
592 std::function<int(int64_t)> start_empty_path_class,
609 Solver* solver, const std::vector<IntVar*>& vars,
610 const std::vector<IntVar*>& secondary_vars,
611 std::function<int(int64_t)> start_empty_path_class,
612 const std::vector<PickupDeliveryPair>& pairs);
621template <bool ignore_path_vars>
622class RelocateExpensiveChain : public PathOperator<ignore_path_vars> {
625 const std::vector<IntVar*>& secondary_vars,
626 std::function<int(int64_t)> start_empty_path_class,
628 std::function<int64_t(int64_t, int64_t, int64_t)>
635 std::string DebugString() const override { return "RelocateExpensiveChain"; }
639 void IncrementCurrentPath();
640 bool IncrementCurrentArcIndices();
644 bool FindMostExpensiveChainsOnRemainingPaths();
646 int num_arcs_to_consider_;
648 std::vector<std::pair<int64_t, int>> most_expensive_arc_starts_and_ranks_;
652 current_expensive_arc_indices_;
653 std::function<int64_t( int64_t, int64_t,
663 Solver* solver, const std::vector<IntVar*>& vars,
664 const std::vector<IntVar*>& secondary_vars,
665 std::function<int(int64_t)> start_empty_path_class,
667 std::function<int64_t(int64_t, int64_t, int64_t)> arc_cost_for_path_start);
676template <bool swap_first, bool ignore_path_vars>
680 const std::vector<IntVar*>& secondary_vars,
681 std::function<int(int64_t)> start_empty_path_class,
682 const std::vector<PickupDeliveryPair>& pairs);
687 std::string DebugString() const override {
688 return "PairNodeSwapActiveOperator";
714template <bool swap_first, bool ignore_path_vars>
717 const std::vector<IntVar*>& vars,
718 const std::vector<IntVar*>& secondary_vars,
719 std::function<int(int64_t)> start_empty_path_class,
720 const std::vector<PickupDeliveryPair>& pairs)
721 : PathOperator<ignore_path_vars>(vars, secondary_vars, 2, false, false,
722 std::move(start_empty_path_class), nullptr,
729 swap_first, ignore_path_vars>::GetBaseNodeRestartPosition(int base_index) {
733 return this->StartNode(base_index);
741 ignore_path_vars>::OnNodeInitialization() {
742 for (int i = 0; i < pairs_.size(); ++i) {
743 if (this->IsInactive(pairs_[i].pickup_alternatives[0]) &&
744 this->IsInactive(pairs_[i].delivery_alternatives[0])) {
745 inactive_pair_ = i;
749 inactive_pair_ = pairs_.size();
752template <bool swap_first, bool ignore_path_vars>
755 while (inactive_pair_ < pairs_.size()) {
756 if (!this->IsInactive(pairs_[inactive_pair_].pickup_alternatives[0]) ||
757 !this->IsInactive(pairs_[inactive_pair_].delivery_alternatives[0]) ||
770 const int64_t base = this->BaseNode(0);
771 if (this->IsPathEnd(base)) {
772 return false;
774 const int64_t pair_first = pairs_[inactive_pair_].pickup_alternatives[0];
775 const int64_t pair_second = pairs_[inactive_pair_].delivery_alternatives[0];
777 return this->MakeActive(pair_second, this->BaseNode(1)) &&
781 return this->MakeActive(pair_second, this->BaseNode(1)) &&
782 this->MakeActive(pair_first, base) &&
789 Solver* solver, const std::vector<IntVar*>& vars,
790 const std::vector<IntVar*>& secondary_vars,
791 std::function<int(int64_t)> start_empty_path_class,
792 const std::vector<PickupDeliveryPair>& pairs) {
793 if (secondary_vars.empty()) {
795 vars, secondary_vars, std::move(start_empty_path_class), pairs));
798 vars, secondary_vars, std::move(start_empty_path_class), pairs));
805 absl::Span<const PickupDeliveryPair> pairs);
807 DCHECK_LT(node, is_pickup_node_.size());
808 return is_pickup_node_[node];
821 std::vector<bool> is_delivery_node_;
836template <bool ignore_path_vars>
837class RelocateSubtrip : public PathOperator<ignore_path_vars> {
840 const std::vector<IntVar*>& vars,
841 const std::vector<IntVar*>& secondary_vars,
842 std::function<int(int64_t)> start_empty_path_class,
843 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
844 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
845 absl::Span<const PickupDeliveryPair> pairs);
847 std::string DebugString() const override { return "RelocateSubtrip"; }
852 bool RelocateSubTripFromPickup(int64_t chain_first_node,
855 bool RelocateSubTripFromDelivery(int64_t chain_last_node,
857 void SetPath(absl::Span<const int64_t> path, int path_id);
863 std::vector<bool> opened_pairs_set_;
865 std::vector<int64_t> rejected_nodes_;
866 std::vector<int64_t> subtrip_nodes_;
870 Solver* solver, const std::vector<IntVar*>& vars,
872 std::function<int(int64_t)> start_empty_path_class,
873 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
874 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
875 absl::Span<const PickupDeliveryPair> pairs);
878 Solver* solver, const std::vector<IntVar*>& vars,
879 const std::vector<IntVar*>& secondary_vars,
880 std::function<int(int64_t)> start_empty_path_class,
881 absl::Span<const PickupDeliveryPair> pairs);
883template <bool ignore_path_vars>
887 const std::vector<IntVar*>& vars,
888 const std::vector<IntVar*>& secondary_vars,
889 std::function<int(int64_t)> start_empty_path_class,
890 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
891 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
892 absl::Span<const PickupDeliveryPair> pairs);
894 std::string DebugString() const override { return "ExchangeSubtrip"; }
906 bool ExtractChainsAndCheckCanonical(int64_t base_node,
907 std::vector<int64_t>* rejects,
908 std::vector<int64_t>* subtrip);
914 bool ExtractChainsFromPickup(int64_t base_node, std::vector<int64_t>* rejects,
915 std::vector<int64_t>* subtrip);
921 bool ExtractChainsFromDelivery(int64_t base_node,
922 std::vector<int64_t>* rejects,
923 std::vector<int64_t>* subtrip);
924 void SetPath(absl::Span<const int64_t> path, int path_id);
928 std::vector<bool> opened_pairs_set_;
930 std::vector<int64_t> rejects0_;
931 std::vector<int64_t> subtrip0_;
932 std::vector<int64_t> rejects1_;
933 std::vector<int64_t> subtrip1_;
934 std::vector<int64_t> path0_;
935 std::vector<int64_t> path1_;
939 Solver* solver, const std::vector<IntVar*>& vars,
941 std::function<int(int64_t)> start_empty_path_class,
942 std::function<const std::vector<int>&(int, int)> get_incoming_neighbors,
943 std::function<const std::vector<int>&(int, int)> get_outgoing_neighbors,
944 absl::Span<const PickupDeliveryPair> pairs);
947 Solver* solver, const std::vector<IntVar*>& vars,
948 const std::vector<IntVar*>& secondary_vars,
949 std::function<int(int64_t)> start_empty_path_class,
950 absl::Span<const PickupDeliveryPair> pairs);
bool MakeNeighbor() override
std::string DebugString() const override
Definition routing_neighborhoods.h:898
ExchangeSubtrip(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, absl::Span< const PickupDeliveryPair > pairs)
std::string DebugString() const override
Definition routing_neighborhoods.h:373
GroupPairAndRelocateOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, const std::vector< PickupDeliveryPair > &pairs)
bool MakeNeighbor() override
~GroupPairAndRelocateOperator() override=default
IndexPairSwapActiveOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
bool MakeNeighbor() override
bool MakeNextNeighbor(Assignment *delta, Assignment *deltadelta) override
std::string DebugString() const override
Definition routing_neighborhoods.h:598
~IndexPairSwapActiveOperator() override=default
void SetValue(int64_t index, int64_t value)
IntVarLocalSearchOperator(const std::vector< IntVar * > &vars, bool keep_inverse_values=false)
~LightPairRelocateOperator() override=default
LightPairRelocateOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, const std::vector< PickupDeliveryPair > &pairs, std::function< bool(int64_t)> force_lifo=nullptr)
std::string DebugString() const override
Definition routing_neighborhoods.h:415
bool MakeNeighbor() override
The base class for all local search operators.
virtual bool MakeNextNeighbor(Assignment *delta, Assignment *deltadelta)=0
bool MakeOneNeighbor() override
MakeNextNeighbor() in a subclass of IntVarLocalSearchOperator.
bool OnSamePathAsPreviousBase(int64_t) override
it's currently way more complicated to implement.
Definition routing_neighborhoods.h:265
MakePairActiveOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
std::string DebugString() const override
Definition routing_neighborhoods.h:261
~MakePairActiveOperator() override=default
bool RestartAtPathStartOnSynchronize() override
Definition routing_neighborhoods.h:275
bool MakeNeighbor() override
int64_t GetBaseNodeRestartPosition(int base_index) override
MakePairInactiveOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
std::string DebugString() const override
Definition routing_neighborhoods.h:304
bool MakeNeighbor() override
bool MakeNeighbor() override
~MakeRelocateNeighborsOperator() override=default
std::string DebugString() const override
Definition routing_neighborhoods.h:69
MakeRelocateNeighborsOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, RoutingTransitCallback2 arc_evaluator)
PairExchangeOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, const std::vector< PickupDeliveryPair > &pairs)
bool MakeNeighbor() override
std::string DebugString() const override
Definition routing_neighborhoods.h:458
~PairExchangeOperator() override=default
int64_t GetBaseNodeRestartPosition(int base_index) override
PairExchangeRelocateOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
bool MakeNeighbor() override
std::string DebugString() const override
Definition routing_neighborhoods.h:507
bool OnSamePathAsPreviousBase(int64_t base_index) override
it's currently way more complicated to implement.
~PairExchangeRelocateOperator() override=default
bool RestartAtPathStartOnSynchronize() override
Definition routing_neighborhoods.h:704
bool MakeNeighbor() override
Definition routing_neighborhoods.h:772
bool MakeNextNeighbor(Assignment *delta, Assignment *deltadelta) override
Definition routing_neighborhoods.h:756
std::string DebugString() const override
Definition routing_neighborhoods.h:689
PairNodeSwapActiveOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
Definition routing_neighborhoods.h:719
int64_t GetBaseNodeRestartPosition(int base_index) override
Definition routing_neighborhoods.h:732
~PairNodeSwapActiveOperator() override=default
bool OnSamePathAsPreviousBase(int64_t) override
it's currently way more complicated to implement.
Definition routing_neighborhoods.h:694
PairRelocateOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
bool OnSamePathAsPreviousBase(int64_t base_index) override
it's currently way more complicated to implement.
Definition routing_neighborhoods.h:334
bool ConsiderAlternatives(int64_t base_index) const override
Definition routing_neighborhoods.h:340
std::string DebugString() const override
Definition routing_neighborhoods.h:331
~PairRelocateOperator() override=default
int64_t GetBaseNodeRestartPosition(int base_index) override
bool MakeNeighbor() override
virtual void ResetIncrementalism()
virtual void OnNodeInitialization()
PathOperator(const std::vector< IntVar * > &next_vars, const std::vector< IntVar * > &path_vars, IterationParameters iteration_parameters)
Builds an instance of PathOperator from next and path variables.
virtual bool RestartAtPathStartOnSynchronize()
bool IsInactive(int64_t node) const
Returns true if node is inactive.
int64_t StartNode(int i) const
Returns the start node of the ith base node.
int64_t BaseNode(int i) const
Returns the ith base node of the operator.
A utility class to maintain pickup and delivery information of nodes.
Definition routing_neighborhoods.h:805
int GetPairOfNode(int64_t node) const
Definition routing_neighborhoods.h:817
PickupAndDeliveryData(int num_nodes, absl::Span< const PickupDeliveryPair > pairs)
bool IsDeliveryNode(int64_t node) const
Definition routing_neighborhoods.h:813
bool IsPickupNode(int64_t node) const
Definition routing_neighborhoods.h:809
RelocateExpensiveChain(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, int num_arcs_to_consider, std::function< int64_t(int64_t, int64_t, int64_t)> arc_cost_for_path_start)
~RelocateExpensiveChain() override=default
bool MakeOneNeighbor() override
This method should not be overridden. Override MakeNeighbor() instead.
bool MakeNeighbor() override
std::string DebugString() const override
Definition routing_neighborhoods.h:637
bool MakeNeighbor() override
std::string DebugString() const override
Definition routing_neighborhoods.h:851
RelocateSubtrip(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, absl::Span< const PickupDeliveryPair > pairs)
bool HasAlternatives(int node) const
absl::Span< const int64_t > GetShortestPath(int64_t source, int64_t sink, absl::Span< const int64_t > chain)
ShortestPathOnAlternatives(int num_nodes, std::vector< std::vector< int64_t > > alternative_sets, RoutingTransitCallback2 arc_evaluator)
std::string DebugString() const override
Definition routing_neighborhoods.h:213
bool MakeNeighbor() override
SwapActiveToShortestPathOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::vector< std::vector< int64_t > > alternative_sets, RoutingTransitCallback2 arc_evaluator)
~SwapActiveToShortestPathOperator() override=default
SwapIndexPairOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &path_vars, const std::vector< PickupDeliveryPair > &pairs)
~SwapIndexPairOperator() override=default
std::string DebugString() const override
Definition routing_neighborhoods.h:557
bool MakeNextNeighbor(Assignment *delta, Assignment *deltadelta) override
~TwoOptWithShortestPathOperator() override=default
bool RestartAtPathStartOnSynchronize() override
Definition routing_neighborhoods.h:156
bool OnSamePathAsPreviousBase(int64_t) override
it's currently way more complicated to implement.
Definition routing_neighborhoods.h:148
int64_t GetBaseNodeRestartPosition(int base_index) override
Definition routing_neighborhoods.h:152
std::string DebugString() const override
Definition routing_neighborhoods.h:145
bool MakeNeighbor() override
TwoOptWithShortestPathOperator(const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::vector< std::vector< int64_t > > alternative_sets, RoutingTransitCallback2 arc_evaluator)
LocalSearchOperator * MakePairNodeSwapActive(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
Definition routing_neighborhoods.h:791
LocalSearchOperator * MakeExchangeSubtrip(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, absl::Span< const PickupDeliveryPair > pairs)
LocalSearchOperator * MakePairActive(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
LocalSearchOperator * MakeLightPairRelocate(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, const std::vector< PickupDeliveryPair > &pairs, std::function< bool(int64_t)> force_lifo)
LocalSearchOperator * MakePairExchangeRelocate(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
LocalSearchOperator * MakeGroupPairAndRelocate(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, const std::vector< PickupDeliveryPair > &pairs)
LocalSearchOperator * MakePairInactive(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
LocalSearchOperator * MakePairRelocate(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
LocalSearchOperator * MakeSwapActiveToShortestPath(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::vector< std::vector< int64_t > > alternative_sets, RoutingTransitCallback2 arc_evaluator)
LocalSearchOperator * MakeRelocateExpensiveChain(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, int num_arcs_to_consider, std::function< int64_t(int64_t, int64_t, int64_t)> arc_cost_for_path_start)
LocalSearchOperator * MakeIndexPairSwapActive(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, const std::vector< PickupDeliveryPair > &pairs)
LocalSearchOperator * MakeChainInactive(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class)
--— MakeChainInactive --—
LocalSearchOperator * MakeRelocateSubtrip(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, absl::Span< const PickupDeliveryPair > pairs)
LocalSearchOperator * MakeTwoOptWithShortestPath(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::vector< std::vector< int64_t > > alternative_sets, RoutingTransitCallback2 arc_evaluator)
std::function< int64_t(int64_t, int64_t)> RoutingTransitCallback2
LocalSearchOperator * MakeRelocateNeighbors(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, RoutingTransitCallback2 arc_evaluator)
LocalSearchOperator * MakePairExchange(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors, const std::vector< PickupDeliveryPair > &pairs)
LocalSearchOperator * MakeActive(Solver *solver, const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_incoming_neighbors=nullptr, std::function< const std::vector< int > &(int, int)> get_outgoing_neighbors=nullptr)
--— MakeActive --—
trees with all degrees equal to