InjectedSolutionConstraint

Es la solución insertada en la solicitud, que incluye 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á. Es posible que algunas rutas se omitan de la solución original. Las rutas y los envíos omitidos deben satisfacer las suposiciones básicas de validez que se indican para injectedFirstSolutionRoutes.

skippedShipments[]

object (SkippedShipment)

Son los envíos omitidos de la solución que se insertará. Es posible que algunos se omitan en la solución original. Observa el campo routes.

constraintRelaxations[]

object (ConstraintRelaxation)

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

ConstraintRelaxation

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

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

object (Relaxation)

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

vehicleIndices[]

integer

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

Un índice de vehículo se asigna de la misma manera que ShipmentRoute.vehicle_index, si interpretInjectedSolutionsUsingLabels es verdadero (consulta el comentario de 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 la restricción que se aplica 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

Del mismo modo, el inicio del vehículo se relaja a relaxations(i).level si satisface lo siguiente:

  • 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 satisface 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 el final, pasando por las visitas a la ruta en orden, 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 momento 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 satisfacen las condiciones de ninguna relajación, la hora se 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 la restricción que se aplica cuando se cumplen las condiciones en thresholdTime o después de este Y, al menos, en thresholdVisitCount.

thresholdTime

string (Timestamp format)

Fecha y hora en la que se puede aplicar la relajación level.

Usa el formato RFC 3339, en el que el resultado generado siempre estará normalizada a Z y usa 0, 3, 6 o 9 dígitos fraccionarios. También se aceptan otras compensaciones que no sean “Z”. Ejemplos: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" o "2014-10-02T15:01:23+05:30".

thresholdVisitCount

integer

Cantidad de visitas a partir de la cual se puede aplicar la relajación level. Si thresholdVisitCount es 0 (o no está configurado), el level se puede aplicar directamente al inicio del vehículo.

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

Nivel

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

La siguiente enumeración se presenta en orden de relajación creciente.

Enums
LEVEL_UNSPECIFIED

Nivel de relajación predeterminado implícito: No se relaja ninguna restricción, 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 los horarios de inicio de las visitas y los horarios de inicio y finalización de los vehículos, pero cada visita seguirá vinculada al mismo vehículo y se deberá observar la secuencia de visitas: no se puede insertar ninguna visita entre ellas ni antes de ellas.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Es igual que RELAX_VISIT_TIMES_AFTER_THRESHOLD, pero la secuencia de visitas también es flexible: solo este vehículo puede realizar visitas, pero estas pueden no realizarse.
RELAX_ALL_AFTER_THRESHOLD Es 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 pueden dejar de realizarse.