Solution injected in the request including information about which visits must be constrained and how they must be constrained.
JSON representation |
---|
{ "routes": [ { object ( |
Fields | |
---|---|
routes[] |
Routes of the solution to inject. Some routes may be omitted from the original solution. The routes and skipped shipments must satisfy the basic validity assumptions listed for |
skippedShipments[] |
Skipped shipments of the solution to inject. Some may be omitted from the original solution. See the |
constraintRelaxations[] |
For zero or more groups of vehicles, specifies when and how much to relax constraints. If this field is empty, all non-empty vehicle routes are fully constrained. |
ConstraintRelaxation
For a group of vehicles, specifies at what threshold(s) constraints on visits will be relaxed and to which level. Shipments listed in the skipped_shipment
field are constrained to be skipped; i.e., they cannot be performed.
JSON representation |
---|
{
"relaxations": [
{
object ( |
Fields | |
---|---|
relaxations[] |
All the visit constraint relaxations that will apply to visits on routes with vehicles in |
vehicleIndices[] |
Specifies the vehicle indices to which the visit constraint A vehicle index is mapped the same as |
Relaxation
If relaxations
is empty, the start time and sequence of all visits on routes
are fully constrained and no new visits may be inserted or added to those routes. Also, a vehicle's start and end time in routes
is fully constrained, unless the vehicle is empty (i.e., has no visits and has usedIfRouteIsEmpty
set to false in the model).
relaxations(i).level
specifies the constraint relaxation level applied to a visit #j that satisfies:
route.visits(j).start_time >= relaxations(i).threshold_time
ANDj + 1 >= relaxations(i).threshold_visit_count
Similarly, the vehicle start is relaxed to relaxations(i).level
if it satisfies:
vehicleStartTime >= relaxations(i).threshold_time
ANDrelaxations(i).threshold_visit_count == 0
and the vehicle end is relaxed torelaxations(i).level
if it satisfies:vehicleEndTime >= relaxations(i).threshold_time
ANDroute.visits_size() + 1 >= relaxations(i).threshold_visit_count
To apply a relaxation level if a visit meets the thresholdVisitCount
OR the thresholdTime
add two relaxations
with the same level
: one with only thresholdVisitCount
set and the other with only thresholdTime
set. If a visit satisfies the conditions of multiple relaxations
, the most relaxed level applies. As a result, from the vehicle start through the route visits in order to the vehicle end, the relaxation level becomes more relaxed: i.e., the relaxation level is non-decreasing as the route progresses.
The timing and sequence of route visits that do not satisfy the threshold conditions of any relaxations
are fully constrained and no visits may be inserted into these sequences. Also, if a vehicle start or end does not satisfy the conditions of any relaxation the time is fixed, unless the vehicle is empty.
JSON representation |
---|
{
"level": enum ( |
Fields | |
---|---|
level |
The constraint relaxation level that applies when the conditions at or after |
thresholdTime |
The time at or after which the relaxation A timestamp in RFC3339 UTC "Zulu" format, with nanosecond resolution and up to nine fractional digits. Examples: |
thresholdVisitCount |
The number of visits at or after which the relaxation If it is |
Level
Expresses the different constraint relaxation levels, which are applied for a visit and those that follow when it satifies the threshold conditions.
The enumeration below is in order of increasing relaxation.
Enums | |
---|---|
LEVEL_UNSPECIFIED |
Implicit default relaxation level: no constraints are relaxed, i.e., all visits are fully constrained. This value must not be explicly used in |
RELAX_VISIT_TIMES_AFTER_THRESHOLD |
Visit start times and vehicle start/end times will be relaxed, but each visit remains bound to the same vehicle and the visit sequence must be observed: no visit can be inserted between them or before them. |
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD |
Same as RELAX_VISIT_TIMES_AFTER_THRESHOLD , but the visit sequence is also relaxed: visits remain simply bound to their vehicle. |
RELAX_ALL_AFTER_THRESHOLD |
Same as RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD , but the vehicle is also relaxed: visits are completely free at or after the threshold time and can potentially become unperformed. |