18 #include "absl/strings/str_cat.h" 19 #include "absl/time/time.h" 20 #include "google/protobuf/descriptor.h" 21 #include "google/protobuf/duration.pb.h" 22 #include "google/protobuf/message.h" 23 #include "google/protobuf/text_format.h" 42 parameters.set_reduce_vehicle_cost_model(
true);
48 static const char*
const kSearchParameters =
49 "first_solution_strategy: AUTOMATIC " 50 "use_unfiltered_first_solution_strategy: false " 51 "savings_neighbors_ratio: 1 " 52 "savings_max_memory_usage_bytes: 6e9 " 53 "savings_add_reverse_arcs: false " 54 "savings_arc_coefficient: 1 " 55 "savings_parallel_routes: false " 56 "cheapest_insertion_farthest_seeds_ratio: 0 " 57 "cheapest_insertion_first_solution_neighbors_ratio: 1 " 58 "cheapest_insertion_first_solution_min_neighbors: 1 " 59 "cheapest_insertion_ls_operator_neighbors_ratio: 1 " 60 "cheapest_insertion_ls_operator_min_neighbors: 1 " 61 "cheapest_insertion_first_solution_use_neighbors_ratio_for_" 62 "initialization: false " 63 "cheapest_insertion_add_unperformed_entries: false " 64 "local_search_operators {" 65 " use_relocate: BOOL_TRUE" 66 " use_relocate_pair: BOOL_TRUE" 67 " use_light_relocate_pair: BOOL_TRUE" 68 " use_relocate_subtrip: BOOL_TRUE" 69 " use_relocate_neighbors: BOOL_FALSE" 70 " use_exchange: BOOL_TRUE" 71 " use_exchange_pair: BOOL_TRUE" 72 " use_exchange_subtrip: BOOL_TRUE" 73 " use_cross: BOOL_TRUE" 74 " use_cross_exchange: BOOL_FALSE" 75 " use_relocate_expensive_chain: BOOL_TRUE" 76 " use_two_opt: BOOL_TRUE" 77 " use_or_opt: BOOL_TRUE" 78 " use_lin_kernighan: BOOL_TRUE" 79 " use_tsp_opt: BOOL_FALSE" 80 " use_make_active: BOOL_TRUE" 81 " use_relocate_and_make_active: BOOL_FALSE" 82 " use_make_inactive: BOOL_TRUE" 83 " use_make_chain_inactive: BOOL_FALSE" 84 " use_swap_active: BOOL_TRUE" 85 " use_extended_swap_active: BOOL_FALSE" 86 " use_node_pair_swap_active: BOOL_TRUE" 87 " use_path_lns: BOOL_FALSE" 88 " use_full_path_lns: BOOL_FALSE" 89 " use_tsp_lns: BOOL_FALSE" 90 " use_inactive_lns: BOOL_FALSE" 91 " use_global_cheapest_insertion_path_lns: BOOL_TRUE" 92 " use_local_cheapest_insertion_path_lns: BOOL_TRUE" 93 " use_relocate_path_global_cheapest_insertion_insert_unperformed: " 95 " use_global_cheapest_insertion_expensive_chain_lns: BOOL_FALSE" 96 " use_local_cheapest_insertion_expensive_chain_lns: BOOL_FALSE" 97 " use_global_cheapest_insertion_close_nodes_lns: BOOL_FALSE" 98 " use_local_cheapest_insertion_close_nodes_lns: BOOL_FALSE" 100 "use_multi_armed_bandit_concatenate_operators: false " 101 "multi_armed_bandit_compound_operator_memory_coefficient: 0.04 " 102 "multi_armed_bandit_compound_operator_exploration_coefficient: 1e12 " 103 "relocate_expensive_chain_num_arcs_to_consider: 4 " 104 "heuristic_expensive_chain_lns_num_arcs_to_consider: 4 " 105 "heuristic_close_nodes_lns_num_nodes: 5 " 106 "local_search_metaheuristic: AUTOMATIC " 107 "guided_local_search_lambda_coefficient: 0.1 " 108 "use_depth_first_search: false " 110 "use_cp_sat: BOOL_FALSE " 111 "use_generalized_cp_sat: BOOL_FALSE " 112 "sat_parameters { linearization_level: 2 num_search_workers: 1 } " 113 "continuous_scheduling_solver: GLOP " 114 "mixed_integer_scheduling_solver: CP_SAT " 115 "optimization_step: 0.0 " 116 "number_of_solutions_to_collect: 1 " 118 "solution_limit: 0x7fffffffffffffff " 119 "lns_time_limit: { seconds:0 nanos:100000000 } " 120 "use_full_propagation: false " 122 "log_cost_scaling_factor: 1.0 " 123 "log_cost_offset: 0.0";
125 if (!google::protobuf::TextFormat::ParseFromString(kSearchParameters,
127 LOG(DFATAL) <<
"Unsupported default search parameters: " 128 << kSearchParameters;
131 LOG_IF(DFATAL, !error.empty())
132 <<
"The default search parameters aren't valid: " << error;
137 bool IsValidNonNegativeDuration(
const google::protobuf::Duration& d) {
139 return status_or_duration.ok() &&
140 status_or_duration.value() >= absl::ZeroDuration();
150 using Reflection = google::protobuf::Reflection;
151 using Descriptor = google::protobuf::Descriptor;
152 using FieldDescriptor = google::protobuf::FieldDescriptor;
157 for (
int field_index = 0;
158 field_index < ls_descriptor->field_count(); ++field_index) {
159 const FieldDescriptor* field = ls_descriptor->field(field_index);
160 if (field->type() != FieldDescriptor::TYPE_ENUM ||
163 <<
"In RoutingSearchParameters::LocalSearchNeighborhoodOperators," 164 <<
" field '" << field->name() <<
"' is not an OptionalBoolean.";
165 return "The file 'routing_search_parameters.proto' itself is invalid!";
167 const int value = ls_reflection->GetEnum(operators, field)->number();
169 return StrCat(
"local_search_neighborhood_operator.", field->name(),
170 " should be set to BOOL_TRUE or BOOL_FALSE instead of ",
172 " (value: ",
value,
")");
178 if (std::isnan(
ratio) || ratio <= 0 || ratio > 1) {
179 return StrCat(
"Invalid savings_neighbors_ratio:",
ratio);
183 const double max_memory =
185 if (std::isnan(max_memory) || max_memory <= 0 || max_memory > 1e10) {
186 return StrCat(
"Invalid savings_max_memory_usage_bytes: ", max_memory);
193 return StrCat(
"Invalid savings_arc_coefficient:",
coefficient);
199 if (std::isnan(
ratio) || ratio < 0 || ratio > 1) {
200 return StrCat(
"Invalid cheapest_insertion_farthest_seeds_ratio:",
ratio);
206 if (std::isnan(
ratio) || ratio <= 0 || ratio > 1) {
208 "Invalid cheapest_insertion_first_solution_neighbors_ratio: ",
ratio);
212 const int32_t min_neighbors =
214 if (min_neighbors < 1) {
215 return StrCat(
"Invalid cheapest_insertion_first_solution_min_neighbors: ",
216 min_neighbors,
". Must be greater or equal to 1.");
222 if (std::isnan(
ratio) || ratio <= 0 || ratio > 1) {
223 return StrCat(
"Invalid cheapest_insertion_ls_operator_neighbors_ratio: ",
228 const int32_t min_neighbors =
230 if (min_neighbors < 1) {
231 return StrCat(
"Invalid cheapest_insertion_ls_operator_min_neighbors: ",
232 min_neighbors,
". Must be greater or equal to 1.");
236 const int32_t num_arcs =
238 if (num_arcs < 2 || num_arcs > 1e6) {
239 return StrCat(
"Invalid relocate_expensive_chain_num_arcs_to_consider: ",
240 num_arcs,
". Must be between 2 and 10^6 (included).");
244 const int32_t num_arcs =
246 if (num_arcs < 2 || num_arcs > 1e6) {
248 "Invalid heuristic_expensive_chain_lns_num_arcs_to_consider: ",
249 num_arcs,
". Must be between 2 and 10^6 (included).");
253 const int32_t num_nodes =
255 if (num_nodes < 0 || num_nodes > 1e4) {
256 return StrCat(
"Invalid heuristic_close_nodes_lns_num_nodes: ", num_nodes,
257 ". Must be between 0 and 10000 (included).");
261 const double gls_coefficient =
263 if (std::isnan(gls_coefficient) || gls_coefficient < 0 ||
264 std::isinf(gls_coefficient)) {
265 return StrCat(
"Invalid guided_local_search_lambda_coefficient: ",
271 if (std::isnan(step) || step < 0.0) {
272 return StrCat(
"Invalid optimization_step: ", step);
277 if (num < 1)
return StrCat(
"Invalid number_of_solutions_to_collect:", num);
281 if (lim < 1)
return StrCat(
"Invalid solution_limit:", lim);
283 if (!IsValidNonNegativeDuration(search_parameters.
time_limit())) {
284 return "Invalid time_limit: " +
285 search_parameters.
time_limit().ShortDebugString();
287 if (!IsValidNonNegativeDuration(search_parameters.
lns_time_limit())) {
288 return "Invalid lns_time_limit: " +
293 return StrCat(
"Invalid first_solution_strategy: ",
298 return StrCat(
"Invalid metaheuristic: ",
303 if (scaling_factor == 0 || std::isnan(scaling_factor) ||
304 std::isinf(scaling_factor)) {
305 return StrCat(
"Invalid value for log_cost_scaling_factor: ",
309 if (std::isnan(offset) || std::isinf(offset)) {
310 return StrCat(
"Invalid value for log_cost_offset: ", offset);
316 return StrCat(
"Invalid value for continuous_scheduling_solver: ",
318 continuous_scheduling_solver));
321 mixed_integer_scheduling_solver =
324 return StrCat(
"Invalid value for mixed_integer_scheduling_solver: ",
326 mixed_integer_scheduling_solver));
330 const double improvement_rate_coefficient =
333 if (std::isnan(improvement_rate_coefficient) ||
334 improvement_rate_coefficient <= 0) {
337 "improvement_limit_parameters.improvement_rate_coefficient: ",
338 improvement_rate_coefficient);
341 const int32_t improvement_rate_solutions_distance =
344 if (improvement_rate_solutions_distance <= 0) {
347 "improvement_limit_parameters.improvement_rate_solutions_distance: ",
348 improvement_rate_solutions_distance);
353 const double memory_coefficient =
356 if (std::isnan(memory_coefficient) || memory_coefficient < 0 ||
357 memory_coefficient > 1) {
360 "multi_armed_bandit_compound_operator_memory_coefficient: ",
365 const double exploration_coefficient =
368 if (std::isnan(exploration_coefficient) || exploration_coefficient < 0) {
371 "multi_armed_bandit_compound_operator_exploration_coefficient: ",
372 exploration_coefficient);
382 return "sat_parameters.enumerate_all_solutions cannot be true in parallel"
const PROTOBUF_NAMESPACE_ID::Duration & lns_time_limit() const
double cheapest_insertion_farthest_seeds_ratio() const
double guided_local_search_lambda_coefficient() const
RoutingSearchParameters DefaultRoutingSearchParameters()
double log_cost_scaling_factor() const
std::string FindErrorInRoutingSearchParameters(const RoutingSearchParameters &search_parameters)
Returns an empty std::string if the routing search parameters are valid, and a non-empty,...
::operations_research::RoutingSearchParameters_SchedulingSolver mixed_integer_scheduling_solver() const
void set_skip_locally_optimal_paths(bool value)
static ConstraintSolverParameters DefaultSolverParameters()
Create a ConstraintSolverParameters proto with all the default values.
double multi_armed_bandit_compound_operator_exploration_coefficient() const
::operations_research::RoutingSearchParameters_SchedulingSolver continuous_scheduling_solver() const
::operations_research::FirstSolutionStrategy_Value first_solution_strategy() const
static constexpr SchedulingSolver UNSET
static const ::PROTOBUF_NAMESPACE_ID::Reflection * GetReflection()
inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration &proto)
void set_compress_trail(::operations_research::ConstraintSolverParameters_TrailCompression value)
double improvement_rate_coefficient() const
double savings_arc_coefficient() const
const ::operations_research::sat::SatParameters & sat_parameters() const
::PROTOBUF_NAMESPACE_ID::int32 cheapest_insertion_ls_operator_min_neighbors() const
const std::string & OptionalBoolean_Name(T enum_t_value)
::operations_research::LocalSearchMetaheuristic_Value local_search_metaheuristic() const
bool OptionalBoolean_IsValid(int value)
double cheapest_insertion_first_solution_neighbors_ratio() const
static bool Value_IsValid(int value)
const ::operations_research::RoutingSearchParameters_ImprovementSearchLimitParameters & improvement_limit_parameters() const
double optimization_step() const
bool interleave_search() const
::PROTOBUF_NAMESPACE_ID::int64 solution_limit() const
::PROTOBUF_NAMESPACE_ID::int32 heuristic_close_nodes_lns_num_nodes() const
const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor * OptionalBoolean_descriptor()
double savings_max_memory_usage_bytes() const
static const ::PROTOBUF_NAMESPACE_ID::Descriptor * GetDescriptor()
bool enumerate_all_solutions() const
#define LOG_IF(severity, condition)
double log_cost_offset() const
RoutingSearchParameters_SchedulingSolver
::PROTOBUF_NAMESPACE_ID::int32 relocate_expensive_chain_num_arcs_to_consider() const
::PROTOBUF_NAMESPACE_ID::int32 num_search_workers() const
::PROTOBUF_NAMESPACE_ID::int32 number_of_solutions_to_collect() const
Collection of objects used to extend the Constraint Solver library.
::PROTOBUF_NAMESPACE_ID::int32 heuristic_expensive_chain_lns_num_arcs_to_consider() const
const ::operations_research::RoutingSearchParameters_LocalSearchNeighborhoodOperators & local_search_operators() const
double multi_armed_bandit_compound_operator_memory_coefficient() const
static constexpr SchedulingSolver CP_SAT
const PROTOBUF_NAMESPACE_ID::Duration & time_limit() const
double savings_neighbors_ratio() const
::PROTOBUF_NAMESPACE_ID::int32 cheapest_insertion_first_solution_min_neighbors() const
static const std::string & SchedulingSolver_Name(T enum_t_value)
bool has_improvement_limit_parameters() const
double cheapest_insertion_ls_operator_neighbors_ratio() const
RoutingModelParameters DefaultRoutingModelParameters()
static constexpr TrailCompression COMPRESS_WITH_ZLIB
::PROTOBUF_NAMESPACE_ID::int32 improvement_rate_solutions_distance() const