14#ifndef OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_NEIGHBORHOODS_H_
15#define OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_NEIGHBORHOODS_H_
25#include "absl/log/check.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_;
127 std::vector<int64_t> current_values_;
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"; }
159 void ResetIncrementalism()
override { ResetChainStatus(); }
160 void OnNodeInitialization()
override { ResetChainStatus(); }
161 void ResetChainStatus() {
162 chain_status_.start = -1;
163 chain_status_.end = -1;
164 chain_status_.has_alternatives =
false;
170 bool has_alternatives =
false;
172 ChainStatus chain_status_;
173 ShortestPathOnAlternatives shortest_path_manager_;
174 std::vector<int64_t> chain_;
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,
214 return "SwapActiveToShortestPath";
219 std::vector<int64_t> chain_;
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"; }
278 void OnNodeInitialization()
override;
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_;
285 const std::vector<PickupDeliveryPair> pairs_;
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"; }
336 return base_index == kPairSecondNodeDestination;
341 return base_index == kPairFirstNode;
345 bool RestartAtPathStartOnSynchronize()
override {
return true; }
347 static constexpr int kPairFirstNode = 0;
348 static constexpr int kPairFirstNodeDestination = 1;
349 static constexpr int kPairSecondNodeDestination = 2;
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);
416 return "LightPairRelocateOperator";
420 std::function<bool(int64_t)> force_lifo_;
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"; }
461 bool RestartAtPathStartOnSynchronize()
override {
return true; }
462 bool ConsiderAlternatives(int64_t )
const override {
465 bool GetPreviousAndSibling(int64_t node, int64_t* previous, int64_t* sibling,
466 int64_t* sibling_previous)
const;
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);
508 return "PairExchangeRelocateOperator";
516 bool RestartAtPathStartOnSynchronize()
override {
return true; }
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"; }
562 bool UpdateActiveNodes();
564 void SetNext(int64_t from, int64_t
to, int64_t path) {
565 DCHECK_LT(from, number_of_nexts_);
567 if (!ignore_path_vars_) {
568 DCHECK_LT(from + number_of_nexts_,
Size());
569 SetValue(from + number_of_nexts_, path);
573 const std::vector<PickupDeliveryPair> pairs_;
577 int64_t first_active_;
578 int64_t second_active_;
579 std::vector<int64_t> prevs_;
580 const int number_of_nexts_;
581 const bool ignore_path_vars_;
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,
593 const std::vector<PickupDeliveryPair>& pairs);
599 return "IndexPairSwapActiveOperator";
603 void OnNodeInitialization()
override;
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,
627 int num_arcs_to_consider,
628 std::function<int64_t(int64_t, int64_t, int64_t)>
629 arc_cost_for_path_start);
635 std::string
DebugString()
const override {
return "RelocateExpensiveChain"; }
638 void OnNodeInitialization()
override;
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,
655 arc_cost_for_path_start_;
659 bool has_non_empty_paths_to_explore_;
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,
666 int num_arcs_to_consider,
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);
688 return "PairNodeSwapActiveOperator";
705 void OnNodeInitialization()
override;
708 std::vector<PickupDeliveryPair> pairs_;
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,
727template <
bool swap_first,
bool ignore_path_vars>
729 swap_first, ignore_path_vars>::GetBaseNodeRestartPosition(
int base_index) {
731 if (base_index == 0 ||
735 return this->BaseNode(base_index - 1);
739template <
bool swap_first,
bool ignore_path_vars>
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])) {
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]) ||
768template <
bool swap_first,
bool ignore_path_vars>
770 const int64_t
base = this->BaseNode(0);
771 if (this->IsPathEnd(
base)) {
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)) &&
787template <
bool swap_first>
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));
802class PickupAndDeliveryData {
805 absl::Span<const PickupDeliveryPair> pairs);
807 DCHECK_LT(node, is_pickup_node_.size());
808 return is_pickup_node_[node];
811 DCHECK_LT(node, is_delivery_node_.size());
812 return is_delivery_node_[node];
815 DCHECK_LT(node, pair_of_node_.size());
816 return pair_of_node_[node];
820 std::vector<bool> is_pickup_node_;
821 std::vector<bool> is_delivery_node_;
822 std::vector<int> pair_of_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,
853 int64_t insertion_node);
855 bool RelocateSubTripFromDelivery(int64_t chain_last_node,
856 int64_t insertion_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,
871 const std::vector<IntVar*>& secondary_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,
940 const std::vector<IntVar*>& secondary_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
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
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
~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
bool MakeNeighbor() override
virtual bool MakeNextNeighbor(Assignment *delta, Assignment *deltadelta)=0
bool MakeOneNeighbor() override
bool OnSamePathAsPreviousBase(int64_t) override
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
~MakePairActiveOperator() override=default
bool RestartAtPathStartOnSynchronize() override
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
bool MakeNeighbor() override
bool MakeNeighbor() override
~MakeRelocateNeighborsOperator() override=default
std::string DebugString() const override
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
~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
bool OnSamePathAsPreviousBase(int64_t base_index) override
~PairExchangeRelocateOperator() override=default
bool RestartAtPathStartOnSynchronize() override
bool MakeNeighbor() override
bool MakeNextNeighbor(Assignment *delta, Assignment *deltadelta) override
--— Base operator class for operators manipulating IntVars --—
std::string DebugString() const override
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)
Section: Implementations of the template classes declared above.
int64_t GetBaseNodeRestartPosition(int base_index) override
~PairNodeSwapActiveOperator() override=default
bool OnSamePathAsPreviousBase(int64_t) override
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
bool ConsiderAlternatives(int64_t base_index) const override
std::string DebugString() const override
~PairRelocateOperator() override=default
int64_t GetBaseNodeRestartPosition(int base_index) override
bool MakeNeighbor() override
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.
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.
int GetPairOfNode(int64_t node) const
PickupAndDeliveryData(int num_nodes, absl::Span< const PickupDeliveryPair > pairs)
bool IsDeliveryNode(int64_t node) const
bool IsPickupNode(int64_t node) const
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
bool MakeNeighbor() override
std::string DebugString() const override
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)
For the time being, Solver is neither MT_SAFE nor MT_HOT.
std::string DebugString() const override
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
bool MakeNextNeighbor(Assignment *delta, Assignment *deltadelta) override
--— Base operator class for operators manipulating IntVars --—
~TwoOptWithShortestPathOperator() override=default
bool RestartAtPathStartOnSynchronize() override
Necessary to have proper information about alternatives of current path.
bool OnSamePathAsPreviousBase(int64_t) override
int64_t GetBaseNodeRestartPosition(int base_index) override
std::string DebugString() const override
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)
In SWIG mode, we don't want anything besides these top-level includes.
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)
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