ShipmentModel

Un modelo de envío contiene un conjunto de envíos que debe realizar un conjunto de vehículos, a la vez que se minimiza el costo general, que es la suma de lo siguiente:

  • el costo de enrutar los vehículos (suma del costo por tiempo total, el costo por duración del viaje y el costo fijo de todos los vehículos)
  • las penalizaciones por envíos no realizados.
  • el costo de la duración global de los envíos
Representación JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "objectives": [
    {
      object (Objective)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
Campos
shipments[]

object (Shipment)

Es el conjunto de envíos que se deben realizar en el modelo.

vehicles[]

object (Vehicle)

Es el conjunto de vehículos que se pueden usar para realizar visitas.

objectives[]

object (Objective)

Es el conjunto de objetivos de este modelo, que transformaremos en costos. Si no está vacío, el modelo de entrada debe ser sin costo. Para obtener la solicitud modificada, usa solvingMode = TRANSFORM_AND_RETURN_REQUEST. Ten en cuenta que, en este caso, no se resolverá la solicitud. Consulta la documentación correspondiente.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request para obtener más detalles.

globalStartTime

string (Timestamp format)

Hora de inicio y finalización global del modelo: no se puede considerar válida ninguna hora fuera de este rango.

El intervalo de tiempo del modelo debe ser inferior a un año, es decir, el globalEndTime y el globalStartTime deben estar dentro de los 31,536,000 segundos entre sí.

Cuando uses campos cost_per_*hour, te recomendamos que configures esta ventana en un intervalo más pequeño para aumentar el rendimiento (p. ej., si modelas un solo día, debes configurar los límites de tiempo globales para ese día). Si no se establece, se usa 00:00:00 UTC, 1 de enero de 1970 (es decir, segundos: 0, nanosegundos: 0) como valor predeterminado.

Usa el formato RFC 3339, en el que el resultado generado siempre usará la normalización Z y los dígitos fraccionarios 0, 3, 6 o 9. 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".

globalEndTime

string (Timestamp format)

Si no se establece, se usa como valor predeterminado el 1 de enero de 1971 a las 00:00:00 UTC (es decir, segundos: 31536000, nanosegundos: 0).

Usa el formato RFC 3339, en el que el resultado generado siempre usará la normalización Z y los dígitos fraccionarios 0, 3, 6 o 9. 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".

globalDurationCostPerHour

number

La "duración global" del plan general es la diferencia entre la hora de inicio efectiva más temprana y la hora de finalización efectiva más tardía de todos los vehículos. Los usuarios pueden asignar un costo por hora a esa cantidad para intentar optimizar la finalización más temprana del trabajo, por ejemplo. Este costo debe estar en la misma unidad que Shipment.penalty_cost.

durationDistanceMatrices[]

object (DurationDistanceMatrix)

Especifica las matrices de duración y distancia que se usan en el modelo. Si este campo está vacío, se usarán las distancias de Google Maps o geodésicas, según el valor del campo useGeodesicDistances. Si no está vacío, useGeodesicDistances no puede ser verdadero, y ni durationDistanceMatrixSrcTags ni durationDistanceMatrixDstTags pueden estar vacíos.

Ejemplos de uso:

  • Hay dos ubicaciones: locA y locB.
  • 1 vehículo que comienza su ruta en locA y la termina en locA
  • 1 solicitud de visita de retiro en locB
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Hay tres ubicaciones: locA, locB y locC.
  • 1 vehículo que comienza su ruta en locA y la finaliza en locB, con la matriz "fast".
  • 1 vehículo que comienza su ruta en locB y la termina en locB, con la matriz "slow".
  • 1 vehículo que comienza su ruta en locB y la termina en locB, con la matriz "fast".
  • 1 solicitud de visita de retiro en locC
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
durationDistanceMatrixSrcTags[]

string

Son etiquetas que definen las fuentes de las matrices de duración y distancia. durationDistanceMatrices(i).rows(j) define las duraciones y distancias de las visitas con la etiqueta durationDistanceMatrixSrcTags(j) a otras visitas en la matriz i.

Las etiquetas corresponden a VisitRequest.tags o Vehicle.start_tags. Un VisitRequest o Vehicle determinado debe coincidir exactamente con una etiqueta de este campo. Ten en cuenta que las etiquetas de origen, destino y matriz de un Vehicle pueden ser las mismas. Del mismo modo, las etiquetas de origen y destino de un VisitRequest pueden ser las mismas. Todas las etiquetas deben ser diferentes y no pueden ser cadenas vacías. Si este campo no está vacío, durationDistanceMatrices no debe estar vacío.

durationDistanceMatrixDstTags[]

string

Son etiquetas que definen los destinos de las matrices de duración y distancia; durationDistanceMatrices(i).rows(j).durations(k) (resp. durationDistanceMatrices(i).rows(j).meters(k)) define la duración (resp. la distancia) del viaje desde las visitas con la etiqueta durationDistanceMatrixSrcTags(j) hasta las visitas con la etiqueta durationDistanceMatrixDstTags(k) en la matriz i.

Las etiquetas corresponden a VisitRequest.tags o Vehicle.start_tags. Un VisitRequest o Vehicle determinado debe coincidir exactamente con una etiqueta de este campo. Ten en cuenta que las etiquetas de origen, destino y matriz de un Vehicle pueden ser las mismas. Del mismo modo, las etiquetas de origen y destino de un VisitRequest pueden ser las mismas. Todas las etiquetas deben ser diferentes y no pueden ser cadenas vacías. Si este campo no está vacío, durationDistanceMatrices no debe estar vacío.

transitionAttributes[]

object (TransitionAttributes)

Atributos de transición agregados al modelo.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Conjuntos de shipment_types incompatibles (consulta ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Conjuntos de requisitos de shipmentType (consulta ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

Es el conjunto de reglas de precedencia que se deben aplicar en el modelo.

IMPORTANTE: El uso de reglas de precedencia limita el tamaño del problema que se puede optimizar. Es posible que se rechacen las solicitudes que usen reglas de precedencia que incluyan muchos envíos.

maxActiveVehicles

integer

Restringe la cantidad máxima de vehículos activos. Un vehículo está activo si su ruta realiza al menos un envío. Esto se puede usar para limitar la cantidad de rutas en el caso de que haya menos conductores que vehículos y que la flota de vehículos sea heterogénea. Luego, la optimización seleccionará el mejor subconjunto de vehículos para usar. Debe ser estrictamente positivo.

Envío

Es el envío de un solo artículo, desde uno de sus puntos de retiro hasta uno de sus puntos de entrega. Para que el envío se considere realizado, un vehículo único debe visitar una de sus ubicaciones de retiro (y disminuir sus capacidades de reserva según corresponda) y, luego, visitar una de sus ubicaciones de entrega (y, por lo tanto, volver a aumentar sus capacidades de reserva según corresponda).

Representación JSON
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
Campos
displayName

string

Es el nombre visible del envío definido por el usuario. Puede tener hasta 63 caracteres y puede usar caracteres UTF-8.

pickups[]

object (VisitRequest)

Es el conjunto de alternativas de retiro asociadas al envío. Si no se especifica, el vehículo solo necesita visitar una ubicación correspondiente a las entregas.

deliveries[]

object (VisitRequest)

Es el conjunto de alternativas de entrega asociadas al envío. Si no se especifica, el vehículo solo debe visitar una ubicación que corresponda a las recogidas.

loadDemands

map (key: string, value: object (Load))

Son las demandas de carga del envío (por ejemplo, peso, volumen, cantidad de palés, etcétera). Las claves del mapa deben ser identificadores que describan el tipo de carga correspondiente y, de ser posible, también deben incluir las unidades. Por ejemplo: "weight_kg", "volume_gallons", "pallet_count", etc. Si una clave determinada no aparece en el mapa, la carga correspondiente se considera nula.

allowedVehicleIndices[]

integer

Es el conjunto de vehículos que pueden realizar este envío. Si está vacío, todos los vehículos pueden realizarlo. Los vehículos se indican por su índice en la lista vehicles de ShipmentModel.

costsPerVehicle[]

number

Especifica el costo en el que se incurre cuando cada vehículo entrega este envío. Si se especifica, debe tener una de las siguientes opciones:

  • la misma cantidad de elementos que costsPerVehicleIndices. costsPerVehicle[i] corresponde al vehículo costsPerVehicleIndices[i] del modelo.
  • la misma cantidad de elementos que la cantidad de vehículos en el modelo. El i-ésimo elemento corresponde al vehículo #i del modelo.

Estos costos deben estar en la misma unidad que penaltyCost y no deben ser negativos. Deja este campo vacío si no hay costos de este tipo.

costsPerVehicleIndices[]

integer

Son los índices de los vehículos a los que se aplica costsPerVehicle. Si no está vacío, debe tener la misma cantidad de elementos que costsPerVehicle. No se puede especificar un índice de vehículo más de una vez. Si un vehículo se excluye de costsPerVehicleIndices, su costo es cero.

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

Especifica el tiempo máximo absoluto de desvío en comparación con la ruta más corta desde el retiro hasta la entrega. Si se especifica, debe ser no negativo, y el envío debe contener al menos un retiro y una entrega.

Por ejemplo, supongamos que t es el tiempo más corto que se tarda en ir de la alternativa de retiro seleccionada directamente a la alternativa de entrega seleccionada. Luego, establecer pickupToDeliveryAbsoluteDetourLimit aplica lo siguiente:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

Si se especifican límites relativos y absolutos en el mismo envío, se usa el límite más restrictivo para cada par de retiro y entrega posible. A partir de octubre de 2017, los desvíos solo se admiten cuando las duraciones de los viajes no dependen de los vehículos.

pickupToDeliveryTimeLimit

string (Duration format)

Especifica la duración máxima desde el inicio de la recolección hasta el inicio de la entrega de un envío. Si se especifica, debe ser no negativo, y el envío debe contener al menos un retiro y una entrega. Esto no depende de las alternativas que se seleccionen para la recolección y la entrega, ni de la velocidad del vehículo. Esto se puede especificar junto con las restricciones de desvío máximo: la solución respetará ambas especificaciones.

shipmentType

string

Es una cadena no vacía que especifica un "tipo" para este envío. Esta función se puede usar para definir incompatibilidades o requisitos entre shipment_types (consulta shipmentTypeIncompatibilities y shipmentTypeRequirements en ShipmentModel).

Se diferencia de visitTypes, que se especifica para una sola visita: todas las cargas y entregas que pertenecen al mismo envío comparten el mismo shipmentType.

label

string

Especifica una etiqueta para este envío. Esta etiqueta se informa en la respuesta en el shipmentLabel del ShipmentRoute.Visit correspondiente.

ignore

boolean

Si es verdadero, se omite este envío, pero no se aplica un penaltyCost.

Ignorar un envío genera un error de validación cuando hay algún shipmentTypeRequirements en el modelo.

Se permite ignorar un envío que se realiza en injectedFirstSolutionRoutes o injectedSolutionConstraint. El solucionador quita las visitas de retiro o entrega relacionadas de la ruta de ejecución. También se ignorarán los precedenceRules que hagan referencia a envíos ignorados.

penaltyCost

number

Si no se completa el envío, esta penalización se agrega al costo general de las rutas. Un envío se considera completado si se visita una de sus alternativas de retiro y entrega. El costo se puede expresar en la misma unidad que se usa para todos los demás campos relacionados con el costo en el modelo y debe ser positivo.

IMPORTANTE: Si no se especifica esta penalización, se considera infinita, es decir, se debe completar el envío.

pickupToDeliveryRelativeDetourLimit

number

Especifica el tiempo máximo de desvío relativo en comparación con la ruta más corta desde el retiro hasta la entrega. Si se especifica, debe ser no negativo, y el envío debe contener al menos un retiro y una entrega.

Por ejemplo, supongamos que t es el tiempo más corto que se tarda en ir de la alternativa de retiro seleccionada directamente a la alternativa de entrega seleccionada. Luego, establecer pickupToDeliveryRelativeDetourLimit aplica lo siguiente:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

Si se especifican límites relativos y absolutos en el mismo envío, se usa el límite más restrictivo para cada par de retiro y entrega posible. A partir de octubre de 2017, los desvíos solo se admiten cuando las duraciones de los viajes no dependen de los vehículos.

VisitRequest

Es una solicitud de visita que puede realizar un vehículo. Tiene una ubicación geográfica (o dos, consulta más abajo), horarios de apertura y cierre representados por ventanas de tiempo, y una duración del servicio (tiempo que pasa el vehículo una vez que llega para retirar o entregar mercancías).

Representación JSON
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string,
  "avoidUTurns": boolean
}
Campos
arrivalLocation

object (LatLng)

Es la ubicación geográfica a la que llega el vehículo cuando realiza esta VisitRequest. Si el modelo de envío tiene matrices de distancia de duración, no se debe especificar arrivalLocation.

arrivalWaypoint

object (Waypoint)

Es el punto de referencia al que llega el vehículo cuando realiza este VisitRequest. Si el modelo de envío tiene matrices de distancia de duración, no se debe especificar arrivalWaypoint.

departureLocation

object (LatLng)

Es la ubicación geográfica desde la que sale el vehículo después de completar este VisitRequest. Se puede omitir si es igual a arrivalLocation. Si el modelo de envío tiene matrices de distancia de duración, no se debe especificar departureLocation.

departureWaypoint

object (Waypoint)

Es el punto de referencia desde el que sale el vehículo después de completar este VisitRequest. Se puede omitir si es igual a arrivalWaypoint. Si el modelo de envío tiene matrices de distancia de duración, no se debe especificar departureWaypoint.

tags[]

string

Especifica las etiquetas adjuntas a la solicitud de visita. No se permiten cadenas vacías ni duplicadas.

timeWindows[]

object (TimeWindow)

Son los períodos que limitan la hora de llegada a una visita. Ten en cuenta que un vehículo puede salir fuera de la ventana de tiempo de llegada, es decir, la hora de llegada y la duración no necesitan estar dentro de una ventana de tiempo. Esto puede generar un tiempo de espera si el vehículo llega antes de TimeWindow.start_time.

La ausencia de TimeWindow significa que el vehículo puede realizar esta visita en cualquier momento.

Las ventanas de tiempo deben ser disjuntas, es decir, ninguna ventana de tiempo debe superponerse con otra ni ser adyacente a ella, y deben estar en orden ascendente.

costPerHourAfterSoftEndTime y softEndTime solo se pueden establecer si hay un único período.

duration

string (Duration format)

Es la duración de la visita, es decir, el tiempo que pasa el vehículo entre la llegada y la salida (se agregará al posible tiempo de espera; consulta timeWindows).

cost

number

Es el costo de entregar esta solicitud de visita en una ruta de vehículo. Esto se puede usar para pagar costos diferentes por cada retiro o entrega alternativos de un envío. Este costo debe estar en la misma unidad que Shipment.penalty_cost y no debe ser negativo.

loadDemands

map (key: string, value: object (Load))

Son las demandas de carga de esta solicitud de visita. Es igual que el campo Shipment.load_demands, pero solo se aplica a este VisitRequest en lugar de a todo el Shipment. Las demandas que se indican aquí se agregan a las que se indican en Shipment.load_demands.

visitTypes[]

string

Especifica los tipos de visita. Esto se puede usar para asignar el tiempo adicional que necesita un vehículo para completar esta visita (consulta Vehicle.extra_visit_duration_for_visit_type).

Un tipo solo puede aparecer una vez.

label

string

Especifica una etiqueta para este VisitRequest. Esta etiqueta se informa en la respuesta como visitLabel en el ShipmentRoute.Visit correspondiente.

avoidUTurns

boolean

Especifica si se deben evitar los giros en U en las rutas de conducción en esta ubicación. La evitación de giros en U se realiza de la mejor manera posible, y no se garantiza que se eviten por completo. Esta es una función experimental y su comportamiento está sujeto a cambios.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request para obtener más detalles.

LatLng

Es un objeto que representa un par de valores de latitud y longitud. Esto se expresa como un par de dobles para representar la latitud en grados y la longitud en grados. A menos que se especifique lo contrario, este objeto debe cumplir con el estándar WGS84. Los valores deben pertenecer a rangos normalizados.

Representación JSON
{
  "latitude": number,
  "longitude": number
}
Campos
latitude

number

La latitud expresada en grados. Debe pertenecer al rango [-90.0, +90.0].

longitude

number

La longitud expresada en grados. Debe pertenecer al rango [-180.0, +180.0].

Punto de referencia

Encapsula un punto de referencia. Los puntos de referencia marcan las ubicaciones de llegada y salida de las VisitRequests, y las ubicaciones de inicio y finalización de los Vehicles.

Representación JSON
{
  "sideOfRoad": boolean,
  "vehicleStopover": boolean,

  // The following is a list of mutually exclusive fields. At most one of the
  // fields will be set in a response:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of mutually exclusive fields.
}
Campos
sideOfRoad

boolean

Opcional. Indica que la ubicación de este punto de referencia tiene como objetivo que el vehículo se detenga en un lado específico de la ruta. Cuando estableces este valor, la ruta pasa por la ubicación para que el vehículo pueda detenerse en el lado de la ruta hacia el que se sesga la ubicación desde el centro de la ruta. Esta opción no funciona para el modo de viaje "WALKING".

vehicleStopover

boolean

Indica que el punto de referencia está destinado a que los vehículos se detengan, con la intención de recoger o dejar pasajeros. Esta opción solo funciona para el modo de viaje "DRIVING" y cuando el "locationType" es "location".

Experimental: El comportamiento o la existencia de este campo pueden cambiar en el futuro.

Diferentes formas de representar una ubicación La siguiente es una lista de campos mutuamente excluyentes. Como máximo, se establecerá uno de los campos en una respuesta:
location

object (Location)

Es un punto especificado con coordenadas geográficas, incluido un rumbo opcional.

placeId

string

Es el ID de lugar del PDI asociado con el punto de referencia.

Cuando uses un ID de lugar para especificar la ubicación de llegada o salida de una VisitRequest, usa un ID de lugar que sea lo suficientemente específico como para determinar una ubicación de LatLng para navegar al lugar. Por ejemplo, un ID de lugar que representa un edificio es adecuado, pero no se recomienda usar un ID de lugar que representa una ruta.

Fin de los campos mutuamente excluyentes.

Ubicación

Encapsula una ubicación (un punto geográfico y un rumbo opcional).

Representación JSON
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
Campos
latLng

object (LatLng)

Son las coordenadas geográficas del punto de referencia.

heading

integer

Es el rumbo de la brújula asociado con la dirección del flujo de tráfico. Este valor se usa para especificar el lado de la ruta que se debe usar para el retiro y la llegada. Los valores de rumbo pueden ser de 0 a 360, donde 0 especifica un rumbo hacia el norte, 90 especifica un rumbo hacia el este, etc.

TimeWindow

Las ventanas de tiempo restringen la hora de un evento, como la hora de llegada a una visita o la hora de inicio y finalización de un vehículo.

Los límites estrictos del período, startTime y endTime, aplican la hora más temprana y más tardía del evento, de modo que startTime <= event_time <= endTime. El límite inferior de la ventana de tiempo flexible, softStartTime, expresa una preferencia para que el evento ocurra en softStartTime o después de ese momento, lo que genera un costo proporcional al tiempo que transcurre antes de softStartTime. El límite superior de la ventana de tiempo flexible, softEndTime, expresa una preferencia para que el evento ocurra en softEndTime o antes de esa hora, lo que genera un costo proporcional al tiempo que transcurre después de softEndTime. startTime, endTime, softStartTime y softEndTime deben estar dentro de los límites de tiempo globales (consulta ShipmentModel.global_start_time y ShipmentModel.global_end_time) y deben respetar lo siguiente:

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
Representación JSON
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
Campos
startTime

string (Timestamp format)

Es la hora de inicio del período estricto. Si no se especifica, se establecerá en ShipmentModel.global_start_time.

Usa el formato RFC 3339, en el que el resultado generado siempre usará la normalización Z y los dígitos fraccionarios 0, 3, 6 o 9. 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".

endTime

string (Timestamp format)

Es la hora de finalización del período estricto. Si no se especifica, se establecerá en ShipmentModel.global_end_time.

Usa el formato RFC 3339, en el que el resultado generado siempre usará la normalización Z y los dígitos fraccionarios 0, 3, 6 o 9. 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".

softStartTime

string (Timestamp format)

Es la hora de inicio flexible del período.

Usa el formato RFC 3339, en el que el resultado generado siempre usará la normalización Z y los dígitos fraccionarios 0, 3, 6 o 9. 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".

softEndTime

string (Timestamp format)

Es la hora de finalización flexible del período.

Usa el formato RFC 3339, en el que el resultado generado siempre usará la normalización Z y los dígitos fraccionarios 0, 3, 6 o 9. 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".

costPerHourBeforeSoftStartTime

number

Es un costo por hora que se agrega a otros costos del modelo si el evento ocurre antes de softStartTime, que se calcula de la siguiente manera:

   max(0, softStartTime - t.seconds)
                          * costPerHourBeforeSoftStartTime / 3600,
t being the time of the event.

Este costo debe ser positivo, y el campo solo se puede establecer si se estableció softStartTime.

costPerHourAfterSoftEndTime

number

Es un costo por hora que se agrega a otros costos del modelo si el evento ocurre después de softEndTime, que se calcula de la siguiente manera:

   max(0, t.seconds - softEndTime.seconds)
                    * costPerHourAfterSoftEndTime / 3600,
t being the time of the event.

Este costo debe ser positivo, y el campo solo se puede establecer si se estableció softEndTime.

Vehículo

Modela un vehículo en un problema de envío. Resolver un problema de envío creará una ruta que comenzará en startLocation y terminará en endLocation para este vehículo. Una ruta es una secuencia de visitas (consulta ShipmentRoute).

Representación JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
Campos
displayName

string

Es el nombre visible del vehículo definido por el usuario. Puede tener hasta 63 caracteres y puede usar caracteres UTF-8.

travelMode

enum (TravelMode)

Es el medio de transporte, que afecta las rutas que puede usar el vehículo y su velocidad. Consulta también travelDurationMultiple.

routeModifiers

object (RouteModifiers)

Es un conjunto de condiciones que se deben cumplir y que afectan la forma en que se calculan las rutas para el vehículo determinado.

startLocation

object (LatLng)

Es la ubicación geográfica en la que comienza el vehículo antes de recoger cualquier envío. Si no se especifica, el vehículo comienza en su primera recogida. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar startLocation.

startWaypoint

object (Waypoint)

Es el punto de referencia que representa una ubicación geográfica en la que el vehículo comienza antes de retirar cualquier envío. Si no se especifica startWaypoint ni startLocation, el vehículo comienza en su primera recogida. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar startWaypoint.

endLocation

object (LatLng)

Es la ubicación geográfica donde termina el vehículo después de completar su último VisitRequest. Si no se especifica, el ShipmentRoute del vehículo finaliza de inmediato cuando completa su último VisitRequest. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar endLocation.

endWaypoint

object (Waypoint)

Es el punto de referencia que representa una ubicación geográfica en la que termina el vehículo después de completar su último VisitRequest. Si no se especifican endWaypoint ni endLocation, el ShipmentRoute del vehículo finaliza de inmediato cuando completa su último VisitRequest. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar endWaypoint.

startTags[]

string

Especifica las etiquetas adjuntas al inicio de la ruta del vehículo.

No se permiten cadenas vacías ni duplicadas.

endTags[]

string

Especifica las etiquetas adjuntas al final de la ruta del vehículo.

No se permiten cadenas vacías ni duplicadas.

startTimeWindows[]

object (TimeWindow)

Son los períodos durante los cuales el vehículo puede salir de su ubicación de partida. Deben estar dentro de los límites de tiempo globales (consulta los campos ShipmentModel.global_*). Si no se especifica, no hay más limitaciones que esos límites de tiempo globales.

Las ventanas de tiempo que pertenecen al mismo campo repetido deben ser disjuntas, es decir, ninguna ventana de tiempo puede superponerse con otra ni ser adyacente a otra, y deben estar en orden cronológico.

costPerHourAfterSoftEndTime y softEndTime solo se pueden establecer si hay un único período.

endTimeWindows[]

object (TimeWindow)

Son los períodos durante los cuales el vehículo puede llegar a su ubicación final. Deben estar dentro de los límites de tiempo globales (consulta los campos ShipmentModel.global_*). Si no se especifica, no hay más limitaciones que esos límites de tiempo globales.

Las ventanas de tiempo que pertenecen al mismo campo repetido deben ser disjuntas, es decir, ninguna ventana de tiempo puede superponerse con otra ni ser adyacente a otra, y deben estar en orden cronológico.

costPerHourAfterSoftEndTime y softEndTime solo se pueden establecer si hay un único período.

unloadingPolicy

enum (UnloadingPolicy)

Es la política de descarga que se aplica al vehículo.

loadLimits

map (key: string, value: object (LoadLimit))

Capacidades del vehículo (peso, volumen, cantidad de palés, por ejemplo). Las claves del mapa son los identificadores del tipo de carga, que coinciden con las claves del campo Shipment.load_demands. Si una clave determinada no está presente en este mapa, se considera que la capacidad correspondiente no tiene límites.

costPerHour

number

Costos del vehículo: Todos los costos se suman y deben estar en la misma unidad que Shipment.penalty_cost.

Es el costo por hora de la ruta del vehículo. Este costo se aplica al tiempo total que toma la ruta y, además, incluye la duración del viaje, el tiempo de espera y el tiempo de visita. Usar costPerHour en lugar de solo costPerTraveledHour puede generar latencia adicional.

costPerTraveledHour

number

Es el costo por hora recorrida de la ruta del vehículo. Este costo se aplica solo a la duración del viaje que se realiza por la ruta (es decir, la que se informa en ShipmentRoute.transitions) y excluye el tiempo de espera y el tiempo de visita.

costPerKilometer

number

Es el costo por kilómetro de la ruta del vehículo. Este costo se aplica a la distancia informada en el ShipmentRoute.transitions y no se aplica a ninguna distancia recorrida de forma implícita desde el arrivalLocation hasta el departureLocation de un solo VisitRequest.

fixedCost

number

Es el costo fijo que se aplica si este vehículo se usa para administrar un envío.

usedIfRouteIsEmpty

boolean

Este campo solo se aplica a los vehículos cuando su ruta no entrega ningún envío. Indica si el vehículo debe considerarse como usado o no en este caso.

Si es verdadero, el vehículo va desde su ubicación de inicio hasta la de finalización, incluso si no entrega ningún envío, y se tienen en cuenta los costos de tiempo y distancia que resultan de su viaje de inicio a fin.

De lo contrario, no se desplaza desde su ubicación de inicio hasta la de finalización, y no se programan breakRule ni retrasos (desde TransitionAttributes) para este vehículo. En este caso, el ShipmentRoute del vehículo no contiene información, excepto el índice y la etiqueta del vehículo.

routeDurationLimit

object (DurationLimit)

Es el límite que se aplica a la duración total de la ruta del vehículo. En un OptimizeToursResponse determinado, la duración de la ruta de un vehículo es la diferencia entre su vehicleEndTime y su vehicleStartTime.

travelDurationLimit

object (DurationLimit)

Es el límite que se aplica a la duración del viaje de la ruta del vehículo. En un OptimizeToursResponse determinado, la duración del viaje de la ruta es la suma de todos sus transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

Es el límite que se aplica a la distancia total de la ruta del vehículo. En un OptimizeToursResponse determinado, la distancia de la ruta es la suma de todos sus transitions.travel_distance_meters.

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

Especifica una asignación de cadenas de visitTypes a duraciones. La duración es el tiempo adicional a VisitRequest.duration que se debe dedicar a las visitas con el visitTypes especificado. Esta duración adicional de la visita agrega un costo si se especifica costPerHour. Las claves (es decir, visitTypes) no pueden ser cadenas vacías.

Si una solicitud de visita tiene varios tipos, se agregará una duración para cada tipo en el mapa.

breakRule

object (BreakRule)

Describe el programa de descansos que se aplicará a este vehículo. Si está vacío, no se programarán descansos para este vehículo.

label

string

Especifica una etiqueta para este vehículo. Esta etiqueta se informa en la respuesta como el vehicleLabel del ShipmentRoute correspondiente.

ignore

boolean

Si es verdadero, usedIfRouteIsEmpty debe ser falso y este vehículo no se usará.

Si un envío lo realiza un vehículo ignorado en injectedFirstSolutionRoutes, se omite en la primera solución, pero se puede realizar en la respuesta.

Si un vehículo ignorado en injectedSolutionConstraint realiza un envío y cualquier retiro o entrega relacionados se restringen para permanecer en el vehículo (es decir, no se relajan al nivel RELAX_ALL_AFTER_THRESHOLD), se omiten en la respuesta. Si un envío tiene un campo allowedVehicleIndices que no está vacío y se ignoran todos los vehículos permitidos, se omite en la respuesta.

travelDurationMultiple

number

Especifica un factor multiplicativo que se puede usar para aumentar o disminuir la duración del viaje de este vehículo. Por ejemplo, si se establece en 2.0, significa que este vehículo es más lento y tiene duraciones de viaje que son el doble de las de los vehículos estándar. Este múltiplo no afecta la duración de las visitas. Sí afecta el costo si se especifican costPerHour o costPerTraveledHour. Debe estar en el rango [0.001, 1000.0]. Si no se establece, el vehículo es estándar y este múltiplo se considera 1.0.

ADVERTENCIA: Las duraciones del viaje se redondearán al segundo más cercano después de que se aplique este múltiplo, pero antes de realizar cualquier operación numérica. Por lo tanto, un múltiplo pequeño puede provocar una pérdida de precisión.

Consulta también extraVisitDurationForVisitType a continuación.

TravelMode

Son los modos de viaje que pueden usar los vehículos.

Estos deben ser un subconjunto de los modos de viaje de la API de Routes de Google Maps Platform. Consulta https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode.

Nota: Las rutas de WALKING están en versión beta y, a veces, es posible que no incluyan veredas o rutas peatonales claras. Debes mostrar esta advertencia al usuario en todas las rutas a pie que muestres en tu app.

Enums
TRAVEL_MODE_UNSPECIFIED Es el medio de transporte no especificado, equivalente a DRIVING.
DRIVING Es el modo de viaje correspondiente a las instrucciones sobre cómo llegar (en automóvil, etcétera).
WALKING Es el medio de transporte correspondiente a las instrucciones sobre cómo llegar a pie.
TWO_WHEELER Vehículo motorizado de dos ruedas. Por ejemplo, motocicleta. Ten en cuenta que esto difiere del modo de viaje EN BICICLETA, que abarca el modo de propulsión humana. Este medio de transporte solo se admite en los países que se indican en Países y regiones que admiten vehículos de dos ruedas.

RouteModifiers

Encapsula un conjunto de condiciones opcionales que se deben cumplir cuando se calculan las rutas de los vehículos. Esto es similar a RouteModifiers en la API de Routes Preferred de Google Maps Platform; consulta: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

Representación JSON
{
  "avoidTolls": boolean,
  "avoidHighways": boolean,
  "avoidFerries": boolean,
  "avoidIndoor": boolean
}
Campos
avoidTolls

boolean

Especifica si se deben evitar las rutas con peaje cuando sea razonable. Se dará preferencia a las rutas que no contengan rutas con peaje. Solo se aplica a los medios de transporte motorizados.

avoidHighways

boolean

Especifica si se deben evitar las autopistas cuando sea razonable. Se dará preferencia a las rutas que no contengan autopistas. Solo se aplica a los medios de transporte motorizados.

avoidFerries

boolean

Especifica si se deben evitar los ferris cuando sea razonable. Se dará preferencia a las rutas que no incluyan viajes en transbordador. Solo se aplica a los medios de transporte motorizados.

avoidIndoor

boolean

Opcional. Especifica si se debe evitar la navegación en interiores cuando sea razonable. Se dará preferencia a las rutas que no contengan navegación en interiores. Solo se aplica al modo de viaje WALKING.

UnloadingPolicy

Es la política sobre cómo se puede descargar un vehículo. Se aplica solo a los envíos que tienen un retiro y una entrega.

Otros envíos pueden realizarse en cualquier lugar de la ruta, independientemente de unloadingPolicy.

Enums
UNLOADING_POLICY_UNSPECIFIED Política de descarga sin especificar; las entregas solo deben realizarse después de sus retiros correspondientes.
LAST_IN_FIRST_OUT Las entregas deben realizarse en el orden inverso al de las retiradas
FIRST_IN_FIRST_OUT Las entregas deben realizarse en el mismo orden que las recogidas

LoadLimit

Define un límite de carga que se aplica a un vehículo, p.ej., "este camión solo puede transportar hasta 3,500 kg". Consulta los loadLimits.

Representación JSON
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string,
  "costPerKilometer": {
    object (LoadCost)
  },
  "costPerTraveledHour": {
    object (LoadCost)
  }
}
Campos
softMaxLoad

string (int64 format)

Es un límite flexible de la carga. Consulta los costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

Si la carga supera softMaxLoad en la ruta de este vehículo, se aplica la siguiente penalización de costo (solo una vez por vehículo): (carga - softMaxLoad) * costPerUnitAboveSoftMax. Todos los costos se suman y deben estar en la misma unidad que Shipment.penalty_cost. Los límites flexibles solo se pueden definir en los tipos que se aplican únicamente a las recolecciones o a las entregas en todo el modelo.

startLoadInterval

object (Interval)

Es el intervalo de carga aceptable del vehículo al comienzo de la ruta.

endLoadInterval

object (Interval)

Es el intervalo de carga aceptable del vehículo al final de la ruta.

maxLoad

string (int64 format)

Es la cantidad máxima aceptable de carga.

costPerKilometer

object (LoadCost)

Es el costo de mover una unidad de carga a lo largo de un kilómetro para este vehículo. Esto se puede usar como un proxy para el consumo de combustible: si la carga es un peso (en Newtons), entonces carga*kilómetro tiene la dimensión de una energía.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request para obtener más detalles.

costPerTraveledHour

object (LoadCost)

Es el costo de viajar con una unidad de carga durante una hora para este vehículo.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request para obtener más detalles.

Intervalo

Intervalo de cantidades de carga aceptables.

Representación JSON
{
  "min": string,
  "max": string
}
Campos
min

string (int64 format)

Una carga mínima aceptable. Debe ser ≥ 0. Si se especifican ambos, min debe ser ≤ max.

max

string (int64 format)

Una carga máxima aceptable Debe ser ≥ 0. Si no se especifica, este mensaje no restringe la carga máxima. Si se especifican ambos, min debe ser ≤ max.

LoadCost

Es el costo de mover una unidad de carga durante un Transition. Para una carga determinada, el costo es la suma de dos partes:

  • min(load, loadThreshold) * costPerUnitBelowThreshold
  • max(0, load - loadThreshold) * costPerUnitAboveThreshold

Con este costo, las soluciones prefieren entregar primero las demandas altas o, de manera equivalente, retirar las demandas altas al final. Por ejemplo, si un vehículo tiene

load_limit {
  key: "weight"
  value {
    costPerKilometer {
      loadThreshold: 15
      costPerUnitBelowThreshold: 2.0
      costPerUnitAboveThreshold: 10.0
    }
  }
}

y su ruta es inicio,retiro,retiro,entrega,entrega,fin con transiciones:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

entonces el costo en el que incurre este LoadCost es (cost_below * load_below * kilómetros + cost_above * load_above * kms)

  • transición 0: 0.0
  • transición 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transición 2: 2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
  • transición 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transición 4: 0.0

Por lo tanto, el LoadCost de la ruta es 120.0.

Sin embargo, si la ruta es inicio,retiro,entrega,retiro,entrega,finalización con transiciones:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

entonces el costo en el que incurre este LoadCost es

  • transición 0: 0.0
  • transición 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transición 2: 0.0
  • transición 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transición 4: 0.0

Aquí, el LoadCost sobre la ruta es 40.0.

LoadCost hace que las soluciones con transiciones de carga pesada sean más costosas.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request para obtener más detalles.

Representación JSON
{
  "loadThreshold": string,
  "costPerUnitBelowThreshold": number,
  "costPerUnitAboveThreshold": number
}
Campos
loadThreshold

string (int64 format)

Es la cantidad de carga por encima de la cual el costo de mover una unidad de carga cambia de costPerUnitBelowThreshold a costPerUnitAboveThreshold. Debe ser >= 0.

costPerUnitBelowThreshold

number

Es el costo de mover una unidad de carga, para cada unidad entre 0 y el umbral. Debe ser un valor finito y >= 0.

costPerUnitAboveThreshold

number

Es el costo de mover una unidad de carga por cada unidad que supere el umbral. En el caso especial de que el umbral sea igual a 0, se trata de un costo fijo por unidad. Debe ser un valor finito y >= 0.

DurationLimit

Es un límite que define la duración máxima de la ruta de un vehículo. Puede ser de hardware o de software.

Cuando se define un campo de límite flexible, se deben definir juntos el umbral máximo flexible y su costo asociado.

Representación JSON
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
Campos
maxDuration

string (Duration format)

Es un límite estricto que restringe la duración para que sea, como máximo, maxDuration.

softMaxDuration

string (Duration format)

Es un límite flexible que no aplica un límite de duración máxima, pero, cuando se incumple, hace que la ruta genere un costo. Este costo se suma a otros costos definidos en el modelo, con la misma unidad.

Si se define, softMaxDuration no debe ser negativo. Si también se define maxDuration, softMaxDuration debe ser menor que maxDuration.

quadraticSoftMaxDuration

string (Duration format)

Es un límite flexible que no aplica un límite de duración máximo, pero, cuando se incumple, hace que la ruta incurra en un costo cuadrático en la duración. Este costo se suma a otros costos definidos en el modelo, con la misma unidad.

Si se establece quadraticSoftMaxDuration, se deben cumplir las siguientes condiciones:

  • No debe ser un valor negativo.
  • Se debe definir maxDuration.
  • quadraticSoftMaxDuration debe ser inferior a maxDuration.
  • La diferencia no debe ser superior a un día: maxDuration - quadraticSoftMaxDuration <= 86400 seconds
costPerHourAfterSoftMax

number

Es el costo por hora en el que se incurre si se incumple el umbral de softMaxDuration. El costo adicional es 0 si la duración es inferior al umbral; de lo contrario, el costo depende de la duración de la siguiente manera:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

El costo no debe ser negativo.

costPerSquareHourAfterQuadraticSoftMax

number

Es el costo por hora cuadrada en el que se incurre si se infringe el umbral de quadraticSoftMaxDuration.

El costo adicional es 0 si la duración es inferior al umbral; de lo contrario, el costo depende de la duración de la siguiente manera:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

El costo no debe ser negativo.

DistanceLimit

Es un límite que define la distancia máxima que se puede recorrer. Puede ser de hardware o de software.

Si se define un límite flexible, se deben definir softMaxMeters y costPerKilometerAboveSoftMax, y no deben ser negativos.

Representación JSON
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
Campos
maxMeters

string (int64 format)

Es un límite estricto que restringe la distancia para que sea, como máximo, maxMeters. El límite no debe ser negativo.

softMaxMeters

string (int64 format)

Es un límite flexible que no aplica un límite de distancia máxima, pero, cuando se incumple, genera un costo que se suma a otros costos definidos en el modelo, con la misma unidad.

Si se define, softMaxMeters debe ser menor que maxMeters y no debe ser negativo.

costPerKilometerBelowSoftMax

number

Costo por kilómetro incurrido, que aumenta hasta softMaxMeters, con la siguiente fórmula:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Este costo no se admite en routeDistanceLimit.

costPerKilometerAboveSoftMax

number

Es el costo por kilómetro en el que se incurre si la distancia supera el límite de softMaxMeters. El costo adicional es 0 si la distancia es inferior al límite; de lo contrario, la fórmula que se usa para calcular el costo es la siguiente:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

El costo no debe ser negativo.

BreakRule

Son reglas para generar pausas de tiempo para un vehículo (p.ej., pausas para el almuerzo). Una pausa es un período continuo durante el cual el vehículo permanece inactivo en su posición actual y no puede realizar ninguna visita. Puede ocurrir una pausa en los siguientes casos:

  • Durante el viaje entre dos visitas (lo que incluye el tiempo justo antes o después de una visita, pero no en medio de una visita), en cuyo caso extiende el tiempo en tránsito correspondiente entre las visitas
  • o antes de que el vehículo comience a funcionar (es posible que el vehículo no comience a funcionar en medio de una pausa), en cuyo caso no afecta la hora de inicio del vehículo.
  • o después de la finalización del vehículo (lo mismo, con la hora de finalización del vehículo).
Representación JSON
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Campos
breakRequests[]

object (BreakRequest)

Es la secuencia de pausas. Consulta el mensaje BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

Es posible que se apliquen varios FrequencyConstraint. Todas deben cumplirse con los BreakRequest de este BreakRule. Consulta FrequencyConstraint.

BreakRequest

La secuencia de descansos (es decir, su cantidad y orden) que se aplican a cada vehículo se debe conocer de antemano. Los BreakRequest repetidos definen esa secuencia, en el orden en que deben ocurrir. Sus ventanas de tiempo (earliestStartTime/latestStartTime) pueden superponerse, pero deben ser compatibles con el pedido (esto se verifica).

Representación JSON
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
Campos
earliestStartTime

string (Timestamp format)

Obligatorio. Límite inferior (inclusive) del inicio del descanso.

Usa el formato RFC 3339, en el que el resultado generado siempre usará la normalización Z y los dígitos fraccionarios 0, 3, 6 o 9. 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".

latestStartTime

string (Timestamp format)

Obligatorio. Es el límite superior (inclusive) del inicio de la pausa.

Usa el formato RFC 3339, en el que el resultado generado siempre usará la normalización Z y los dígitos fraccionarios 0, 3, 6 o 9. 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".

minDuration

string (Duration format)

Obligatorio. Es la duración mínima de la pausa. Debe ser positivo.

FrequencyConstraint

Se puede restringir aún más la frecuencia y la duración de las pausas especificadas anteriormente, aplicando una frecuencia mínima de pausas, como "Debe haber una pausa de al menos 1 hora cada 12 horas". Suponiendo que esto se puede interpretar como "Dentro de cualquier período móvil de 12 h, debe haber al menos un descanso de al menos una hora", ese ejemplo se traduciría en el siguiente FrequencyConstraint:

{
   minBreakDuration { seconds: 3600 }         # 1 hour.
   maxInterBreakDuration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

El momento y la duración de las pausas en la solución respetarán todas esas restricciones, además de los períodos y las duraciones mínimas ya especificados en el BreakRequest.

En la práctica, un FrequencyConstraint puede aplicarse a pausas no consecutivas. Por ejemplo, el siguiente programa respeta el ejemplo de "1 h cada 12 h":

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Representación JSON
{
  "minBreakDuration": string,
  "maxInterBreakDuration": string
}
Campos
minBreakDuration

string (Duration format)

Obligatorio. Es la duración mínima de la pausa para esta restricción. No negativo. Consulta la descripción de FrequencyConstraint.

maxInterBreakDuration

string (Duration format)

Obligatorio. Es el intervalo máximo permitido de cualquier intervalo de tiempo en la ruta que no incluya, al menos parcialmente, un descanso de duration >= minBreakDuration. Debe ser positivo.

Objetivo

Los objetivos reemplazan por completo el modelo de costos y, por lo tanto, no son compatibles con los costos preexistentes. Cada objetivo se asigna a una cantidad de costos predefinidos para, por ejemplo, vehículos, envíos o atributos de transición.

Experimental: Consulta https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request para obtener más detalles.

Representación JSON
{
  "type": enum (Type),
  "weight": number
}
Campos
type

enum (Type)

Es el tipo de objetivo.

weight

number

Cuánto debe contar este objetivo en relación con los demás. Puede ser cualquier número no negativo, y los pesos no tienen que sumar 1. Los pesos se establecen de forma predeterminada en 1.0.

Tipo

Es el tipo de objetivo que se asignará a un conjunto de costos.

Enums
DEFAULT Se usará un conjunto predeterminado de costos para garantizar una solución razonable. Nota: Este objetivo se puede usar por sí solo, pero también se agregará siempre con un peso de 1.0, como referencia, a los objetivos especificados por el usuario, si aún no está presente.
MIN_DISTANCE Objetivos "MIN". Minimizar la distancia total recorrida
MIN_WORKING_TIME Minimizar el tiempo de trabajo total, sumado para todos los vehículos
MIN_TRAVEL_TIME Igual que lo anterior, pero enfocándose solo en la duración del viaje.
MIN_NUM_VEHICLES Minimizar la cantidad de vehículos utilizados

DurationDistanceMatrix

Especifica una matriz de duración y distancia desde las ubicaciones de inicio de las visitas y los vehículos hasta las ubicaciones de finalización de las visitas y los vehículos.

Representación JSON
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
Campos
rows[]

object (Row)

Especifica las filas de la matriz de duración y distancia. Debe tener tantos elementos como ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

Es la etiqueta que define a qué vehículos se aplica esta matriz de duración y distancia. Si está vacío, se aplica a todos los vehículos y solo puede haber una matriz.

Cada inicio de vehículo debe coincidir con exactamente una matriz, es decir, exactamente uno de sus campos startTags debe coincidir con el vehicleStartTag de una matriz (y solo de esa matriz).

Todas las matrices deben tener un vehicleStartTag diferente.

Fila

Especifica una fila de la matriz de duración y distancia.

Representación JSON
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
Campos
durations[]

string (Duration format)

Son los valores de duración de una fila determinada. Debe tener tantos elementos como ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

number

Son los valores de distancia para una fila determinada. Si ningún costo o restricción hace referencia a distancias en el modelo, este campo se puede dejar vacío; de lo contrario, debe tener tantos elementos como durations.

TransitionAttributes

Especifica los atributos de las transiciones entre dos visitas consecutivas en una ruta. Se pueden aplicar varios TransitionAttributes a la misma transición: en ese caso, se suman todos los costos adicionales y se aplica la restricción o el límite más estricto (siguiendo la semántica natural "Y").

Representación JSON
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
Campos
srcTag

string

Son etiquetas que definen el conjunto de transiciones (src->dst) a las que se aplican estos atributos.

Una visita de origen o un inicio de vehículo coinciden si su VisitRequest.tags o Vehicle.start_tags contiene srcTag o no contiene excludedSrcTag (según cuál de estos dos campos no esté vacío).

excludedSrcTag

string

Consulta los srcTag. Exactamente uno de los valores srcTag y excludedSrcTag no debe estar vacío.

dstTag

string

Una visita de destino o un final de vehículo coinciden si su VisitRequest.tags o Vehicle.end_tags contiene dstTag o no contiene excludedDstTag (según cuál de estos dos campos no esté vacío).

excludedDstTag

string

Consulta los dstTag. Exactamente uno de los valores dstTag y excludedDstTag no debe estar vacío.

cost

number

Especifica un costo para realizar esta transición. Este valor se expresa en la misma unidad que todos los demás costos del modelo y no debe ser negativo. Se aplica además de todos los demás costos existentes.

costPerKilometer

number

Especifica un costo por kilómetro que se aplica a la distancia recorrida mientras se realiza esta transición. Se suma a cualquier Vehicle.cost_per_kilometer especificado en los vehículos.

distanceLimit

object (DistanceLimit)

Especifica un límite para la distancia recorrida mientras se realiza esta transición.

A partir de junio de 2021, solo se admiten los límites flexibles.

delay

string (Duration format)

Especifica una demora que se produce cuando se realiza esta transición.

Esta demora siempre se produce después de que finaliza la visita de origen y antes de que comience la visita de destino.

ShipmentTypeIncompatibility

Especifica las incompatibilidades entre los envíos según su shipmentType. La aparición de envíos incompatibles en la misma ruta se restringe según el modo de incompatibilidad.

Representación JSON
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
Campos
types[]

string

Lista de tipos incompatibles. Dos envíos que tienen diferentes shipment_types entre los que se indican son "incompatibles".

incompatibilityMode

enum (IncompatibilityMode)

Es el modo que se aplica a la incompatibilidad.

IncompatibilityMode

Son los modos que definen cómo se restringe la aparición de envíos incompatibles en la misma ruta.

Enums
INCOMPATIBILITY_MODE_UNSPECIFIED Modo de incompatibilidad sin especificar. Este valor nunca debe usarse.
NOT_PERFORMED_BY_SAME_VEHICLE En este modo, dos envíos con tipos incompatibles nunca pueden compartir el mismo vehículo.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

En este modo, dos envíos con tipos incompatibles nunca pueden estar en el mismo vehículo al mismo tiempo:

  • Pueden compartir el mismo vehículo solo si uno se entrega antes de que se recoja el otro.
  • Cuando ambos envíos son solo de retiro (sin entregas) o solo de entrega (sin retiros), no pueden compartir el mismo vehículo.

ShipmentTypeRequirement

Especifica los requisitos entre los envíos según su shipmentType. Los detalles del requisito se definen según el modo de requisito.

Representación JSON
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
Campos
requiredShipmentTypeAlternatives[]

string

Es la lista de tipos de envío alternativos que requiere el dependentShipmentTypes.

dependentShipmentTypes[]

string

Todos los envíos con un tipo en el campo dependentShipmentTypes requieren que se visite al menos un envío del tipo requiredShipmentTypeAlternatives en la misma ruta.

NOTA: No se permiten las cadenas de requisitos en las que un shipmentType dependa de sí mismo.

requirementMode

enum (RequirementMode)

Es el modo que se aplica al requisito.

RequirementMode

Son los modos que definen la apariencia de los envíos dependientes en una ruta.

Enums
REQUIREMENT_MODE_UNSPECIFIED Modo de requisito no especificado. Este valor nunca debe usarse.
PERFORMED_BY_SAME_VEHICLE En este modo, todos los envíos "dependientes" deben compartir el mismo vehículo que, al menos, uno de sus envíos "obligatorios".
IN_SAME_VEHICLE_AT_PICKUP_TIME

Con el modo IN_SAME_VEHICLE_AT_PICKUP_TIME, todos los envíos "dependientes" deben tener al menos un envío "obligatorio" en su vehículo en el momento de la recolección.

Por lo tanto, una recolección de envío "dependiente" debe tener una de las siguientes opciones:

  • Un envío "obligatorio" solo de entrega que se entrega en la ruta después
  • Un envío "obligatorio" se recoge en la ruta antes de él y, si el envío "obligatorio" tiene una entrega, esta se debe realizar después de la recogida del envío "dependiente".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Igual que antes, excepto que los envíos "dependientes" deben tener un envío "obligatorio" en su vehículo en el momento de la entrega.

PrecedenceRule

Una regla de precedencia entre dos eventos (cada evento es la recolección o la entrega de un envío): el "segundo" evento debe comenzar al menos offsetDuration después de que haya comenzado el "primero".

Varias precedencias pueden hacer referencia a los mismos eventos (o relacionados), p.ej., "la recolección de B ocurre después de la entrega de A" y "la recolección de C ocurre después de la recolección de B".

Además, las precedencias solo se aplican cuando se realizan ambos envíos y, de lo contrario, se ignoran.

Representación JSON
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
Campos
firstIsDelivery

boolean

Indica si el "primer" evento es una entrega.

secondIsDelivery

boolean

Indica si el "segundo" evento es una entrega.

offsetDuration

string (Duration format)

Es la diferencia entre el "primer" y el "segundo" evento. Puede ser negativo.

firstIndex

integer

Es el índice de envío del "primer" evento. Se debe especificar este campo.

secondIndex

integer

Es el índice de envío del "segundo" evento. Se debe especificar este campo.