Google OR-Tools v9.12
a fast and portable software suite for combinatorial optimization
Loading...
Searching...
No Matches
routing_parameters.proto
Go to the documentation of this file.
1// Copyright 2010-2025 Google LLC
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14// Protocol buffer used to parametrize the routing library, in particular the
15// search parameters such as first solution heuristics and local search
16// neighborhoods.
17
18syntax = "proto3";
19
20option java_package = "com.google.ortools.constraintsolver";
21option java_multiple_files = true;
22option csharp_namespace = "Google.OrTools.ConstraintSolver";
23
24import "google/protobuf/duration.proto";
25import "ortools/constraint_solver/routing_enums.proto";
26import "ortools/constraint_solver/routing_ils.proto";
27import "ortools/constraint_solver/solver_parameters.proto";
28import "ortools/sat/sat_parameters.proto";
29import "ortools/util/optional_boolean.proto";
30
31package operations_research;
32
33// Parameters defining the search used to solve vehicle routing problems.
34//
35// If a parameter is unset (or, equivalently, set to its default value),
36// then the routing library will pick its preferred value for that parameter
37// automatically: this should be the case for most parameters.
38// To see those "default" parameters, call GetDefaultRoutingSearchParameters().
39// Next ID: 68
40message RoutingSearchParameters {
41 reserved 19, 65;
42
43 // First solution strategies, used as starting point of local search.
44 FirstSolutionStrategy.Value first_solution_strategy = 1;
45
46 // --- Advanced first solutions strategy settings ---
47 // Don't touch these unless you know what you are doing.
48 //
49 // Use filtered version of first solution strategy if available.
50 bool use_unfiltered_first_solution_strategy = 2;
51 // Parameters specific to the Savings first solution heuristic.
52 // Ratio (in ]0, 1]) of neighbors to consider for each node when constructing
53 // the savings. If unspecified, its value is considered to be 1.0.
54 double savings_neighbors_ratio = 14;
55 // The number of neighbors considered for each node in the Savings heuristic
56 // is chosen so that the space used to store the savings doesn't exceed
57 // savings_max_memory_usage_bytes, which must be in ]0, 1e10].
58 // NOTE: If both savings_neighbors_ratio and savings_max_memory_usage_bytes
59 // are specified, the number of neighbors considered for each node will be the
60 // minimum of the two numbers determined by these parameters.
61 double savings_max_memory_usage_bytes = 23;
62 // Add savings related to reverse arcs when finding the nearest neighbors
63 // of the nodes.
64 bool savings_add_reverse_arcs = 15;
65 // Coefficient of the cost of the arc for which the saving value is being
66 // computed:
67 // Saving(a-->b) = Cost(a-->end) + Cost(start-->b)
68 // - savings_arc_coefficient * Cost(a-->b)
69 // This parameter must be greater than 0, and its default value is 1.
70 double savings_arc_coefficient = 18;
71
72 // Ratio (between 0 and 1) of available vehicles in the model on which
73 // farthest nodes of the model are inserted as seeds in the
74 // GlobalCheapestInsertion first solution heuristic.
75 double cheapest_insertion_farthest_seeds_ratio = 16;
76
77 // Ratio (in ]0, 1]) of closest non start/end nodes to consider as neighbors
78 // for each node when creating new insertions in the parallel/sequential
79 // cheapest insertion heuristic.
80 // If not overridden, its default value is 1, meaning all neighbors will be
81 // considered.
82 // The neighborhood ratio is coupled with the corresponding min_neighbors
83 // integer, indicating the minimum number of neighbors to consider for each
84 // node:
85 // num_closest_neighbors =
86 // max(min_neighbors, neighbors_ratio * NUM_NON_START_END_NODES)
87 // This minimum number of neighbors must be greater or equal to 1, its
88 // default value.
89 //
90 // Neighbors ratio and minimum number of neighbors for the first solution
91 // heuristic.
92 double cheapest_insertion_first_solution_neighbors_ratio = 21;
93 int32 cheapest_insertion_first_solution_min_neighbors = 44;
94 // Neighbors ratio and minimum number of neighbors for the heuristic when used
95 // in a local search operator (see
96 // local_search_operators.use_global_cheapest_insertion_path_lns and
97 // local_search_operators.use_global_cheapest_insertion_chain_lns below).
98 double cheapest_insertion_ls_operator_neighbors_ratio = 31;
99 int32 cheapest_insertion_ls_operator_min_neighbors = 45;
100
101 // Whether or not to only consider closest neighbors when initializing the
102 // assignment for the first solution.
103 bool
104 cheapest_insertion_first_solution_use_neighbors_ratio_for_initialization =
105 46;
106 // Whether or not to consider entries making the nodes/pairs unperformed in
107 // the GlobalCheapestInsertion heuristic.
108 bool cheapest_insertion_add_unperformed_entries = 40;
109
110 // In insertion-based heuristics, describes what positions must be considered
111 // when inserting a pickup/delivery pair, and in what order they are
112 // considered.
113 enum PairInsertionStrategy {
114 // Let the solver decide the set of positions and its ordering.
115 AUTOMATIC = 0;
116 // Consider all positions, by increasing (cost(pickup), cost(delivery)).
117 BEST_PICKUP_THEN_BEST_DELIVERY = 1;
118 // Consider all positions, by increasing by cost(pickup) + cost(delivery).
119 BEST_PICKUP_DELIVERY_PAIR = 2;
120 // Only consider insertion positions that are compatible with the multitour
121 // property, meaning a series of pickups may only start when the vehicle
122 // is not carrying any delivery. This setting is designed to explore much
123 // less possibilities than the full BEST_PICKUP_DELIVERY_PAIR.
124 // Order by increasing by cost(pickup) + cost(delivery).
125 BEST_PICKUP_DELIVERY_PAIR_MULTITOUR = 3;
126 }
127 // Choice of insertion strategy for pickup/delivery pairs, used in local
128 // cheapest insertion, both first solution heuristic and LNS.
129 PairInsertionStrategy local_cheapest_insertion_pickup_delivery_strategy = 49;
130 // Choice of insertion strategy for pickup/delivery pairs, used in local
131 // cheapest cost insertion, both first solution heuristic and LNS.
132 PairInsertionStrategy local_cheapest_cost_insertion_pickup_delivery_strategy =
133 55;
134
135 // Properties used to select in which order nodes or node pairs are considered
136 // in insertion heuristics.
137 enum InsertionSortingProperty {
138 // Invalid property.
139 SORTING_PROPERTY_UNSPECIFIED = 0;
140 // Selects nodes with the least number of allowed vehicles.
141 SORTING_PROPERTY_ALLOWED_VEHICLES = 1;
142 // Selects nodes with the highest penalty.
143 SORTING_PROPERTY_PENALTY = 2;
144 // Selects nodes with the highest penalty / number of allowed vehicles
145 // ratio.
146 SORTING_PROPERTY_PENALTY_OVER_ALLOWED_VEHICLES_RATIO = 3;
147 // Selects nodes that are on average the farthest from vehicles.
148 SORTING_PROPERTY_HIGHEST_AVG_ARC_COST_TO_VEHICLE_START_ENDS = 4;
149 // Selects nodes that are on average the closest to vehicles.
150 SORTING_PROPERTY_LOWEST_AVG_ARC_COST_TO_VEHICLE_START_ENDS = 5;
151 // Select nodes with the smallest distance to the closest vehicle.
152 SORTING_PROPERTY_LOWEST_MIN_ARC_COST_TO_VEHICLE_START_ENDS = 6;
153 // Selects nodes that have a higher dimension usage on average, where the
154 // usage is determined as the ratio of node demand over vehicle capacity.
155 // Currently, this property only supports unary dimensions.
156 SORTING_PROPERTY_HIGHEST_DIMENSION_USAGE = 7;
157 }
158
159 // The properties used to sort insertion entries in the local cheapest
160 // insertion heuristic, in *decreasing* order of priority. The properties
161 // listed here are applied hierarchically, from highest to lowest priority.
162 // When no properties are provided
163 // (SORTING_PROPERTY_ALLOWED_VEHICLES, SORTING_PROPERTY_PENALTY)
164 // is used by default.
165 repeated InsertionSortingProperty
166 local_cheapest_insertion_sorting_properties = 67;
167
168 // If true use minimum matching instead of minimal matching in the
169 // Christofides algorithm.
170 bool christofides_use_minimum_matching = 30;
171
172 // If non zero, a period p indicates that every p node insertions or additions
173 // to a path, an optimization of the current partial solution will be
174 // performed. As of 12/2023:
175 // - this requires that a secondary routing model has been passed to the main
176 // one,
177 // - this is only supported by LOCAL_CHEAPEST_INSERTION and
178 // LOCAL_CHEAPEST_COST_INSERTION.
179 int32 first_solution_optimization_period = 59;
180
181 // Local search neighborhood operators used to build a solutions neighborhood.
182 // Next ID: 39
183 message LocalSearchNeighborhoodOperators {
184 // --- Inter-route operators ---
185 // Operator which moves a single node to another position.
186 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 -> 5
187 // (where (1, 5) are first and last nodes of the path and can therefore not
188 // be moved):
189 // 1 -> 3 -> [2] -> 4 -> 5
190 // 1 -> 3 -> 4 -> [2] -> 5
191 // 1 -> 2 -> 4 -> [3] -> 5
192 // 1 -> [4] -> 2 -> 3 -> 5
193 OptionalBoolean use_relocate = 1;
194 // Operator which moves a pair of pickup and delivery nodes to another
195 // position where the first node of the pair must be before the second node
196 // on the same path. Compared to the light_relocate_pair operator, tries all
197 // possible positions of insertion of a pair (not only after another pair).
198 // Possible neighbors for the path 1 -> A -> B -> 2 -> 3 (where (1, 3) are
199 // first and last nodes of the path and can therefore not be moved, and
200 // (A, B) is a pair of nodes):
201 // 1 -> [A] -> 2 -> [B] -> 3
202 // 1 -> 2 -> [A] -> [B] -> 3
203 OptionalBoolean use_relocate_pair = 2;
204 // Operator which moves a pair of pickup and delivery nodes after another
205 // pair.
206 // Possible neighbors for paths 1 -> A -> B -> 2, 3 -> C -> D -> 4 (where
207 // (1, 2) and (3, 4) are first and last nodes of paths and can therefore not
208 // be moved, and (A, B) and (C, D) are pair of nodes):
209 // 1 -> 2, 3 -> C -> [A] -> D -> [B] -> 4
210 // 1 -> A -> [C] -> B -> [D] -> 2, 3 -> 4
211 OptionalBoolean use_light_relocate_pair = 24;
212 // Relocate neighborhood which moves chains of neighbors.
213 // The operator starts by relocating a node n after a node m, then continues
214 // moving nodes which were after n as long as the "cost" added is less than
215 // the "cost" of the arc (m, n). If the new chain doesn't respect the domain
216 // of next variables, it will try reordering the nodes until it finds a
217 // valid path.
218 // Possible neighbors for path 1 -> A -> B -> C -> D -> E -> 2 (where (1, 2)
219 // are first and last nodes of the path and can therefore not be moved, A
220 // must be performed before B, and A, D and E are located at the same
221 // place):
222 // 1 -> A -> C -> [B] -> D -> E -> 2
223 // 1 -> A -> C -> D -> [B] -> E -> 2
224 // 1 -> A -> C -> D -> E -> [B] -> 2
225 // 1 -> A -> B -> D -> [C] -> E -> 2
226 // 1 -> A -> B -> D -> E -> [C] -> 2
227 // 1 -> A -> [D] -> [E] -> B -> C -> 2
228 // 1 -> A -> B -> [D] -> [E] -> C -> 2
229 // 1 -> A -> [E] -> B -> C -> D -> 2
230 // 1 -> A -> B -> [E] -> C -> D -> 2
231 // 1 -> A -> B -> C -> [E] -> D -> 2
232 // This operator is extremely useful to move chains of nodes which are
233 // located at the same place (for instance nodes part of a same stop).
234 OptionalBoolean use_relocate_neighbors = 3;
235 // Relocate neighborhood that moves subpaths all pickup and delivery
236 // pairs have both pickup and delivery inside the subpath or both outside
237 // the subpath. For instance, for given paths:
238 // 0 -> A -> B -> A' -> B' -> 5 -> 6 -> 8
239 // 7 -> 9
240 // Pairs (A,A') and (B,B') are interleaved, so the expected neighbors are:
241 // 0 -> 5 -> A -> B -> A' -> B' -> 6 -> 8
242 // 7 -> 9
243 //
244 // 0 -> 5 -> 6 -> A -> B -> A' -> B' -> 8
245 // 7 -> 9
246 //
247 // 0 -> 5 -> 6 -> 8
248 // 7 -> A -> B -> A' -> B' -> 9
249 OptionalBoolean use_relocate_subtrip = 25;
250 // Operator which exchanges the positions of two nodes.
251 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 -> 5
252 // (where (1, 5) are first and last nodes of the path and can therefore not
253 // be moved):
254 // 1 -> [3] -> [2] -> 4 -> 5
255 // 1 -> [4] -> 3 -> [2] -> 5
256 // 1 -> 2 -> [4] -> [3] -> 5
257 OptionalBoolean use_exchange = 4;
258 // Operator which exchanges the positions of two pair of nodes. Pairs
259 // correspond to the pickup and delivery pairs defined in the routing model.
260 // Possible neighbor for the paths
261 // 1 -> A -> B -> 2 -> 3 and 4 -> C -> D -> 5
262 // (where (1, 3) and (4, 5) are first and last nodes of the paths and can
263 // therefore not be moved, and (A, B) and (C,D) are pairs of nodes):
264 // 1 -> [C] -> [D] -> 2 -> 3, 4 -> [A] -> [B] -> 5
265 OptionalBoolean use_exchange_pair = 22;
266 // Operator which exchanges subtrips associated to two pairs of nodes,
267 // see use_relocate_subtrip for a definition of subtrips.
268 OptionalBoolean use_exchange_subtrip = 26;
269 // Operator which cross exchanges the starting chains of 2 paths, including
270 // exchanging the whole paths.
271 // First and last nodes are not moved.
272 // Possible neighbors for the paths 1 -> 2 -> 3 -> 4 -> 5 and 6 -> 7 -> 8
273 // (where (1, 5) and (6, 8) are first and last nodes of the paths and can
274 // therefore not be moved):
275 // 1 -> [7] -> 3 -> 4 -> 5 6 -> [2] -> 8
276 // 1 -> [7] -> 4 -> 5 6 -> [2 -> 3] -> 8
277 // 1 -> [7] -> 5 6 -> [2 -> 3 -> 4] -> 8
278 OptionalBoolean use_cross = 5;
279 // Not implemented yet. TODO(b/68128619): Implement.
280 OptionalBoolean use_cross_exchange = 6;
281 // Operator which detects the relocate_expensive_chain_num_arcs_to_consider
282 // most expensive arcs on a path, and moves the chain resulting from cutting
283 // pairs of arcs among these to another position.
284 // Possible neighbors for paths 1 -> 2 (empty) and
285 // 3 -> A ------> B --> C -----> D -> 4 (where A -> B and C -> D are the 2
286 // most expensive arcs, and the chain resulting from breaking them is
287 // B -> C):
288 // 1 -> [B -> C] -> 2 3 -> A -> D -> 4
289 // 1 -> 2 3 -> [B -> C] -> A -> D -> 4
290 // 1 -> 2 3 -> A -> D -> [B -> C] -> 4
291 OptionalBoolean use_relocate_expensive_chain = 23;
292 // --- Intra-route operators ---
293 // Operator which reverses a subchain of a path. It is called TwoOpt
294 // because it breaks two arcs on the path; resulting paths are called
295 // two-optimal.
296 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 -> 5
297 // (where (1, 5) are first and last nodes of the path and can therefore not
298 // be moved):
299 // 1 -> [3 -> 2] -> 4 -> 5
300 // 1 -> [4 -> 3 -> 2] -> 5
301 // 1 -> 2 -> [4 -> 3] -> 5
302 OptionalBoolean use_two_opt = 7;
303 // Operator which moves sub-chains of a path of length 1, 2 and 3 to another
304 // position in the same path.
305 // When the length of the sub-chain is 1, the operator simply moves a node
306 // to another position.
307 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 -> 5, for a sub-chain
308 // length of 2 (where (1, 5) are first and last nodes of the path and can
309 // therefore not be moved):
310 // 1 -> 4 -> [2 -> 3] -> 5
311 // 1 -> [3 -> 4] -> 2 -> 5
312 // The OR_OPT operator is a limited version of 3-Opt (breaks 3 arcs on a
313 // path).
314 OptionalBoolean use_or_opt = 8;
315 // Lin-Kernighan operator.
316 // While the accumulated local gain is positive, performs a 2-OPT or a 3-OPT
317 // move followed by a series of 2-OPT moves. Returns a neighbor for which
318 // the global gain is positive.
319 OptionalBoolean use_lin_kernighan = 9;
320 // Sliding TSP operator.
321 // Uses an exact dynamic programming algorithm to solve the TSP
322 // corresponding to path sub-chains.
323 // For a subchain 1 -> 2 -> 3 -> 4 -> 5 -> 6, solves the TSP on
324 // nodes A, 2, 3, 4, 5, where A is a merger of nodes 1 and 6 such that
325 // cost(A,i) = cost(1,i) and cost(i,A) = cost(i,6).
326 OptionalBoolean use_tsp_opt = 10;
327 // --- Operators on inactive nodes ---
328 // Operator which inserts an inactive node into a path.
329 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 with 5 inactive
330 // (where 1 and 4 are first and last nodes of the path) are:
331 // 1 -> [5] -> 2 -> 3 -> 4
332 // 1 -> 2 -> [5] -> 3 -> 4
333 // 1 -> 2 -> 3 -> [5] -> 4
334 OptionalBoolean use_make_active = 11;
335 // Operator which relocates a node while making an inactive one active.
336 // As of 3/2017, the operator is limited to two kinds of moves:
337 // - Relocating a node and replacing it by an inactive node.
338 // Possible neighbor for path 1 -> 5, 2 -> 3 -> 6 and 4 inactive
339 // (where 1,2 and 5,6 are first and last nodes of paths) is:
340 // 1 -> 3 -> 5, 2 -> 4 -> 6.
341 // - Relocating a node and inserting an inactive node next to it.
342 // Possible neighbor for path 1 -> 5, 2 -> 3 -> 6 and 4 inactive
343 // (where 1,2 and 5,6 are first and last nodes of paths) is:
344 // 1 -> 4 -> 3 -> 5, 2 -> 6.
345 OptionalBoolean use_relocate_and_make_active = 21;
346 // Operator which exchanges two nodes and inserts an inactive node.
347 // Possible neighbors for paths 0 -> 2 -> 4, 1 -> 3 -> 6 and 5 inactive are:
348 // 0 -> 3 -> 4, 1 -> 5 -> 2 -> 6
349 // 0 -> 3 -> 5 -> 4, 1 -> 2 -> 6
350 // 0 -> 5 -> 3 -> 4, 1 -> 2 -> 6
351 // 0 -> 3 -> 4, 1 -> 2 -> 5 -> 6
352 OptionalBoolean use_exchange_and_make_active = 37;
353 // Operator which exchanges the first and last nodes of two paths and makes
354 // a node active.
355 // Possible neighbors for paths 0 -> 1 -> 2 -> 7, 6 -> 3 -> 4 -> 8
356 // and 5 inactive are:
357 // 0 -> 5 -> 3 -> 4 -> 7, 6 -> 1 -> 2 -> 8
358 // 0 -> 3 -> 4 -> 7, 6 -> 1 -> 5 -> 2 -> 8
359 // 0 -> 3 -> 4 -> 7, 6 -> 1 -> 2 -> 5 -> 8
360 // 0 -> 3 -> 5 -> 4 -> 7, 6 -> 1 -> 2 -> 8
361 // 0 -> 3 -> 4 -> 5 -> 7, 6 -> 1 -> 2 -> 8
362 OptionalBoolean use_exchange_path_start_ends_and_make_active = 38;
363 // Operator which makes path nodes inactive.
364 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 (where 1 and 4 are first
365 // and last nodes of the path) are:
366 // 1 -> 3 -> 4 with 2 inactive
367 // 1 -> 2 -> 4 with 3 inactive
368 OptionalBoolean use_make_inactive = 12;
369 // Operator which makes a "chain" of path nodes inactive.
370 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 (where 1 and 4 are first
371 // and last nodes of the path) are:
372 // 1 -> 3 -> 4 with 2 inactive
373 // 1 -> 2 -> 4 with 3 inactive
374 // 1 -> 4 with 2 and 3 inactive
375 OptionalBoolean use_make_chain_inactive = 13;
376 // Operator which replaces an active node by an inactive one.
377 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 with 5 inactive
378 // (where 1 and 4 are first and last nodes of the path) are:
379 // 1 -> [5] -> 3 -> 4 with 2 inactive
380 // 1 -> 2 -> [5] -> 4 with 3 inactive
381 OptionalBoolean use_swap_active = 14;
382 // Operator which replaces a chain of active nodes by an inactive one.
383 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 with 5 inactive
384 // (where 1 and 4 are first and last nodes of the path) are:
385 // 1 -> [5] -> 3 -> 4 with 2 inactive
386 // 1 -> 2 -> [5] -> 4 with 3 inactive
387 // 1 -> [5] -> 4 with 2 and 3 inactive
388 OptionalBoolean use_swap_active_chain = 35;
389 // Operator which makes an inactive node active and an active one inactive.
390 // It is similar to SwapActiveOperator excepts that it tries to insert the
391 // inactive node in all possible positions instead of just the position of
392 // the node made inactive.
393 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 with 5 inactive
394 // (where 1 and 4 are first and last nodes of the path) are:
395 // 1 -> [5] -> 3 -> 4 with 2 inactive
396 // 1 -> 3 -> [5] -> 4 with 2 inactive
397 // 1 -> [5] -> 2 -> 4 with 3 inactive
398 // 1 -> 2 -> [5] -> 4 with 3 inactive
399 OptionalBoolean use_extended_swap_active = 15;
400 // Swaps active nodes from node alternatives in sequence. Considers chains
401 // of nodes with alternatives, builds a DAG from the chain, each "layer" of
402 // the DAG being composed of the set of alternatives of the node at a given
403 // rank in the chain, fully connected to the next layer. A neighbor is built
404 // from the shortest path starting from the node before the chain (source),
405 // through the DAG to the node following the chain.
406 OptionalBoolean use_shortest_path_swap_active = 34;
407 // Similar to use_two_opt but returns the shortest path on the DAG of node
408 // alternatives of the reversed chain (cf. use_shortest_path_swap_active).
409 OptionalBoolean use_shortest_path_two_opt = 36;
410 // Operator which makes an inactive node active and an active pair of nodes
411 // inactive OR makes an inactive pair of nodes active and an active node
412 // inactive.
413 // Possible neighbors for the path 1 -> 2 -> 3 -> 4 with 5 inactive
414 // (where 1 and 4 are first and last nodes of the path and (2,3) is a pair
415 // of nodes) are:
416 // 1 -> [5] -> 4 with (2,3) inactive
417 // Possible neighbors for the path 1 -> 2 -> 3 with (4,5) inactive
418 // (where 1 and 3 are first and last nodes of the path and (4,5) is a pair
419 // of nodes) are:
420 // 1 -> [4] -> [5] -> 3 with 2 inactive
421 OptionalBoolean use_node_pair_swap_active = 20;
422 // --- Large neighborhood search operators ---
423 // Operator which relaxes two sub-chains of three consecutive arcs each.
424 // Each sub-chain is defined by a start node and the next three arcs. Those
425 // six arcs are relaxed to build a new neighbor.
426 // PATH_LNS explores all possible pairs of starting nodes and so defines
427 // n^2 neighbors, n being the number of nodes.
428 // Note that the two sub-chains can be part of the same path; they even may
429 // overlap.
430 OptionalBoolean use_path_lns = 16;
431 // Operator which relaxes one entire path and all inactive nodes.
432 OptionalBoolean use_full_path_lns = 17;
433 // TSP-base LNS.
434 // Randomly merges consecutive nodes until n "meta"-nodes remain and solves
435 // the corresponding TSP.
436 // This defines an "unlimited" neighborhood which must be stopped by search
437 // limits. To force diversification, the operator iteratively forces each
438 // node to serve as base of a meta-node.
439 OptionalBoolean use_tsp_lns = 18;
440 // Operator which relaxes all inactive nodes and one sub-chain of six
441 // consecutive arcs. That way the path can be improved by inserting inactive
442 // nodes or swapping arcs.
443 OptionalBoolean use_inactive_lns = 19;
444 // --- LNS-like large neighborhood search operators using heuristics ---
445 // Operator which makes all nodes on a route unperformed, and reinserts them
446 // using the GlobalCheapestInsertion heuristic.
447 OptionalBoolean use_global_cheapest_insertion_path_lns = 27;
448 // Same as above but using LocalCheapestInsertion as a heuristic.
449 OptionalBoolean use_local_cheapest_insertion_path_lns = 28;
450 // The following operator relocates an entire route to an empty path and
451 // then tries to insert the unperformed nodes using the global cheapest
452 // insertion heuristic.
453 OptionalBoolean
454 use_relocate_path_global_cheapest_insertion_insert_unperformed = 33;
455 // This operator finds heuristic_expensive_chain_lns_num_arcs_to_consider
456 // most expensive arcs on a route, makes the nodes in between pairs of these
457 // expensive arcs unperformed, and reinserts them using the
458 // GlobalCheapestInsertion heuristic.
459 OptionalBoolean use_global_cheapest_insertion_expensive_chain_lns = 29;
460 // Same as above but using LocalCheapestInsertion as a heuristic for
461 // insertion.
462 OptionalBoolean use_local_cheapest_insertion_expensive_chain_lns = 30;
463 // The following operator makes a node and its
464 // heuristic_close_nodes_lns_num_nodes closest neighbors unperformed along
465 // with each of their corresponding performed pickup/delivery pairs, and
466 // then reinserts them using the GlobalCheapestInsertion heuristic.
467 OptionalBoolean use_global_cheapest_insertion_close_nodes_lns = 31;
468 // Same as above, but insertion positions for nodes are determined by the
469 // LocalCheapestInsertion heuristic.
470 OptionalBoolean use_local_cheapest_insertion_close_nodes_lns = 32;
471 }
472 LocalSearchNeighborhoodOperators local_search_operators = 3;
473
474 // Neighbors ratio and minimum number of neighbors considered in local
475 // search operators (see cheapest_insertion_first_solution_neighbors_ratio
476 // and cheapest_insertion_first_solution_min_neighbors for more information).
477 double ls_operator_neighbors_ratio = 53;
478 int32 ls_operator_min_neighbors = 54;
479
480 // If true, the solver will use multi-armed bandit concatenate operators. It
481 // dynamically chooses the next neighbor operator in order to get the best
482 // objective improvement.
483 bool use_multi_armed_bandit_concatenate_operators = 41;
484
485 // Memory coefficient related to the multi-armed bandit compound operator.
486 // Sets how much the objective improvement of previous accepted neighbors
487 // influence the current average improvement.
488 // This parameter should be between 0 and 1.
489 double multi_armed_bandit_compound_operator_memory_coefficient = 42;
490
491 // Positive parameter defining the exploration coefficient of the multi-armed
492 // bandit compound operator. Sets how often we explore rarely used and
493 // unsuccessful in the past operators
494 double multi_armed_bandit_compound_operator_exploration_coefficient = 43;
495
496 // Maximum size of the chain to make inactive in SwapActiveChainOperator.
497 int32 max_swap_active_chain_size = 66;
498
499 // Number of expensive arcs to consider cutting in the RelocateExpensiveChain
500 // neighborhood operator (see
501 // LocalSearchNeighborhoodOperators.use_relocate_expensive_chain()).
502 // This parameter must be greater than 2.
503 // NOTE(user): The number of neighbors generated by the operator for
504 // relocate_expensive_chain_num_arcs_to_consider = K is around
505 // K*(K-1)/2 * number_of_routes * number_of_nodes.
506 int32 relocate_expensive_chain_num_arcs_to_consider = 20;
507
508 // Number of expensive arcs to consider cutting in the
509 // FilteredHeuristicExpensiveChainLNSOperator operator.
510 int32 heuristic_expensive_chain_lns_num_arcs_to_consider = 32;
511
512 // Number of closest nodes to consider for each node during the destruction
513 // phase of the FilteredHeuristicCloseNodesLNSOperator.
514 int32 heuristic_close_nodes_lns_num_nodes = 35;
515
516 // Local search metaheuristics used to guide the search.
517 LocalSearchMetaheuristic.Value local_search_metaheuristic = 4;
518 // Local search metaheuristics alternatively used to guide the search. Every
519 // num_max_local_optima_before_metaheuristic_switch local minima found by a
520 // metaheurisitic, the solver will switch to the next metaheuristic. Cannot be
521 // defined if local_search_metaheuristic is different from UNSET or AUTOMATIC.
522 repeated LocalSearchMetaheuristic.Value local_search_metaheuristics = 63;
523 int32 num_max_local_optima_before_metaheuristic_switch = 64;
524 // These are advanced settings which should not be modified unless you know
525 // what you are doing.
526 // Lambda coefficient used to penalize arc costs when GUIDED_LOCAL_SEARCH is
527 // used. Must be positive.
528 double guided_local_search_lambda_coefficient = 5;
529 // Whether to reset penalties when a new best solution is found. The effect is
530 // that a greedy descent is started before the next penalization phase.
531 bool guided_local_search_reset_penalties_on_new_best_solution = 51;
532 // When an arc leaving a vehicle start or arriving at a vehicle end is
533 // penalized, this field controls whether to penalize all other equivalent
534 // arcs with starts or ends in the same vehicle class.
535 bool guided_local_search_penalize_with_vehicle_classes = 61;
536 // Whether to consider arc penalties in cost functions used in local search
537 // operators using arc costs.
538 bool use_guided_local_search_penalties_in_local_search_operators = 62;
539
540 // --- Search control ---
541 //
542 // If true, the solver should use depth-first search rather than local search
543 // to solve the problem.
544 bool use_depth_first_search = 6;
545 // If true, use the CP solver to find a solution. Either local or depth-first
546 // search will be used depending on the value of use_depth_first_search. Will
547 // be run before the CP-SAT solver (cf. use_cp_sat).
548 OptionalBoolean use_cp = 28;
549 // If true, use the CP-SAT solver to find a solution. If use_cp is also true,
550 // the CP-SAT solver will be run after the CP solver if there is time
551 // remaining and will use the CP solution as a hint for the CP-SAT search.
552 // As of 5/2019, only TSP models can be solved.
553 OptionalBoolean use_cp_sat = 27;
554 // If true, use the CP-SAT solver to find a solution on generalized routing
555 // model. If use_cp is also true, the CP-SAT solver will be run after the CP
556 // solver if there is time remaining and will use the CP solution as a hint
557 // for the CP-SAT search.
558 OptionalBoolean use_generalized_cp_sat = 47;
559 // If use_cp_sat or use_generalized_cp_sat is true, contains the SAT algorithm
560 // parameters which will be used.
561 sat.SatParameters sat_parameters = 48;
562 // If use_cp_sat or use_generalized_cp_sat is true, will report intermediate
563 // solutions found by CP-SAT to solution listeners.
564 bool report_intermediate_cp_sat_solutions = 56;
565 // If model.Size() is less than the threshold and that no solution has been
566 // found, attempt a pass with CP-SAT.
567 int32 fallback_to_cp_sat_size_threshold = 52;
568 // Underlying solver to use in dimension scheduling, respectively for
569 // continuous and mixed models.
570 enum SchedulingSolver {
571 SCHEDULING_UNSET = 0;
572 SCHEDULING_GLOP = 1;
573 SCHEDULING_CP_SAT = 2;
574 }
575 SchedulingSolver continuous_scheduling_solver = 33;
576 SchedulingSolver mixed_integer_scheduling_solver = 34;
577 // Setting this to true completely disables the LP and MIP scheduling in the
578 // solver. This overrides the 2 SchedulingSolver options above.
579 optional bool disable_scheduling_beware_this_may_degrade_performance = 50;
580 // Minimum step by which the solution must be improved in local search. 0
581 // means "unspecified". If this value is fractional, it will get rounded to
582 // the nearest integer.
583 double optimization_step = 7;
584 // Number of solutions to collect during the search. Corresponds to the best
585 // solutions found during the search. 0 means "unspecified".
586 int32 number_of_solutions_to_collect = 17;
587 // -- Search limits --
588 // Limit to the number of solutions generated during the search. 0 means
589 // "unspecified".
590 int64 solution_limit = 8;
591 // Limit to the time spent in the search.
592 google.protobuf.Duration time_limit = 9;
593 // Limit to the time spent in the completion search for each local search
594 // neighbor.
595 google.protobuf.Duration lns_time_limit = 10;
596 // Ratio of the overall time limit spent in a secondary LS phase with only
597 // intra-route and insertion operators, meant to "cleanup" the current
598 // solution before stopping the search.
599 // TODO(user): Since these operators are very fast, add a parameter to cap
600 // the max time allocated for this second phase (e.g.
601 // Duration max_secondary_ls_time_limit).
602 double secondary_ls_time_limit_ratio = 57;
603
604 // Parameters required for the improvement search limit.
605 message ImprovementSearchLimitParameters {
606 // Parameter that regulates exchange rate between objective improvement and
607 // number of neighbors spent. The smaller the value, the sooner the limit
608 // stops the search. Must be positive.
609 double improvement_rate_coefficient = 38;
610 // Parameter that specifies the distance between improvements taken into
611 // consideration for calculating the improvement rate.
612 // Example: For 5 objective improvements = (10, 8, 6, 4, 2), and the
613 // solutions_distance parameter of 2, then the improvement_rate will be
614 // computed for (10, 6), (8, 4), and (6, 2).
615 int32 improvement_rate_solutions_distance = 39;
616 }
617 // The improvement search limit is added to the solver if the following
618 // parameters are set.
619 ImprovementSearchLimitParameters improvement_limit_parameters = 37;
620
621 // --- Propagation control ---
622 // These are advanced settings which should not be modified unless you know
623 // what you are doing.
624 //
625 // Use constraints with full propagation in routing model (instead of 'light'
626 // propagation only). Full propagation is only necessary when using
627 // depth-first search or for models which require strong propagation to
628 // finalize the value of secondary variables.
629 // Changing this setting to true will slow down the search in most cases and
630 // increase memory consumption in all cases.
631 bool use_full_propagation = 11;
632
633 // --- Miscellaneous ---
634 // Some of these are advanced settings which should not be modified unless you
635 // know what you are doing.
636 //
637 // Activates search logging. For each solution found during the search, the
638 // following will be displayed: its objective value, the maximum objective
639 // value since the beginning of the search, the elapsed time since the
640 // beginning of the search, the number of branches explored in the search
641 // tree, the number of failures in the search tree, the depth of the search
642 // tree, the number of local search neighbors explored, the number of local
643 // search neighbors filtered by local search filters, the number of local
644 // search neighbors accepted, the total memory used and the percentage of the
645 // search done.
646 bool log_search = 13;
647 // In logs, cost values will be scaled and offset by the given values in the
648 // following way: log_cost_scaling_factor * (cost + log_cost_offset)
649 double log_cost_scaling_factor = 22;
650 double log_cost_offset = 29;
651 // In logs, this tag will be appended to each line corresponding to a new
652 // solution. Useful to sort out logs when several solves are run in parallel.
653 string log_tag = 36;
654
655 // Whether the solver should use an Iterated Local Search approach to solve
656 // the problem.
657 bool use_iterated_local_search = 58;
658
659 // Iterated Local Search parameters.
660 IteratedLocalSearchParameters iterated_local_search_parameters = 60;
661}
662
663// Parameters which have to be set when creating a RoutingModel.
664message RoutingModelParameters {
665 // Parameters to use in the underlying constraint solver.
666 ConstraintSolverParameters solver_parameters = 1;
667 // Advanced settings.
668 // If set to true reduction of the underlying constraint model will be
669 // attempted when all vehicles have exactly the same cost structure. This can
670 // result in significant speedups.
671 bool reduce_vehicle_cost_model = 2;
672 // Cache callback calls if the number of nodes in the model is less or equal
673 // to this value.
674 int32 max_callback_cache_size = 3;
675}