21#include "absl/container/flat_hash_map.h"
22#include "absl/log/log.h"
23#include "absl/strings/str_cat.h"
24#include "absl/strings/str_format.h"
25#include "absl/strings/string_view.h"
26#include "absl/time/time.h"
27#include "google/protobuf/descriptor.h"
28#include "google/protobuf/duration.pb.h"
29#include "google/protobuf/extension_set.h"
30#include "google/protobuf/message.h"
62IteratedLocalSearchParameters CreateDefaultIteratedLocalSearchParameters() {
63 IteratedLocalSearchParameters ils;
65 RuinRecreateParameters* rr = ils.mutable_ruin_recreate_parameters();
75 rr->mutable_recreate_strategy()->set_heuristic(
77 rr->set_route_selection_neighbors_ratio(1.0);
78 rr->set_route_selection_min_neighbors(10);
79 rr->set_route_selection_max_neighbors(100);
80 ils.set_improve_perturbed_solution(
true);
81 ils.mutable_best_solution_acceptance_strategy()->mutable_greedy_descent();
82 SimulatedAnnealingAcceptanceStrategy* sa =
83 ils.mutable_reference_solution_acceptance_strategy()
84 ->mutable_simulated_annealing();
86 sa->set_initial_temperature(100.0);
87 sa->set_final_temperature(0.01);
88 sa->set_automatic_temperatures(
false);
93CreateDefaultGlobalCheapestInsertionParameters(
94 bool use_neighbors_ratio_for_initialization) {
97 gci.set_neighbors_ratio(1.0);
98 gci.set_min_neighbors(1);
99 gci.set_use_neighbors_ratio_for_initialization(
100 use_neighbors_ratio_for_initialization);
101 gci.set_add_unperformed_entries(
false);
108 p.set_use_unfiltered_first_solution_strategy(
false);
109 p.mutable_savings_parameters()->set_neighbors_ratio(1);
110 p.mutable_savings_parameters()->set_max_memory_usage_bytes(6e9);
111 p.mutable_savings_parameters()->set_add_reverse_arcs(
false);
112 p.mutable_savings_parameters()->set_arc_coefficient(1);
113 *p.mutable_global_cheapest_insertion_first_solution_parameters() =
114 CreateDefaultGlobalCheapestInsertionParameters(
116 *p.mutable_global_cheapest_insertion_ls_operator_parameters() =
117 CreateDefaultGlobalCheapestInsertionParameters(
119 p.mutable_local_cheapest_insertion_parameters()->set_pickup_delivery_strategy(
121 p.mutable_local_cheapest_cost_insertion_parameters()
122 ->set_pickup_delivery_strategy(
125 p.mutable_local_search_operators();
128 o->set_use_light_relocate_pair(
BOOL_TRUE);
136 o->set_use_relocate_expensive_chain(
BOOL_TRUE);
142 o->set_use_relocate_and_make_active(
BOOL_FALSE);
143 o->set_use_exchange_and_make_active(
BOOL_FALSE);
144 o->set_use_exchange_path_start_ends_and_make_active(
BOOL_FALSE);
146 o->set_use_make_chain_inactive(
BOOL_TRUE);
150 o->set_use_shortest_path_swap_active(
BOOL_TRUE);
151 o->set_use_shortest_path_two_opt(
BOOL_TRUE);
157 o->set_use_global_cheapest_insertion_path_lns(
BOOL_TRUE);
158 o->set_use_local_cheapest_insertion_path_lns(
BOOL_TRUE);
159 o->set_use_relocate_path_global_cheapest_insertion_insert_unperformed(
161 o->set_use_global_cheapest_insertion_expensive_chain_lns(
BOOL_FALSE);
162 o->set_use_local_cheapest_insertion_expensive_chain_lns(
BOOL_FALSE);
163 o->set_use_global_cheapest_insertion_close_nodes_lns(
BOOL_FALSE);
164 o->set_use_local_cheapest_insertion_close_nodes_lns(
BOOL_FALSE);
165 o->set_use_global_cheapest_insertion_visit_types_lns(
BOOL_TRUE);
166 o->set_use_local_cheapest_insertion_visit_types_lns(
BOOL_TRUE);
167 p.set_ls_operator_neighbors_ratio(1);
168 p.set_ls_operator_min_neighbors(1);
169 p.set_use_multi_armed_bandit_concatenate_operators(
false);
170 p.set_multi_armed_bandit_compound_operator_memory_coefficient(0.04);
171 p.set_multi_armed_bandit_compound_operator_exploration_coefficient(1e12);
172 p.set_max_swap_active_chain_size(10);
173 p.set_relocate_expensive_chain_num_arcs_to_consider(4);
174 p.set_heuristic_expensive_chain_lns_num_arcs_to_consider(4);
175 p.set_heuristic_close_nodes_lns_num_nodes(5);
177 p.set_num_max_local_optima_before_metaheuristic_switch(200);
178 p.set_guided_local_search_lambda_coefficient(0.1);
179 p.set_guided_local_search_reset_penalties_on_new_best_solution(
false);
180 p.set_use_depth_first_search(
false);
184 p.mutable_sat_parameters()->set_linearization_level(2);
185 p.mutable_sat_parameters()->set_num_workers(1);
186 p.set_report_intermediate_cp_sat_solutions(
false);
187 p.set_fallback_to_cp_sat_size_threshold(20);
189 p.set_mixed_integer_scheduling_solver(
191 p.set_disable_scheduling_beware_this_may_degrade_performance(
false);
192 p.set_optimization_step(0.0);
193 p.set_number_of_solutions_to_collect(1);
196 p.mutable_lns_time_limit()->set_nanos(100000000);
197 p.set_secondary_ls_time_limit_ratio(0);
198 p.set_use_full_propagation(
false);
199 p.set_log_search(
false);
200 p.set_log_cost_scaling_factor(1.0);
201 p.set_log_cost_offset(0.0);
202 p.set_use_iterated_local_search(
false);
203 *p.mutable_iterated_local_search_parameters() =
204 CreateDefaultIteratedLocalSearchParameters();
207 LOG_IF(DFATAL, !error.empty())
208 <<
"The default search parameters aren't valid: " << error;
215 p.set_use_iterated_local_search(
false);
216 *p.mutable_iterated_local_search_parameters() =
217 CreateDefaultIteratedLocalSearchParameters();
219 p.mutable_local_search_operators();
222 o->set_use_light_relocate_pair(
BOOL_TRUE);
230 o->set_use_relocate_expensive_chain(
BOOL_FALSE);
236 o->set_use_relocate_and_make_active(
BOOL_FALSE);
237 o->set_use_exchange_and_make_active(
BOOL_FALSE);
238 o->set_use_exchange_path_start_ends_and_make_active(
BOOL_FALSE);
244 o->set_use_shortest_path_swap_active(
BOOL_FALSE);
251 o->set_use_global_cheapest_insertion_path_lns(
BOOL_FALSE);
252 o->set_use_local_cheapest_insertion_path_lns(
BOOL_FALSE);
253 o->set_use_relocate_path_global_cheapest_insertion_insert_unperformed(
256 LOG_IF(DFATAL, !error.empty())
257 <<
"The default secondary search parameters aren't valid: " << error;
264 static const auto* default_parameters =
266 return *default_parameters;
271 CreateDefaultSecondaryRoutingSearchParameters());
272 return *default_parameters;
276bool IsValidNonNegativeDuration(
const google::protobuf::Duration& d) {
278 return status_or_duration.ok() &&
279 status_or_duration.value() >= absl::ZeroDuration();
284void FindErrorsInLocalCheapestInsertionParameters(
285 absl::string_view prefix,
287 std::vector<std::string>& errors) {
292 sorting_properties_map;
298 errors.emplace_back(StrCat(
299 prefix,
" - Invalid insertion sorting property: ",
303 const int occurrences = sorting_properties_map[property]++;
304 if (occurrences == 2) {
305 errors.emplace_back(StrCat(
306 prefix,
" - Duplicate insertion sorting property: ",
311 parameters.insertion_sorting_properties().size() > 1) {
314 " - SORTING_PROPERTY_RANDOM cannot be used in conjunction "
315 "with other properties."));
322void FindErrorsInSavingsParameters(
const absl::string_view prefix,
324 std::vector<std::string>& errors) {
327 if (
const double ratio = savings_parameters.neighbors_ratio();
328 std::isnan(ratio) || ratio <= 0 || ratio > 1) {
329 errors.emplace_back(StrCat(
330 prefix,
" - Invalid savings_parameters.neighbors_ratio: ", ratio));
332 if (
const double max_memory = savings_parameters.max_memory_usage_bytes();
333 std::isnan(max_memory) || max_memory <= 0 || max_memory > 1e10) {
334 errors.emplace_back(StrCat(
336 " - Invalid savings_parameters.max_memory_usage_bytes: ", max_memory));
338 if (
const double coefficient = savings_parameters.arc_coefficient();
339 std::isnan(coefficient) || coefficient <= 0 || std::isinf(coefficient)) {
342 " - Invalid savings_parameters.arc_coefficient: ", coefficient));
346void FindErrorsInGlobalCheapestInsertionParameters(
347 absl::string_view prefix,
349 std::vector<std::string>& errors) {
352 if (
const double ratio = gci_parameters.farthest_seeds_ratio();
353 std::isnan(ratio) || ratio < 0 || ratio > 1) {
357 "global_cheapest_insertion_parameters.farthest_seeds_ratio: ",
360 if (
const double ratio = gci_parameters.neighbors_ratio();
361 std::isnan(ratio) || ratio <= 0 || ratio > 1) {
362 errors.emplace_back(StrCat(
364 " - Invalid global_cheapest_insertion_parameters.neighbors_ratio: ",
367 if (
const int32_t min_neighbors = gci_parameters.min_neighbors();
369 errors.emplace_back(StrCat(
371 " - Invalid global_cheapest_insertion_parameters.min_neighbors: ",
372 min_neighbors,
". Must be greater or equal to 1."));
376void FindErrorsInRecreateParameters(
379 switch (parameters.parameters_case()) {
381 const std::string prefix =
383 ?
"Local cheapest insertion (recreate heuristic)"
384 :
"Local cheapest cost insertion (recreate heuristic)";
385 FindErrorsInLocalCheapestInsertionParameters(
386 prefix, parameters.local_cheapest_insertion(), errors);
390 FindErrorsInSavingsParameters(
"Savings (recreate heuristic)",
391 parameters.savings(), errors);
394 FindErrorsInGlobalCheapestInsertionParameters(
395 "Global cheapest insertion (recreate heuristic)",
396 parameters.global_cheapest_insertion(), errors);
399 LOG(DFATAL) <<
"Unsupported unset recreate parameters.";
406void FindErrorsInIteratedLocalSearchParameters(
408 std::vector<std::string>& errors) {
410 if (!search_parameters.use_iterated_local_search()) {
414 if (!search_parameters.has_iterated_local_search_parameters()) {
416 "use_iterated_local_search is true but "
417 "iterated_local_search_parameters are missing.");
422 search_parameters.iterated_local_search_parameters();
426 StrCat(
"Invalid value for "
427 "iterated_local_search_parameters.perturbation_strategy: ",
428 ils.perturbation_strategy()));
432 if (!ils.has_ruin_recreate_parameters()) {
433 errors.emplace_back(StrCat(
434 "iterated_local_search_parameters.perturbation_strategy is ",
436 " but iterated_local_search_parameters.ruin_recreate_parameters are "
443 if (rr.ruin_strategies().empty()) {
445 StrCat(
"iterated_local_search_parameters.ruin_recreate_parameters."
446 "ruin_strategies is empty"));
449 if (rr.ruin_strategies().size() > 1 &&
451 errors.emplace_back(StrCat(
452 "iterated_local_search_parameters.ruin_recreate_parameters."
453 "ruin_composition_strategy cannot be unset when more than one ruin "
454 "strategy is defined"));
457 for (
const auto& ruin : rr.ruin_strategies()) {
459 ruin.spatially_close_routes().num_ruined_routes() == 0) {
460 errors.emplace_back(StrCat(
461 "iterated_local_search_parameters.ruin_recreate_parameters."
462 "ruin_strategy is set to SpatiallyCloseRoutesRuinStrategy"
463 " but spatially_close_routes.num_ruined_routes is 0 (should be "
464 "strictly positive)"));
466 ruin.random_walk().num_removed_visits() == 0) {
468 StrCat(
"iterated_local_search_parameters.ruin_recreate_parameters."
469 "ruin_strategy is set to RandomWalkRuinStrategy"
470 " but random_walk.num_removed_visits is 0 (should be "
471 "strictly positive)"));
473 if (ruin.sisr().avg_num_removed_visits() == 0) {
475 "iterated_local_search_parameters.ruin_recreate_parameters."
476 "ruin is set to SISRRuinStrategy"
477 " but sisr.avg_num_removed_visits is 0 (should be strictly "
480 if (ruin.sisr().max_removed_sequence_size() == 0) {
482 "iterated_local_search_parameters.ruin_recreate_parameters.ruin "
483 "is set to SISRRuinStrategy but "
484 "sisr.max_removed_sequence_size is 0 (should be strictly "
487 if (ruin.sisr().bypass_factor() < 0 ||
488 ruin.sisr().bypass_factor() > 1) {
489 errors.emplace_back(StrCat(
490 "iterated_local_search_parameters.ruin_recreate_parameters."
491 "ruin is set to SISRRuinStrategy"
492 " but sisr.bypass_factor is not in [0, 1]"));
497 if (
const double ratio = rr.route_selection_neighbors_ratio();
498 std::isnan(ratio) || ratio <= 0 || ratio > 1) {
501 "iterated_local_search_parameters.ruin_recreate_parameters."
502 "route_selection_neighbors_ratio: ",
505 if (rr.route_selection_min_neighbors() == 0) {
507 StrCat(
"iterated_local_search_parameters.ruin_recreate_parameters."
508 "route_selection_min_neighbors must be positive"));
510 if (rr.route_selection_min_neighbors() >
511 rr.route_selection_max_neighbors()) {
513 StrCat(
"iterated_local_search_parameters.ruin_recreate_parameters."
514 "route_selection_min_neighbors cannot be greater than "
515 "iterated_local_search_parameters.ruin_recreate_parameters."
516 "route_selection_max_neighbors"));
520 rr.recreate_strategy().heuristic();
523 StrCat(
"Invalid value for "
524 "iterated_local_search_parameters.ruin_recreate_parameters."
525 "recreate_strategy.heuristic: ",
529 if (rr.recreate_strategy().has_parameters()) {
531 rr.recreate_strategy().parameters();
532 if (recreate_params.parameters_case() ==
534 errors.emplace_back(StrCat(
536 "iterated_local_search_parameters.ruin_recreate_parameters."
537 "recreate_strategy.parameters: ",
542 recreate_params.parameters_case() != params) {
543 errors.emplace_back(StrCat(
544 "recreate_strategy.heuristic is set to ",
546 " but recreate_strategy.parameters define ",
549 FindErrorsInRecreateParameters(recreate_heuristic, recreate_params,
556 struct NamedAcceptanceStrategy {
558 AcceptanceStrategy acceptance_strategy;
560 std::vector<NamedAcceptanceStrategy> named_acceptance_strategies;
562 if (!ils.has_reference_solution_acceptance_strategy()) {
564 StrCat(
"Unset value for "
565 "iterated_local_search_parameters.reference_solution_acceptance_"
568 named_acceptance_strategies.push_back(
569 {
"reference_solution", ils.reference_solution_acceptance_strategy()});
572 if (!ils.has_best_solution_acceptance_strategy()) {
573 errors.emplace_back(StrCat(
575 "iterated_local_search_parameters.best_solution_acceptance_strategy."));
577 named_acceptance_strategies.push_back(
578 {
"best_solution", ils.best_solution_acceptance_strategy()});
581 for (
const auto& [name, acceptance_strategy] : named_acceptance_strategies) {
582 if (acceptance_strategy.has_simulated_annealing()) {
584 acceptance_strategy.simulated_annealing();
586 if (sa_params.cooling_schedule_strategy() ==
589 StrCat(
"Invalid value for "
590 "iterated_local_search_parameters.",
592 "_acceptance_strategy.simulated_annealing.cooling_schedule_"
594 sa_params.cooling_schedule_strategy()));
597 if (!sa_params.automatic_temperatures()) {
598 if (sa_params.initial_temperature() < sa_params.final_temperature()) {
599 errors.emplace_back(StrCat(
600 "iterated_local_search_parameters.", name,
601 "_acceptance_strategy.simulated_annealing."
602 "initial_temperature cannot be lower than "
603 "iterated_local_search_parameters.simulated_annealing_parameters."
604 "final_temperature."));
607 if (sa_params.initial_temperature() < 1e-9) {
609 StrCat(
"iterated_local_search_parameters.", name,
610 "_acceptance_strategy.simulated_annealing."
611 "initial_temperature cannot be lower than 1e-9."));
614 if (sa_params.final_temperature() < 1e-9) {
616 StrCat(
"iterated_local_search_parameters.", name,
617 "_acceptance_strategy.simulated_annealing."
618 "final_temperature cannot be lower than 1e-9."));
629 const std::vector<std::string> errors =
631 return (errors.empty()) ?
"" : errors[0];
637 std::vector<std::string> errors;
642#if !defined(__ANDROID__) && !defined(__wasm__)
644 using Reflection = google::protobuf::Reflection;
645 using Descriptor = google::protobuf::Descriptor;
646 using FieldDescriptor = google::protobuf::FieldDescriptor;
651 for (
int field_index = 0;
652 field_index < ls_descriptor->field_count(); ++field_index) {
653 const FieldDescriptor* field = ls_descriptor->field(field_index);
654 if (field->type() != FieldDescriptor::TYPE_ENUM ||
657 <<
"In RoutingSearchParameters::LocalSearchNeighborhoodOperators,"
658 <<
" field '" << field->name() <<
"' is not an OptionalBoolean.";
660 const int value = ls_reflection->GetEnum(operators, field)->number();
662 errors.emplace_back(absl::StrFormat(
663 "local_search_neighborhood_operator.%s should be set to "
664 "BOOL_TRUE or BOOL_FALSE instead of %s (value: %d)",
673 FindErrorsInSavingsParameters(
"Savings (first solution heuristic)",
675 FindErrorsInGlobalCheapestInsertionParameters(
676 "Global cheapest insertion (first solution heuristic)",
679 FindErrorsInGlobalCheapestInsertionParameters(
680 "Global cheapest insertion (ls operator)",
683 FindErrorsInLocalCheapestInsertionParameters(
684 "Local cheapest insertion (first solution heuristic)",
686 FindErrorsInLocalCheapestInsertionParameters(
687 "Local cheapest cost insertion (first solution heuristic)",
691 std::isnan(ratio) || ratio <= 0 || ratio > 1) {
692 errors.emplace_back(StrCat(
"Invalid ls_operator_neighbors_ratio: ", ratio));
694 if (
const int32_t min_neighbors =
698 StrCat(
"Invalid ls_operator_min_neighbors: ", min_neighbors,
699 ". Must be greater or equal to 1."));
701 if (
const int32_t num_arcs =
703 num_arcs < 2 || num_arcs > 1e6) {
704 errors.emplace_back(StrCat(
705 "Invalid relocate_expensive_chain_num_arcs_to_consider: ", num_arcs,
706 ". Must be between 2 and 10^6 (included)."));
708 if (
const int32_t num_arcs =
710 .heuristic_expensive_chain_lns_num_arcs_to_consider();
711 num_arcs < 2 || num_arcs > 1e6) {
713 StrCat(
"Invalid heuristic_expensive_chain_lns_num_arcs_to_consider: ",
714 num_arcs,
". Must be between 2 and 10^6 (included)."));
716 if (
const int32_t num_nodes =
718 num_nodes < 0 || num_nodes > 1e4) {
720 StrCat(
"Invalid heuristic_close_nodes_lns_num_nodes: ", num_nodes,
721 ". Must be between 0 and 10000 (included)."));
723 if (
const double gls_coefficient =
725 std::isnan(gls_coefficient) || gls_coefficient < 0 ||
726 std::isinf(gls_coefficient)) {
727 errors.emplace_back(StrCat(
728 "Invalid guided_local_search_lambda_coefficient: ", gls_coefficient));
731 std::isnan(step) || step < 0.0) {
732 errors.emplace_back(StrCat(
"Invalid optimization_step: ", step));
737 StrCat(
"Invalid number_of_solutions_to_collect: ", num));
739 if (
const int64_t lim = search_parameters.
solution_limit(); lim < 1)
740 errors.emplace_back(StrCat(
"Invalid solution_limit: ", lim));
741 if (!IsValidNonNegativeDuration(search_parameters.
time_limit())) {
743 "Invalid time_limit: " +
746 if (!IsValidNonNegativeDuration(search_parameters.
lns_time_limit())) {
748 "Invalid lns_time_limit: " +
752 std::isnan(ratio) || ratio < 0 || ratio >= 1) {
754 StrCat(
"Invalid secondary_ls_time_limit_ratio: ", ratio));
758 errors.emplace_back(StrCat(
"Invalid first_solution_strategy: ",
767 StrCat(
"local_search_metaheuristics cannot be set if "
768 "local_search_metaheuristic is different from "
769 "UNSET or AUTOMATIC: ",
770 local_search_metaheuristic));
774 StrCat(
"Invalid metaheuristic: ", local_search_metaheuristic));
776 for (
const int metaheuristic :
780 errors.emplace_back(StrCat(
"Invalid metaheuristic: ", metaheuristic));
786 errors.emplace_back(StrCat(
787 "Invalid num_max_local_optima_before_metaheuristic_switch: ",
792 if (scaling_factor == 0 || std::isnan(scaling_factor) ||
793 std::isinf(scaling_factor)) {
795 StrCat(
"Invalid value for log_cost_scaling_factor: ", scaling_factor));
798 if (std::isnan(offset) || std::isinf(offset)) {
799 errors.emplace_back(StrCat(
"Invalid value for log_cost_offset: ", offset));
803 if (continuous_scheduling_solver ==
805 continuous_scheduling_solver ==
808 StrCat(
"Invalid value for continuous_scheduling_solver: ",
810 continuous_scheduling_solver)));
814 mixed_integer_scheduling_solver =
816 mixed_integer_scheduling_solver ==
819 StrCat(
"Invalid value for mixed_integer_scheduling_solver: ",
821 mixed_integer_scheduling_solver)));
825 const double improvement_rate_coefficient =
828 if (std::isnan(improvement_rate_coefficient) ||
829 improvement_rate_coefficient <= 0) {
831 StrCat(
"Invalid value for "
832 "improvement_limit_parameters.improvement_rate_coefficient: ",
833 improvement_rate_coefficient));
836 const int32_t improvement_rate_solutions_distance =
839 if (improvement_rate_solutions_distance <= 0) {
840 errors.emplace_back(StrCat(
842 "improvement_limit_parameters.improvement_rate_solutions_distance: ",
843 improvement_rate_solutions_distance));
847 if (
const double memory_coefficient =
849 .multi_armed_bandit_compound_operator_memory_coefficient();
850 std::isnan(memory_coefficient) || memory_coefficient < 0 ||
851 memory_coefficient > 1) {
853 StrCat(
"Invalid value for "
854 "multi_armed_bandit_compound_operator_memory_coefficient: ",
855 memory_coefficient));
857 if (
const double exploration_coefficient =
859 .multi_armed_bandit_compound_operator_exploration_coefficient();
860 std::isnan(exploration_coefficient) || exploration_coefficient < 0) {
862 StrCat(
"Invalid value for "
863 "multi_armed_bandit_compound_operator_exploration_coefficient: ",
864 exploration_coefficient));
870 (sat_parameters.num_workers() > 1 ||
871 sat_parameters.interleave_search())) {
873 "sat_parameters.enumerate_all_solutions cannot be true in parallel"
881 "max_swap_active_chain_size must be greater than 1 if "
882 "local_search_operators.use_swap_active_chain is BOOL_TRUE");
885 FindErrorsInIteratedLocalSearchParameters(search_parameters, errors);
void set_skip_locally_optimal_paths(bool value)
static constexpr TrailCompression COMPRESS_WITH_ZLIB
void set_compress_trail(::operations_research::ConstraintSolverParameters_TrailCompression value)
static constexpr Value EXPONENTIAL
static constexpr Value UNSET
FirstSolutionStrategy_Value Value
static const ::std::string & Value_Name(T value)
static constexpr Value UNSET
static constexpr Value LOCAL_CHEAPEST_INSERTION
static constexpr Value AUTOMATIC
static bool Value_IsValid(int value)
void set_farthest_seeds_ratio(double value)
static constexpr PairInsertionStrategy BEST_PICKUP_DELIVERY_PAIR
static constexpr InsertionSortingProperty SORTING_PROPERTY_RANDOM
LocalCheapestInsertionParameters_InsertionSortingProperty InsertionSortingProperty
static constexpr InsertionSortingProperty SORTING_PROPERTY_UNSPECIFIED
static const ::std::string & InsertionSortingProperty_Name(T value)
static constexpr PairInsertionStrategy BEST_PICKUP_THEN_BEST_DELIVERY
static constexpr Value UNSET
static constexpr Value RUIN_AND_RECREATE
@ kGlobalCheapestInsertion
@ kLocalCheapestInsertion
void set_reduce_vehicle_cost_model(bool value)
::operations_research::ConstraintSolverParameters *PROTOBUF_NONNULL mutable_solver_parameters()
double improvement_rate_coefficient() const
::int32_t improvement_rate_solutions_distance() const
static const ::google::protobuf::Descriptor *PROTOBUF_NONNULL GetDescriptor()
static const ::google::protobuf::Reflection *PROTOBUF_NONNULL GetReflection()
::operations_research::OptionalBoolean use_swap_active_chain() const
const ::operations_research::RoutingSearchParameters_LocalSearchNeighborhoodOperators & local_search_operators() const
static constexpr SchedulingSolver SCHEDULING_GLOP
const ::operations_research::GlobalCheapestInsertionParameters & global_cheapest_insertion_ls_operator_parameters() const
void set_first_solution_strategy(::operations_research::FirstSolutionStrategy_Value value)
const ::operations_research::LocalCheapestInsertionParameters & local_cheapest_insertion_parameters() const
RoutingSearchParameters_LocalSearchNeighborhoodOperators LocalSearchNeighborhoodOperators
const ::operations_research::sat::SatParameters & sat_parameters() const
double log_cost_offset() const
::int32_t relocate_expensive_chain_num_arcs_to_consider() const
const ::operations_research::LocalCheapestInsertionParameters & local_cheapest_cost_insertion_parameters() const
const ::operations_research::GlobalCheapestInsertionParameters & global_cheapest_insertion_first_solution_parameters() const
double log_cost_scaling_factor() const
double secondary_ls_time_limit_ratio() const
::operations_research::LocalSearchMetaheuristic_Value local_search_metaheuristic() const
RoutingSearchParameters_SchedulingSolver SchedulingSolver
const ::google::protobuf::Duration & time_limit() const
::int32_t max_swap_active_chain_size() const
::int32_t heuristic_close_nodes_lns_num_nodes() const
::operations_research::LocalSearchMetaheuristic_Value local_search_metaheuristics(int index) const
::operations_research::RoutingSearchParameters_SchedulingSolver mixed_integer_scheduling_solver() const
const ::operations_research::RoutingSearchParameters_ImprovementSearchLimitParameters & improvement_limit_parameters() const
const ::operations_research::SavingsParameters & savings_parameters() const
::int64_t solution_limit() const
::int32_t ls_operator_min_neighbors() const
::int32_t number_of_solutions_to_collect() const
static constexpr SchedulingSolver SCHEDULING_UNSET
::operations_research::RoutingSearchParameters_SchedulingSolver continuous_scheduling_solver() const
bool has_improvement_limit_parameters() const
::int32_t num_max_local_optima_before_metaheuristic_switch() const
double guided_local_search_lambda_coefficient() const
double optimization_step() const
double ls_operator_neighbors_ratio() const
static constexpr SchedulingSolver SCHEDULING_CP_SAT
::operations_research::FirstSolutionStrategy_Value first_solution_strategy() const
const ::google::protobuf::Duration & lns_time_limit() const
static const ::std::string & SchedulingSolver_Name(T value)
static constexpr Value UNSET
static ConstraintSolverParameters DefaultSolverParameters()
Create a ConstraintSolverParameters proto with all the default values.
bool enumerate_all_solutions() const
bool OptionalBoolean_IsValid(int value)
std::string GetRecreateParametersName(RecreateParameters::ParametersCase parameters_case)
std::string ProtobufShortDebugString(const P &message)
const ::google::protobuf::EnumDescriptor *PROTOBUF_NONNULL OptionalBoolean_descriptor()
RoutingModelParameters DefaultRoutingModelParameters()
RoutingSearchParameters DefaultSecondaryRoutingSearchParameters()
const ::std::string & OptionalBoolean_Name(T value)
RecreateParameters::ParametersCase GetParameterCaseForRecreateHeuristic(FirstSolutionStrategy::Value recreate_heuristic)
std::vector< std::string > FindErrorsInRoutingSearchParameters(const RoutingSearchParameters &search_parameters)
RoutingSearchParameters DefaultRoutingSearchParameters()
std::string FindErrorInRoutingSearchParameters(const RoutingSearchParameters &search_parameters)
inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration &proto)
#define REPEATED_ENUM_ADAPTER(var, field)
static const int64_t kint64max