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"; }
 
  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"; }
 
  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;
 
 
  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"; }
 
  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";
 
 
  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";
 
 
 
  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"; }
 
  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";
 
  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
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.
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