14#ifndef ORTOOLS_CONSTRAINT_SOLVER_ROUTING_ILS_H_
15#define ORTOOLS_CONSTRAINT_SOLVER_ROUTING_ILS_H_
25#include "absl/time/time.h"
78 int64_t visit, std::mt19937& rnd,
79 std::bernoulli_distribution& boolean_dist)
const;
86 int64_t seed_visit, std::mt19937& rnd,
87 std::bernoulli_distribution& boolean_dist,
int size)
const;
91 std::vector<int64_t> nexts_;
92 std::vector<int64_t> prevs_;
93 std::vector<int> route_sizes_;
106 virtual std::function<int64_t(int64_t)>
Ruin(
115 int num_neighbors_for_route_selection);
120 std::function<int64_t(int64_t)>
Ruin(
const Assignment* assignment)
override;
125 const size_t num_routes_;
127 std::uniform_int_distribution<int64_t> node_dist_;
139 int num_neighbors_for_route_selection);
141 std::function<int64_t(int64_t)>
Ruin(
const Assignment* assignment)
override;
145 int64_t GetNextNodeToRemove(
const Assignment* assignment,
int node);
151 const int walk_length_;
152 std::uniform_int_distribution<int64_t> node_dist_;
153 std::bernoulli_distribution boolean_dist_;
167 virtual const std::vector<RuinProcedure*>&
Select() = 0;
176 std::vector<std::unique_ptr<RuinProcedure>> ruin_procedures,
179 std::function<int64_t(int64_t)>
Ruin(
const Assignment* assignment)
override;
183 const Assignment* BuildAssignmentFromNextAccessor(
184 const std::function<int64_t(int64_t)>& next_accessor);
187 std::vector<std::unique_ptr<RuinProcedure>> ruin_procedures_;
188 std::unique_ptr<CompositionStrategy> composition_strategy_;
213 int max_removed_sequence_size,
int avg_num_removed_visits,
214 double bypass_factor,
int num_neighbors);
216 std::function<int64_t(int64_t)>
Ruin(
const Assignment* assignment)
override;
219 int RuinRoute(
const Assignment& assignment, int64_t seed_visit,
220 double global_max_sequence_size);
223 void RuinRouteWithSequenceProcedure(int64_t seed_visit,
int sequence_size);
227 void RuinRouteWithSplitSequenceProcedure(int64_t route, int64_t seed_visit,
232 int max_removed_sequence_size_;
233 int avg_num_removed_visits_;
234 double bypass_factor_;
236 std::uniform_int_distribution<int64_t> node_dist_;
237 std::bernoulli_distribution boolean_dist_;
238 std::uniform_real_distribution<double> probability_dist_;
247 std::mt19937* rnd,
const Assignment* assignment,
248 std::function<
bool()> stop_search,
278 const RoutingModel& model,
const AcceptanceStrategy& acceptance_strategy,
279 const NeighborAcceptanceCriterion::SearchState& final_search_state,
285 const RoutingModel& model,
286 const SimulatedAnnealingAcceptanceStrategy& sa_params, std::mt19937* rnd);
CloseRoutesRemovalRuinProcedure(RoutingModel *model, std::mt19937 *rnd, size_t num_routes, int num_neighbors_for_route_selection)
std::function< int64_t(int64_t)> Ruin(const Assignment *assignment) override
std::vector< RuinProcedure * > ruins_
CompositionStrategy(std::vector< RuinProcedure * > ruin_procedures)
virtual const std::vector< RuinProcedure * > & Select()=0
virtual ~CompositionStrategy()=default
CompositeRuinProcedure(RoutingModel *model, std::vector< std::unique_ptr< RuinProcedure > > ruin_procedures, RuinCompositionStrategy::Value composition_strategy, std::mt19937 *rnd)
std::function< int64_t(int64_t)> Ruin(const Assignment *assignment) override
virtual ~NeighborAcceptanceCriterion()=default
virtual void OnIterationEnd(const Assignment *reference)
virtual bool Accept(const SearchState &search_state, const Assignment *candidate, const Assignment *reference)=0
virtual void OnBestSolutionFound(Assignment *reference)
RandomWalkRemovalRuinProcedure(RoutingModel *model, std::mt19937 *rnd, int walk_length, int num_neighbors_for_route_selection)
std::function< int64_t(int64_t)> Ruin(const Assignment *assignment) override
void RemovePerformedPickupDeliverySibling(int64_t node)
bool BelongsToInitializedRoute(int64_t node) const
void Reset(const Assignment *assignment)
int64_t GetRandomAdjacentVisit(int64_t visit, std::mt19937 &rnd, std::bernoulli_distribution &boolean_dist) const
void InitializeRouteInfoIfNeeded(int vehicle)
std::vector< int64_t > GetRandomSequenceOfVisits(int64_t seed_visit, std::mt19937 &rnd, std::bernoulli_distribution &boolean_dist, int size) const
RoutingSolution(const RoutingModel &model)
bool CanBeRemoved(int64_t node) const
void RemoveNode(int64_t node)
int64_t GetInitializedPrevNodeIndex(int64_t node) const
int GetRouteSize(int vehicle) const
int64_t GetNextNodeIndex(int64_t node) const
RuinCompositionStrategy_Value Value
virtual ~RuinProcedure()=default
virtual std::function< int64_t(int64_t)> Ruin(const Assignment *assignment)=0
SISRRuinProcedure(RoutingModel *model, std::mt19937 *rnd, int max_removed_sequence_size, int avg_num_removed_visits, double bypass_factor, int num_neighbors)
std::function< int64_t(int64_t)> Ruin(const Assignment *assignment) override
std::pair< double, double > GetSimulatedAnnealingTemperatures(const RoutingModel &model, const SimulatedAnnealingAcceptanceStrategy &sa_params, std::mt19937 *rnd)
std::unique_ptr< NeighborAcceptanceCriterion > MakeNeighborAcceptanceCriterion(const RoutingModel &model, const AcceptanceStrategy &acceptance_strategy, const NeighborAcceptanceCriterion::SearchState &final_search_state, std::mt19937 *rnd)
DecisionBuilder * MakePerturbationDecisionBuilder(const RoutingSearchParameters ¶meters, RoutingModel *model, std::mt19937 *rnd, const Assignment *assignment, std::function< bool()> stop_search, LocalSearchFilterManager *filter_manager)
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...