InjectedSolutionConstraint

Solución insertada en la solicitud, incluida información sobre qué visitas se deben restringir y cómo se deben restringir

Representación JSON
{
  "routes": [
    {
      object (ShipmentRoute)
    }
  ],
  "skippedShipments": [
    {
      object (SkippedShipment)
    }
  ],
  "constraintRelaxations": [
    {
      object (ConstraintRelaxation)
    }
  ]
}
Campos
routes[]

object (ShipmentRoute)

Son las rutas de la solución que se insertarán. Es posible que se omitan algunas rutas de la solución original. Las rutas y los envíos omitidos deben satisfacer las suposiciones de validez básicas que se enumeran para injectedFirstSolutionRoutes.

skippedShipments[]

object (SkippedShipment)

Se omitieron los envíos de la solución para insertar. Es posible que se omitan algunos de la solución original. Consulta el campo routes.

constraintRelaxations[]

object (ConstraintRelaxation)

Para cero o más grupos de vehículos, especifica cuándo y en qué medida se deben relajar las restricciones. Si este campo está vacío, todas las rutas de vehículos que no estén vacías estarán completamente restringidas.

ConstraintRelaxation

Para un grupo de vehículos, especifica en qué umbrales se relajarán las restricciones de visitas y hasta qué nivel. Los envíos que se indican en el campo skipped_shipment se omiten, es decir, no se pueden realizar.

Representación JSON
{
  "relaxations": [
    {
      object (Relaxation)
    }
  ],
  "vehicleIndices": [
    integer
  ]
}
Campos
relaxations[]

object (Relaxation)

Todas las relajaciones de las restricciones de visitas que se aplicarán a las visitas en rutas con vehículos en vehicleIndices.

vehicleIndices[]

integer

Especifica los índices de vehículos a los que se aplica la restricción de visita relaxations. Si está vacío, se considera el valor predeterminado y el relaxations se aplica a todos los vehículos que no se especifican en otros constraintRelaxations. Puede haber como máximo un valor predeterminado, es decir, se permite un campo de relajación de restricciones vacío vehicleIndices. Un índice de vehículo solo se puede incluir una vez, incluso dentro de varios constraintRelaxations.

Un índice de vehículo se asigna de la misma manera que ShipmentRoute.vehicle_index si interpretInjectedSolutionsUsingLabels es verdadero (consulta el comentario fields).

Relajación

Si relaxations está vacío, la hora de inicio y la secuencia de todas las visitas en routes están completamente restringidas y no se pueden insertar ni agregar visitas nuevas a esas rutas. Además, la hora de inicio y finalización de un vehículo en routes está completamente restringida, a menos que el vehículo esté vacío (es decir, no tenga visitas y tenga usedIfRouteIsEmpty establecido como falso en el modelo).

relaxations(i).level especifica el nivel de relajación de restricciones aplicado a una visita #j que satisface lo siguiente:

  • route.visits(j).start_time >= relaxations(i).threshold_time Y
  • j + 1 >= relaxations(i).threshold_visit_count

De manera similar, el inicio del vehículo se relaja a relaxations(i).level si cumple con los siguientes requisitos:

  • vehicleStartTime >= relaxations(i).threshold_time Y
  • relaxations(i).threshold_visit_count == 0 y el extremo del vehículo se relaja a relaxations(i).level si se cumple con lo siguiente:
  • vehicleEndTime >= relaxations(i).threshold_time Y
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Para aplicar un nivel de relajación si una visita cumple con thresholdVisitCount O thresholdTime, agrega dos relaxations con el mismo level: uno con solo thresholdVisitCount establecido y el otro con solo thresholdTime establecido. Si una visita satisface las condiciones de varios relaxations, se aplica el nivel más flexible. Como resultado, desde el inicio del vehículo hasta las visitas a la ruta hasta el final del vehículo, el nivel de relajación se vuelve más relajado, es decir, el nivel de relajación no disminuye a medida que avanza la ruta.

El tiempo y la secuencia de las visitas a la ruta que no satisfacen las condiciones de umbral de ningún relaxations están completamente restringidos y no se pueden insertar visitas en estas secuencias. Además, si el inicio o el final de un vehículo no satisface las condiciones de ninguna relajación, la hora es fija, a menos que el vehículo esté vacío.

Representación JSON
{
  "level": enum (Level),
  "thresholdTime": string,
  "thresholdVisitCount": integer
}
Campos
level

enum (Level)

Es el nivel de relajación de restricciones que se aplica cuando se cumplen las condiciones en thresholdTime o después de thresholdTime Y al menos thresholdVisitCount.

thresholdTime

string (Timestamp format)

Es la hora en la que se puede aplicar la relajación level o después de ella.

Una marca de tiempo en formato RFC3339 UTC “Zulú”, con una resolución de nanosegundos y hasta nueve dígitos fraccionarios. Ejemplos: "2014-10-02T15:01:23Z" y "2014-10-02T15:01:23.045123456Z".

thresholdVisitCount

integer

Es la cantidad de visitas en las que se puede aplicar la relajación level o después de ellas. Si thresholdVisitCount es 0 (o no se establece), se puede aplicar level directamente al inicio del vehículo.

Si es route.visits_size() + 1, level solo se puede aplicar al extremo del vehículo. Si es mayor que route.visits_size() + 1, no se aplica level para esa ruta.

Nivel

Expresa los diferentes niveles de relajación de restricciones, que se aplican para una visita y los que siguen cuando se satisfacen las condiciones del umbral.

La enumeración que aparece a continuación está en orden de relajación creciente.

Enumeraciones
LEVEL_UNSPECIFIED

Nivel de relajación predeterminado implícito: No se relajan las restricciones, es decir, todas las visitas están completamente restringidas.

Este valor no se debe usar de forma explícita en level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Se flexibilizarán las horas de inicio y finalización de las visitas y de los vehículos, pero cada visita seguirá vinculada al mismo vehículo y se deberá respetar la secuencia de visitas: no se puede insertar ninguna visita entre ellas ni antes de ellas.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Igual que RELAX_VISIT_TIMES_AFTER_THRESHOLD, pero la secuencia de visitas también es flexible: solo este vehículo puede realizar las visitas, pero es posible que no se realicen.
RELAX_ALL_AFTER_THRESHOLD Igual que RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, pero el vehículo también está relajado: las visitas son completamente gratuitas en el momento del umbral o después de este, y es posible que no se realicen.