ShipmentModel

Un modelo de envío contiene un conjunto de envíos que un conjunto de vehículos debe realizar y, al mismo tiempo, minimiza el costo total, que es la suma de lo siguiente:

  • el costo de planificar las rutas de los vehículos (suma del costo por tiempo total, costo por tiempo de viaje y 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)
    }
  ],
  "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.

globalStartTime

string (Timestamp format)

Horas de inicio y finalización globales del modelo: No se pueden considerar válidas las horas fuera de este rango.

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

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

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".

globalEndTime

string (Timestamp format)

Si no la estableces, se usará como valor predeterminado 00:00:00 UTC, 1 de enero de 1971 (es decir, segundos: 31536000, nanos: 0).

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".

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 reciente de todos los vehículos. Por ejemplo, los usuarios pueden asignar un costo por hora a esa cantidad para intentar optimizar la finalización del trabajo lo antes posible. 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 Google Maps o distancias 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 inicia su ruta en locA y la finaliza en locA.
  • 1 solicitud de visita para retirar 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 inicia su ruta en locA y la finaliza en locB, con la matriz "rápida".
  • 1 vehículo que inicia su ruta en locB y la finaliza en locB, con la matriz "lenta".
  • 1 vehículo inicia su ruta en locB y lo finaliza en locB, mediante la matriz "fast".
  • 1 solicitud de visita para retirar 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

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 en 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 tampoco debe estarlo.

durationDistanceMatrixDstTags[]

string

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 en este campo. Ten en cuenta que las etiquetas de origen, destino y matriz de una Vehicle pueden ser iguales. Del mismo modo, las etiquetas de origen y destino de VisitRequest pueden ser iguales. Todas las etiquetas deben ser diferentes y no pueden ser cadenas vacías. Si este campo no está vacío, durationDistanceMatrices tampoco debe estarlo.

transitionAttributes[]

object (TransitionAttributes)

Atributos de transición agregados al modelo.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Conjuntos de shipping_types incompatibles (consulte ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Conjuntos de requisitos shipmentType (consulta ShipmentTypeRequirement)

precedenceRules[]

object (PrecedenceRule)

Conjunto de reglas de precedencia que deben aplicarse en el modelo.

maxActiveVehicles

integer

Limita la cantidad máxima de vehículos activos. Un vehículo está activo si su ruta realiza al menos un envío. Se puede utilizar para limitar la cantidad de rutas en los casos en que haya menos conductores que vehículos y la flota de vehículos sea heterogénea. 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 retiros hasta uno de sus entregas. 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 repuesto según corresponda) y, luego, visitar una de sus ubicaciones de entrega más adelante (y, por lo tanto, volver a aumentar sus capacidades libres 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 debe visitar una ubicación que corresponda 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 correspondiente a los puntos de partida.

loadDemands

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

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, idealmente que también incluya 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ía, es posible que todos los vehículos la utilicen. Los vehículos se indican por su índice en la lista vehicles de ShipmentModel.

costsPerVehicle[]

number

Especifica el costo que se genera cuando cada vehículo entrega este envío. Si se especifica, debe tener:

  • la misma cantidad de elementos que costsPerVehicleIndices. costsPerVehicle[i] corresponde al vehículo costsPerVehicleIndices[i] del modelo.
  • la misma cantidad de elementos que hay vehículos en el modelo. El elemento i corresponde al vehículo n° i del modelo.

Estos costos deben estar en la misma unidad que penaltyCost y no deben ser negativos. Si no hay tales costos, deje este campo vacío.

costsPerVehicleIndices[]

integer

Í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 se excluye un vehículo de costsPerVehicleIndices, su costo es cero.

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

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

Por ejemplo, que sea el tiempo más corto necesario para pasar de la alternativa de retiro seleccionada directamente a la alternativa de entrega seleccionada. Luego, la configuración de pickupToDeliveryAbsoluteDetourLimit aplica lo siguiente:

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

Si se especifican los límites relativos y absolutos en el mismo envío, se usará el límite más restrictivo para cada par de recolección y entrega posibles. A partir de 2017/2010, los desvíos solo se admiten cuando la duración de los viajes no depende de los vehículos.

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

pickupToDeliveryTimeLimit

string (Duration format)

Especifica la duración máxima desde el inicio del retiro hasta el inicio de la entrega de un envío. Si se especifica, debe ser un número no negativo, y el envío debe contener al menos una recogida y una entrega. Esto no depende de las alternativas seleccionadas para la recolección y 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.

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

shipmentType

string

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: Todos los retiros o las 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 esta preferencia se establece como "true", omitir este envío, pero no apliques penaltyCost

Si se ignora un envío, se produce 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á el atributo precedenceRules que haga 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, debe completarse el envío.

pickupToDeliveryRelativeDetourLimit

number

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

Por ejemplo, que sea el tiempo más corto necesario para pasar de la alternativa de retiro seleccionada directamente a la alternativa de entrega seleccionada. Luego, la configuración de 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 posible de retiro y entrega. A partir de octubre de 2017, solo se admiten desvíos cuando las duraciones de viaje no dependen de los vehículos.

VisitRequest

Es una solicitud de visita que puede realizar un vehículo: tiene una geolocalización (o dos, consulta a continuación), 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 recoger o dejar bienes).

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
}
Campos
arrivalLocation

object (LatLng)

Es la ubicación geográfica a la que llega el vehículo cuando se 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)

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

departureWaypoint

object (Waypoint)

El punto de referencia desde el que sale el vehículo después de completar este VisitRequest. Se puede omitir si es igual que 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 o duplicadas.

timeWindows[]

object (TimeWindow)

Son períodos que limitan la hora de llegada en una visita. Ten en cuenta que un vehículo puede salir fuera del período de la hora de llegada, es decir, la hora de llegada y la duración no tienen que estar dentro de un período. Esto puede generar tiempo de espera si el vehículo llega antes de las 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 debe superponerse con otra ni estar adyacente a ella, y deben estar en orden creciente.

costPerHourAfterSoftEndTime y softEndTime solo se pueden configurar si hay un solo período.

duration

string (Duration format)

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

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

cost

number

Es el costo del servicio de esta solicitud de visita en una ruta vehicular. Esto se puede usar para pagar diferentes costos por cada retiro o entrega alternativa 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))

Cargar demandas de esta solicitud de visita. Es similar al campo Shipment.load_demands, con la excepción de que solo se aplica a este VisitRequest en lugar de a todo el Shipment. Las demandas que se enumeran aquí se agregan a las que se enumeran en Shipment.load_demands.

visitTypes[]

string

Especifica los tipos de visita. Se puede usar para asignar el tiempo adicional necesario para que un vehículo complete 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.

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 VisitRequests, así como las ubicaciones de partida y llegada de los Vehículos.

Representación JSON
{
  "sideOfRoad": boolean,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
Campos
sideOfRoad

boolean

Opcional. Indica que la ubicación de este punto de referencia tiene la preferencia de que el vehículo se detenga en un lado particular de la ruta. Cuando establezcas este valor, la ruta pasará por la ubicación para que el vehículo pueda detenerse en el lado de la ruta hacia el que se orienta la ubicación desde el centro de la ruta. Esta opción no funciona para el modo de viaje "CAMINAR".

Campo de unión location_type. Son diferentes formas de representar una ubicación. Las direcciones (location_type) solo pueden ser una de las siguientes opciones:
location

object (Location)

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

placeId

string

El ID de lugar del lugar de interés asociado con el punto de referencia.

Ubicación

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

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

object (LatLng)

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 utiliza para especificar el lado de la ruta que se debe utilizar para el punto de partida y de destino. Los valores de encabezado pueden ser de 0 a 360, donde 0 especifica la orientación hacia el norte, 90 especifica la orientación hacia el este, etc.

TimeWindow

Los períodos 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 de períodos de tiempo estricto, startTime y endTime, aplican la hora más temprana y más reciente 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 este, lo que genera un costo proporcional a cuánto tiempo antes de softStartTime ocurre el evento. El límite superior de la ventana de tiempo flexible, softEndTime, expresa una preferencia para que el evento ocurra en softEndTime o antes, lo que genera un costo proporcional a cuánto tiempo después de softEndTime ocurre el evento. 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 de tiempo fijo. Si no se especifica, se configurará como ShipmentModel.global_start_time.

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".

endTime

string (Timestamp format)

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

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".

softStartTime

string (Timestamp format)

La hora de inicio suave del período.

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".

softEndTime

string (Timestamp format)

La hora de finalización suave del período.

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".

costPerHourBeforeSoftStartTime

number

Es un costo por hora que se agrega a otros costos del modelo si el evento ocurre antes de softStartTime, calculado 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 configuró softStartTime.

costPerHourAfterSoftEndTime

number

Es un costo por hora que se suma 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 configuró softEndTime.

Vehículo

Modela un vehículo con un problema de envío. Si resuelves un problema de envío, se creará una ruta que comenzará en startLocation y finalizará a las 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

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

travelMode

enum (TravelMode)

El modo de viaje, que afecta las rutas que puede usar el vehículo y su velocidad. Consulta también travelDurationMultiple.

routeModifiers

object (RouteModifiers)

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

startLocation

object (LatLng)

Es la ubicación geográfica donde comienza el vehículo antes de recoger los envíos. Si no se especifica, el vehículo comienza en su primer punto de partida. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar startLocation.

startWaypoint

object (Waypoint)

Un punto de referencia que representa una ubicación geográfica donde el vehículo comienza antes de recoger cualquier envío. Si no se especifican startWaypoint ni startLocation, el vehículo comienza en su primer punto de partida. Si el modelo de envío tiene matrices de duración y distancia, no se debe especificar startWaypoint.

endLocation

object (LatLng)

Ubicación geográfica donde finaliza 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)

Punto de referencia que representa una ubicación geográfica en la que finaliza el vehículo después de completar su último VisitRequest. Si no se especifica 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 o 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)

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 especifican, no hay limitación aparte de esos límites de tiempo globales.

Los períodos que pertenecen al mismo campo repetido deben ser disjuntos, es decir, ningún período puede superponerse con otro ni estar adyacente a otro, y deben estar en orden cronológico.

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

endTimeWindows[]

object (TimeWindow)

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

Los períodos que pertenecen al mismo campo repetido deben ser disjuntos, es decir, ningún período puede superponerse con otro ni estar adyacente a otro, y deben estar en orden cronológico.

costPerHourAfterSoftEndTime y softEndTime solo se pueden configurar si hay un solo período.

unloadingPolicy

enum (UnloadingPolicy)

Se aplica una política de descarga en el 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, coherentes con las claves del campo Shipment.load_demands. Si una clave determinada no se encuentra en este mapa, la capacidad correspondiente se considera ilimitada.

costPerHour

number

Costos de los vehículos: 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 comprende el tiempo de viaje, de espera y de la 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 al tiempo de viaje de la ruta (es decir, el que se informa en ShipmentRoute.transitions) y excluye el tiempo de espera y la visita.

costPerKilometer

number

Costo por kilómetro de la ruta vehicular Este costo se aplica a la distancia informada en el ShipmentRoute.transitions y no se aplica a ninguna distancia recorrida implícitamente desde el arrivalLocation hasta el departureLocation de un solo VisitRequest.

fixedCost

number

Es el costo fijo que se aplica si se usa este vehículo para manejar 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 se debe considerar como usado o no en este caso.

Si es verdadero, el vehículo va desde su ubicación de partida hasta su ubicación de destino, incluso si no entrega envíos. Además, se tienen en cuenta los costos de tiempo y distancia resultantes de su recorrido desde el inicio > finalización.

De lo contrario, no viaja desde su ubicación de inicio hasta la de destino, y no se programan breakRule ni demoras (de 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)

El límite 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 sus vehicleEndTime y 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 un mapa de las cadenas visitTypes a las duraciones. La duración es el tiempo adicional a VisitRequest.duration que se debe tomar en las visitas con el visitTypes especificado. Esta duración de visita adicional 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á en este vehículo. Si está vacía, 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 vehículo ignorado en injectedFirstSolutionRoutes realiza un envío, se omitirá en la primera solución, pero se podrá realizar libremente en la respuesta.

Si un vehículo ignorado en injectedSolutionConstraint realiza un envío y cualquier retiro o entrega relacionado está limitado a permanecer en el vehículo (es decir, no relajado hasta el nivel RELAX_ALL_AFTER_THRESHOLD), se omitirá en la respuesta. Si un envío tiene un campo allowedVehicleIndices no 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 reducir los tiempos de viaje del vehículo. Por ejemplo, si se establece en 2.0, significa que este vehículo es más lento y tiene tiempos de viaje el doble de los que tienen los vehículos estándar. Esta cantidad múltiple no afecta la duración de las visitas. Afecta el costo si se especifican costPerHour o costPerTraveledHour. Debe pertenecer al rango [0.001, 1000.0]. Si no se establece, el vehículo es estándar y este múltiplo se considera 1.0.

ADVERTENCIA: Los tiempos de 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 pequeño múltiplo puede generar una pérdida de precisión.

Consulta también extraVisitDurationForVisitType a continuación.

TravelMode

Son los medios de transporte que pueden utilizar los vehículos.

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

Enumeraciones
TRAVEL_MODE_UNSPECIFIED Es un medio de transporte no especificado, equivalente a DRIVING.
DRIVING Es el modo de transporte correspondiente a las instrucciones sobre cómo llegar en automóvil (automóvil, etc.).
WALKING Modo de viaje correspondiente a las instrucciones sobre cómo llegar a pie

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 modos de viaje motorizados.

avoidHighways

boolean

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

avoidFerries

boolean

Especifica si se deben evitar transbordadores cuando sea razonable. Se dará prioridad a las rutas que no incluyan viajes en ferris. 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á prioridad a las rutas que no contengan navegación interior. Solo se aplica al modo de viaje WALKING.

UnloadingPolicy

Política sobre cómo se puede descargar un vehículo. Se aplica solo a los envíos que tengan retiro y entrega.

Otros envíos son gratuitos para realizarse en cualquier lugar de la ruta, independientemente de unloadingPolicy.

Enumeraciones
UNLOADING_POLICY_UNSPECIFIED Política de descarga no especificada: Las entregas deben realizarse después de los retiros correspondientes.
LAST_IN_FIRST_OUT Las entregas deben realizarse en orden inverso al de retiro
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 a lo largo de la ruta de este vehículo, se aplica la siguiente penalización de costos (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.

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 de carga aceptable.

costPerKilometer

object (LoadCost)

Costo de mover una unidad de carga en un kilómetro para este vehículo. Esto se puede usar como 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.

costPerTraveledHour

object (LoadCost)

Costo de viajar con una unidad de carga durante una hora para este vehículo.

Intervalo

Intervalo de cargas 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 aceptable máxima Debe ser mayor o igual que 0. Si no se especifica, este mensaje no restringe la carga máxima. Si se especifican ambos, min debe ser ≤ max.

LoadCost

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

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

Con este costo, las soluciones prefieren entregar las altas demandas primero o, de manera equivalente, captar las altas demandas 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 y 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: 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 generado por este LoadCost es (cost_lower * load_immediately * km + cost_before * load_before * 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 en la ruta es 120.0.

Sin embargo, si la ruta es inicio,retiro,entrega,retiro,entrega y finalización con transiciones,ocurrirá lo siguiente:

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 incurrido por 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 a lo largo de la ruta es 40.0.

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

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 mayor o igual que 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, mayor o igual que 0.

costPerUnitAboveThreshold

number

Costo de mover una unidad de carga por cada unidad que supere el umbral. En el umbral de casos especiales = 0, este es un costo por unidad fijo. Debe ser un valor finito, mayor o igual que 0.

DurationLimit

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

Cuando se define un campo de límite flexible, se deben definir juntos el umbral de máx. rendimiento 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 a un máximo de maxDuration.

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

softMaxDuration

string (Duration format)

Un límite flexible no aplica un límite de duración máxima, pero cuando se incumple, hace que la ruta incurra en 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.

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

quadraticSoftMaxDuration

string (Duration format)

Un límite flexible 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 define, quadraticSoftMaxDuration debe ser no negativa. Si también se define maxDuration, quadraticSoftMaxDuration debe ser menor que maxDuration y la diferencia no debe ser mayor que un día:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

costPerHourAfterSoftMax

number

Costo por hora generado si se infringe el umbral de softMaxDuration. El costo adicional es de 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

Costo por hora cuadrada que se genera si se infringe el umbral de quadraticSoftMaxDuration

El costo adicional es de 0 si la duración está por debajo del umbral. De lo contrario, 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 dura o blanda.

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 a un máximo de maxMeters. El límite no debe ser negativo.

softMaxMeters

string (int64 format)

Un límite flexible 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 generado, que aumenta hasta softMaxMeters con la fórmula:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Este costo no se admite en routeDistanceLimit.

costPerKilometerAboveSoftMax

number

Se genera un costo por kilómetro si la distancia supera el límite de softMaxMeters. El costo adicional es 0 si la distancia está por debajo del 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 las reglas para generar descansos para un vehículo (p.ej., las horas de almuerzo). Una pausa es un período contiguo durante el cual el vehículo permanece inactivo en su posición actual y no puede realizar ninguna visita. Es posible que se produzca una ruptura:

  • durante el viaje entre dos visitas (que incluye el tiempo justo antes o después de una visita, pero no en medio de una), en cuyo caso se extiende el tiempo de tránsito correspondiente entre las visitas,
  • o antes del arranque del vehículo (es posible que no se encienda en medio de una pausa), en cuyo caso esto no afecta la hora de inicio del vehículo.
  • o después de que finaliza el vehículo (dito, 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 varias FrequencyConstraint. Todos deben estar satisfechos con los BreakRequest de este BreakRule. Consulta FrequencyConstraint.

BreakRequest

Se debe conocer de antemano la secuencia de descansos (es decir, su cantidad y orden) que se aplica a cada vehículo. Los objetos 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 de la pausa.

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".

latestStartTime

string (Timestamp format)

Obligatorio. Límite superior (inclusivo) al inicio de la pausa.

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".

minDuration

string (Duration format)

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

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

FrequencyConstraint

Se puede restringir aún más la frecuencia y la duración de las pausas especificadas anteriormente mediante la aplicación de una frecuencia de pausa mínima, como "Debe haber una pausa de al menos 1 hora cada 12 horas". Si suponemos que esto se puede interpretar como "En cualquier período variable de 12 h, debe haber al menos una pausa de al menos una hora". Ese ejemplo se traduciría de la siguiente manera: FrequencyConstraint:

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

El tiempo 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 especificadas 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. Duración mínima de la pausa para esta restricción. No es negativo. Consulta la descripción de FrequencyConstraint.

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

maxInterBreakDuration

string (Duration format)

Obligatorio. Es la duración máxima permitida de cualquier intervalo de tiempo en la ruta que no incluya, al menos de forma parcial, una pausa de duration >= minBreakDuration. Debe ser positivo.

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

DurationDistanceMatrix

Especifica una matriz de duración y distancia de la visita y las ubicaciones de partida del vehículo para visitar, así como las ubicaciones de finalización del vehículo.

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ía, se aplica a todos los vehículos y solo puede haber una matriz.

Cada inicio de vehículo debe coincidir exactamente con 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)

Valores de duración para una fila determinada. Debe tener tantos elementos como ShipmentModel.duration_distance_matrix_dst_tags.

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

meters[]

number

Valores de distancia para una fila determinada. Si no hay costos ni restricciones que se refieran a distancias en el modelo, se puede dejar vacío. De lo contrario, debe tener tantos elementos como durations.

TransitionAttributes

Especifica atributos de transiciones entre dos visitas consecutivas en una ruta. Es posible que se apliquen 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 (según la semántica natural de "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 a la fuente 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 srcTag y excludedSrcTag debe no estar vacío.

dstTag

string

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

excludedDstTag

string

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

cost

number

Especifica un costo para realizar esta transición. Se encuentra en la misma unidad que todos los demás costos del modelo y no debe ser negativo. Este importe se suma a 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. Suma 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 2021/06, solo se admiten límites flexibles.

delay

string (Duration format)

Especifica un retraso generado al realizar esta transición.

Esta demora siempre ocurre después de terminar la visita de origen y antes de comenzar la visita de destino.

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

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 en función del modo de incompatibilidad.

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

string

Lista de tipos incompatibles. Dos envíos que tienen un shipment_types diferente entre los que se enumeran son "incompatibles".

incompatibilityMode

enum (IncompatibilityMode)

Se aplicó el modo a la incompatibilidad.

IncompatibilityMode

Modos que definen cómo se restringen los envíos incompatibles en la misma ruta

Enumeraciones
INCOMPATIBILITY_MODE_UNSPECIFIED Modo de incompatibilidad no especificado. 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

Para dos envíos con tipos incompatibles con el modo de incompatibilidad NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Si ambas opciones son solo para retiros (no para entregas) o solo entregas (no retiros), no podrán compartir el mismo vehículo.
  • Si uno de los envíos tiene entrega y el otro tiene retiro, los dos envíos pueden compartir el mismo vehículo si el envío anterior se entrega antes de que se retire este último.

ShipmentTypeRequirement

Especifica los requisitos entre envíos según su tipo de envío. Los detalles del requisito se definen en función del modo de requisitos.

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

string

Lista de tipos de envío alternativos que requiere dependentShipmentTypes.

dependentShipmentTypes[]

string

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

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

requirementMode

enum (RequirementMode)

Se aplica el modo al requisito.

RequirementMode

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

Enumeraciones
REQUIREMENT_MODE_UNSPECIFIED Modo de requisitos 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 el vehículo en el momento de la recolección.

Por lo tanto, una recolección de envíos “dependiente” debe tener una de las siguientes opciones:

  • Un envío "obligatorio" de solo entrega que se entrega en la ruta después de
  • Se recoge un envío "obligatorio" en la ruta anterior y, si dicho envío tiene una entrega, esta debe realizarse después del retiro 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 el vehículo en el momento de la entrega.

PrecedenceRule

Una regla de prioridad entre dos eventos (cada evento es el retiro o la entrega de un envío): el evento "segundo" debe comenzar, al menos, offsetDuration después de que comience el "primero".

Varias prioridades pueden referirse 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 se ignoran de otra forma.

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

boolean

Indica si el "primer" evento es una publicación.

secondIsDelivery

boolean

Indica si el "segundo" evento es una publicación.

offsetDuration

string (Duration format)

El desplazamiento entre el "primer" y el "segundo" evento. Puede ser negativo.

Una duración en segundos con hasta nueve dígitos decimales, que terminan en “s”. Ejemplo: "3.5s".

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.