Este escenario optimiza el orden de las paradas asignadas a un vehículo con medidas los parámetros de costo. Este es el modo más simple de operación de optimización de rutas. garantiza que se visiten todas las paradas dentro del período especificado.
En el siguiente ejemplo, se ilustra un escenario básico con un vehículo y tres envíos, todos procedentes de una única ubicación llamada depósito.
Ver una solicitud de ejemplo
{ "populatePolylines": true, "populateTransitionPolylines": true, "model": { "globalStartTime": "2023-01-13T16:00:00-08:00", "globalEndTime": "2023-01-14T16:00:00-08:00", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerKilometer": 10.0, "costPerHour": 40.0 } ] } }
Campos de la solicitud de optimización de rutas
Como se mencionó en la Descripción general, la solicitud de optimización de rutas más importante
son vehicles
y shipments
.
Además de un vehículo y los envíos, la solicitud incluye lo siguiente campos:
Polilíneas
populatePolylines
y populateTransitionPolylines
especifican si la opción Ruta
La optimización debería devolver polilíneas.
El servicio codifica polilíneas con el códec de polilíneas de Maps JS, que representa
datos de polilínea binaria con caracteres ASCII imprimibles. Puedes usar la
Utilidad de codificador de polilínea interactiva para visualizar las rutas calculadas por
Optimización de rutas. En el ejemplo de esta guía, se configuran populatePolylines
y
populateTransitionPolylines
como verdadero, pero otras guías las establecieron como false
reducir el tamaño de las respuestas.
Consulta el Formato del algoritmo de polilínea codificada para obtener una descripción de la codificación. de un conjunto de datos tengan un formato común.
Restricciones de tiempo globales
model.globalStartTime
y model.globalEndTime
se establecen en un 24 arbitrario
de una hora. Esto hace que las marcas de tiempo de salida sean más fáciles de interpretar.
Visitar ubicaciones
La solicitud de ejemplo solo usa model.shipments[].pickups[].arrivalLocation
y
model.shipments[].deliveries[].arrivalLocation
También hay un
La propiedad departureLocation
para situaciones en las que el vehículo sale de una
punto diferente al lugar al que llega, como un complejo de estacionamientos con entrada
en un lado del edificio
y una salida en el otro. En este curso y en los siguientes
, se supone que los puntos de llegada y salida son los mismos.
Los campos de llegada y salida de waypoint
también existen como alternativa a latLng
.
Los campos Waypoint
admiten el uso de los IDs de lugar de Google como alternativa a LatLng
.
y también se pueden especificar las orientaciones de los vehículos. Consulta la documentación de referencia
(REST, gRPC) para obtener más información.
Restricciones del ejemplo
Esta situación restringe el optimizador de varias maneras:
- Todas las actividades deben completarse entre las horas de inicio y finalización globales. En esta situación, las horas de inicio y finalización son una restricción muy laxa dada la la proximidad de los envíos y el amplio margen de tiempo global.
- Se deben completar todos los envíos. Este es el comportamiento predeterminado cuando
no se especifican los costos de penalización en
shipments
. - Se configuraron
costPerKilometer
ycostPerHour
en el vehículo.
Los costos se abordan en Parámetros del modelo de costos.
Propiedades de las respuestas de optimización de rutas
Ver una respuesta a la solicitud de ejemplo
{ "routes": [ { "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:36:41Z", "visits": [ { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-14T00:02:30Z", "detour": "150s" }, { "isPickup": true, "startTime": "2023-01-14T00:05:00Z", "detour": "300s" }, { "startTime": "2023-01-14T00:11:25Z", "detour": "0s" }, { "shipmentIndex": 1, "startTime": "2023-01-14T00:19:29Z", "detour": "503s" }, { "shipmentIndex": 2, "startTime": "2023-01-14T00:29:02Z", "detour": "1324s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z", "routePolyline": {} }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:02:30Z", "routePolyline": {} }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:05:00Z", "routePolyline": {} }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-14T00:07:30Z", "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@" } }, { "travelDuration": "234s", "travelDistanceMeters": 793, "waitDuration": "0s", "totalDuration": "234s", "startTime": "2023-01-14T00:15:35Z", "routePolyline": { "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@" } }, { "travelDuration": "323s", "travelDistanceMeters": 1204, "waitDuration": "0s", "totalDuration": "323s", "startTime": "2023-01-14T00:23:39Z", "routePolyline": { "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@" } }, { "travelDuration": "209s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "209s", "startTime": "2023-01-14T00:33:12Z", "routePolyline": { "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" } } ], "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@RWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@STY@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" }, "metrics": { "performedShipmentCount": 3, "travelDuration": "1001s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2201s", "travelDistanceMeters": 3457 }, "travelSteps": [ { "duration": "0s", "routePolyline": {} }, { "duration": "0s", "routePolyline": {} }, { "duration": "0s", "routePolyline": {} }, { "duration": "227s", "distanceMeters": 794, "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@" } }, { "duration": "233s", "distanceMeters": 791, "routePolyline": { "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@" } }, { "duration": "322s", "distanceMeters": 1205, "routePolyline": { "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@" } }, { "duration": "208s", "distanceMeters": 666, "routePolyline": { "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" } } ], "vehicleDetour": "2201s", "routeCosts": { "model.vehicles.cost_per_hour": 24.455555555555556, "model.vehicles.cost_per_kilometer": 34.57 }, "routeTotalCost": 59.025555555555556 } ], "totalCost": 59.025555555555556, "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1001s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2201s", "travelDistanceMeters": 3457 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-14T00:00:00Z", "latestVehicleEndTime": "2023-01-14T00:36:41Z", "totalCost": 59.025555555555556, "costs": { "model.vehicles.cost_per_kilometer": 34.57, "model.vehicles.cost_per_hour": 24.455555555555556 } } }
La respuesta de optimización de rutas incluye un campo routes
de nivel superior que
representa las rutas propuestas, con una ruta por vehículo. Dado que el ejemplo
solicitud de esta guía especifica solo un vehículo, routes
incluye uno
ShipmentRoute
mensaje.
ShipmentRoute
propiedades
Las dos propiedades más importantes del tipo de mensaje ShipmentRoute
son las siguientes:
visits
y transitions
.
Cada Visit
representa la finalización de un retiro o una entrega de uno de
los VisitRequest
del mensaje de solicitud. A una visita se le asigna de manera efectiva trabajo a
completarla un vehículo en algún lugar y momento.
Cada Transition
representa el vehículo que viaja de una ubicación a
a continuación. Las transiciones pueden ocurrir entre un par del
punto de partida del vehículo, una visita
ubicación y el extremo del vehículo.
Para reconstruir la ruta completa del vehículo, los ShipmentRoute
visits
y
Se debe combinar transitions
. La combinación de campos en una progresión
La actividad del vehículo se ve de la siguiente manera:
request.vehicles[0].startLocation -> transitions[0] -> visits[0] ->
transitions[1] -> visits[1] -> transitions[2] -> ... -> visits[3] ->
transitions[4] -> request.vehicles[0].endLocation
Un ShipmentRoute
siempre tiene un transitions
más que visits
, ya que el
el vehículo debe viajar desde su ubicación de partida hasta su primera visita al principio
de la ruta y desde su última visita hasta su ubicación de destino al final del
ruta. Si el vehículo no tiene una ubicación de partida o llegada, seguirá habiendo una
más de transitions
que visits
porque la ubicación de la primera o la última visita es
que se use como la ubicación de partida o finalización del vehículo, respectivamente.
En este ejemplo, las tres primeras visitas de retiro tienen transiciones entre ellas sin distancia ni duración porque los tres puntos de partida compartir la misma ubicación en la solicitud.
Consulta la documentación de referencia de ShipmentRoute
(REST, gRPC) para obtener más información.
más detalles.
Optimización simple de pedidos de puntos de referencia
Como se muestra en este ejemplo, la optimización de rutas modela las visitas como propiedades de
envíos y no tiene una noción de puntos de referencia o paradas como
. Sin embargo, es posible representar paradas o puntos de referencia como envíos.
con exactamente un VisitRequest
como retiro o entrega. El vehículo debe
un objeto costPerHour
o costPerKilometer
para que el optimizador encuentre
la mejor ruta (en lugar de encontrar cualquier ruta factible).