En esta página, se describe el ciclo de vida de un plan de rutas con la API de Route Optimization, desde la identificación de tus necesidades de planificación de rutas hasta la integración de un plan de rutas en tu sistema.
Cuando sigues las etapas del plan de ruta, puedes alcanzar los siguientes objetivos:
- Asigna tus operaciones de flota: Traduce tu flota física, las restricciones complejas y los objetivos comerciales en código para la API.
- Optimiza los planes de rutas para tu empresa: Comprende cómo definir mejor tu plan de rutas para que cumpla con tus objetivos y mejore tus operaciones diarias.
- Implementa tu plan de rutas en producción: Inclúyelo en tus operaciones diarias.
En el siguiente diagrama, se muestra el ciclo de vida de un plan de ruta.
La fase de implementación de un plan de rutas se produce cuando integras la API por primera vez o cuando los requisitos de tu empresa cambian de manera significativa. Abarca las etapas 1 a 5.
La fase de operaciones diarias es más ligera y el perfeccionamiento es mínimo. Abarca las etapas 2 a 4.
Las etapas de la vida de una ruta son las siguientes:
- Delimita el alcance de tu problema: Identifica y organiza tus objetivos, recursos, tareas y restricciones para tener una visión completa de tus operaciones antes de comenzar a usar la API.
- Asigna tus datos: Traduce tu realidad empresarial en parámetros de la API para que el plan de ruta refleje cómo necesitas que opere tu flota.
- Crea una solicitud y obtén un plan de ruta: Ingresa tus datos en la API y obtén tu plan de ruta optimizado.
- Define mejor tu plan de ruta: Prueba tu plan de ruta y ajústalo iterativamente modificando tus restricciones y objetivos para asegurarte de que satisfaga todas tus necesidades.
- Integra el plan de ruta: Conecta el plan de ruta a tus sistemas existentes para proporcionar navegación práctica.
Delimita tu problema
Antes de usar la API, debes organizar los detalles de tus operaciones diarias en categorías de datos claras. Esto te permite comenzar el proceso de implementación con claridad sobre cuáles son tus recursos y tareas actuales, qué los limita y cuáles son los objetivos que deseas lograr con tu flota.
Identifica tus recursos y tareas
Un paso importante al planificar tu plan de ruta es identificar tus recursos y tareas, que son tus vehículos y envíos.
| Los vehículos | Los envíos |
|---|---|
|
|
Identifica tus restricciones
Tus restricciones son los límites y las restricciones sobre cómo puedes usar tus vehículos y cómo debes manejar tus envíos. Rigen la mayoría de tus operaciones y son vitales cuando creas un plan de ruta optimizado.
Por lo general, las restricciones se dividen en dos categorías:
| Restricciones estrictas | Restricciones flexibles |
|---|---|
| Estos son límites que no se pueden superar. Por ejemplo, un camión no puede transportar más peso del que permite su capacidad máxima, y un conductor no puede hacer una recolección después de que una tienda cerró. | Estas son preferencias que se pueden incumplir si es necesario, por lo general, con un costo de penalización. Por ejemplo, es posible que prefieras cargar un camión solo hasta el 80% de su capacidad o realizar la entrega antes de una hora objetivo, pero no te importa exceder estos límites para obtener una mejor ruta. |
Entre las restricciones comunes, se incluyen las siguientes:
- Límites de capacidad: El peso, el volumen o la cantidad máximos de artículos que puede transportar un vehículo.
- Períodos: Son los períodos específicos en los que una ubicación está abierta para una visita o las horas de turno específicas de un conductor.
- Costos: El costo de operar un vehículo o de omitir un envío Uno de los objetivos principales de la API es generar un plan de ruta rentable.
- Descansos del conductor: Períodos de descanso del conductor que suelen exigirse por las leyes laborales después de una cierta cantidad de horario laboral.
Establece tus objetivos comerciales
Una vez que establezcas tus recursos y tareas, y sus limitaciones, es momento de determinar qué métricas son más importantes para tu empresa. Estos objetivos van de la mano con las restricciones y te ayudan a decidir qué es lo más importante cuando planificas una ruta.
Estos son algunos ejemplos de objetivos comerciales:
| Tamaño de la flota | Distancia | Hora | Costo |
|---|---|---|---|
| ¿Quieres minimizar la cantidad de vehículos utilizados o usar toda tu flota para terminar la jornada laboral antes? | ¿Quieres la ruta más corta para ahorrar combustible o prefieres una ruta más rápida que podría ser más larga debido al uso de autopistas? | ¿Quieres minimizar las horas totales trabajadas o priorizar llegar a horarios específicos, lo que puede alargar el tiempo en ruta? | ¿Quieres minimizar los gastos operativos, como los salarios y el combustible, o aceptar costos más altos para cumplir con plazos estrictos? |
Asigna tus datos
Una vez que hayas recopilado tus datos, asígnalos para que coincidan con las propiedades de la API. Esto le brinda al optimizador toda la información para devolver un plan de ruta que tenga en cuenta la realidad de tu empresa.
Usa los parámetros de las siguientes tablas para asignar los recursos, las tareas, las restricciones y los objetivos que asignaste en la sección Define el alcance de tu problema.
Asignación de variables
| Concepto del mundo real | Parámetro de API | Descripción |
|---|---|---|
| Conductor o vehículo | model.vehicles[] |
Representa un solo vehículo de tu flota. |
| Ubicaciones de los depósitos |
vehicles[].startWaypointvehicles[].endWaypoint
|
Es la ubicación donde el vehículo comienza y finaliza su ruta. |
| Tu horario de atención |
model.globalStartTimemodel.globalEndTime
|
Hora de inicio más temprana y hora de finalización más tardía para el funcionamiento de toda la flota. |
| Tarea o paquete | model.shipments[] |
Representa un trabajo. Puede ser pickup, delivery o ambos. |
| Ubicación de la tarea |
pickups[].arrivalWaypointdeliveries[].arrivalWaypoint
|
Es la ubicación geográfica en la que se realiza el trabajo. |
| Tiempo de servicio |
pickups[].durationdeliveries[].duration
|
Es el tiempo dedicado a completar la tarea en la ubicación (por ejemplo, la descarga), sin incluir el tiempo de viaje. |
Mapeo de restricciones
| Restricción del mundo real | Parámetro de API | Descripción |
|---|---|---|
| Capacidad del vehículo | vehicles[].loadLimits |
Establece el límite flexible o estricto para la capacidad del vehículo. Si el loadDemand de un envío supera el límite restante, no se asigna. |
| Tamaño del paquete | shipments[].loadDemands |
Es la cantidad de capacidad del vehículo que ocupa un envío. |
| Restricción de vehículo | shipments[].allowedVehicleIndices |
Restringe un envío para que solo lo puedan retirar o entregar vehículos o conductores específicos. |
| Horario de atención | shipments[].pickups[].timeWindows o shipments[].deliveries[].timeWindows |
Establece el horario disponible para visitar una ubicación. Si un vehículo no puede llegar dentro de este período, se omitirá el envío. |
| Límite de longitud del turno | vehicles[].routeDurationLimit |
Establece un límite flexible o estricto sobre cuánto tiempo puede trabajar un conductor específico (por ejemplo, un máximo de 8 horas), independientemente de la hora de finalización global. |
| Descansos del conductor | vehicles[].breakRule |
Aplica reglas de descanso específicas, como descansos obligatorios después de ciertas horas de trabajo. |
| Restricciones en la ruta | vehicles[].travelMode |
Especifica el modo de viaje (por ejemplo, DRIVE o BICYCLE). Esto restringe la ruta a las rutas legales y determina las velocidades que se usan para calcular los tiempos de viaje. |
Asignación de objetivos
| Objetivo del mundo real | Parámetro de API | Descripción |
|---|---|---|
| Minimizar el tamaño de la flota | vehicles[].fixedCost |
Aplica un costo único por el uso de un vehículo. Un costo fijo alto obliga a una ruta a priorizar el uso de menos vehículos en lugar de aumentar la distancia total o el tiempo de trabajo. |
| Minimizar la distancia | vehicles[].costPerKilometer |
Se aplica un costo por cada kilómetro recorrido. Prioriza las rutas más cortas para ahorrar combustible y reducir el desgaste. |
| Minimiza el tiempo total | vehicles[].costPerHour |
Se aplica un costo por cada hora en que el vehículo está activo (incluido el tiempo de viaje y de espera). Prioriza la finalización más rápida. |
| Minimiza el tiempo de conducción | vehicles[].costPerTraveledHour |
Aplica un costo específicamente por el tiempo dedicado al movimiento. Esto distingue entre estar sentado en el tráfico (costoso) y esperar en una parada(potencialmente más económico). |
| Priorizar ciertas tareas | shipments[].penaltyCost |
Aplica un costo si se omite un envío específico. Establecer este valor alto garantiza que se prioricen las tareas críticas por sobre las opcionales. |
Crea la solicitud y obtén una respuesta
Para generar un plan de ruta con la API de Route Optimization, sigue estos pasos:
- Configura tu entorno: Configura tu proyecto de Google Cloud, habilita la API y configura la autenticación. Para obtener instrucciones, consulta Cómo comenzar. Solo debes seguir este paso una vez.
- Envía la solicitud: Construye el cuerpo de la solicitud con la asignación de datos definida en la sección anterior. Para obtener información sobre los extremos, los encabezados y el formato de las solicitudes, consulta Cómo realizar una solicitud a la API.
- Comprende la respuesta: Una vez que obtengas una respuesta de la API, comprende el plan de ruta y el significado de cada parámetro. Consulta Cómo interpretar una respuesta.
Cómo definir mejor tu plan de ruta
Traducir la logística del mundo real en costos y restricciones de la API es una tarea compleja. Es posible que tu plan de ruta inicial no coincida con los objetivos comerciales o las expectativas de los conductores. Definir mejor tu plan de ruta es el proceso iterativo de probar las rutas que se muestran y ajustar los parámetros hasta que encuentres una configuración que cumpla con tus objetivos.
Ajusta los objetivos y las restricciones
Si el plan de ruta generado no satisface tus necesidades, puedes modificar ciertos parámetros para obtener resultados diferentes. Ajustar o relajar los parámetros altera la forma en que se resuelven los objetivos en conflicto en el plan de ruta, y relajar los parámetros es una forma eficiente de descubrir los parámetros que causan errores en tus planes de ruta.
En la siguiente tabla, se enumeran los problemas de enrutamiento comunes y los parámetros que puedes ajustar para resolverlos.
| Situación | Parámetro | Ajuste | Descripción |
|---|---|---|---|
| Se omite un envío importante | shipments[].penaltyCost |
Aumentar su valor o agregar costos de penalización a otros envíos | Si el envío es opcional, aumenta su costo de penalización para priorizarlo. Si el envío es obligatorio (no tiene costo de penalización), agrega costos de penalización a los envíos otros, que son menos críticos. Esto los hace opcionales, lo que libera tiempo y capacidad del vehículo para el envío importante. |
| Se omitió el envío debido a la sincronización | softStartTime/softEndTime |
Agregar períodos flexibles | Los períodos estrictos descartan las tareas que se retrasan incluso un minuto. Las ventanas flexibles permiten que el conductor llegue con un pequeño retraso pagando un "costo" en lugar de no completar la tarea. |
| Se omitió el envío debido al peso | loadLimits[].softMaxLoad y costPerUnitAbove |
Agrega demandas de carga flexibles | Permite que un vehículo supere ligeramente su capacidad ideal (con una penalización) en lugar de dejar un paquete. |
| Se omitió el envío debido a la sobrecarga de la flota | model.vehicles[] o shipments[].timeWindows |
Agregar vehículos o períodos de relajación | Si hay demasiados envíos para la flota actual, especialmente durante las horas pico, agrega más vehículos o amplía los períodos de entrega para distribuir la carga de trabajo. |
| Las rutas son demasiado largas o ineficientes | vehicles[].costPerKilometer/costPerHour |
Agregar costos o aumentar su valor | Indica a la API que el viaje es costoso, lo que la alienta a descartar paradas distantes y aisladas para crear rutas más ajustadas para la flota. |
| Los turnos de los conductores son demasiado largos | vehicles[].routeDurationLimit o model.vehicles[] |
Agregar límites de duración o agregar vehículos y límites | Aplica un límite máximo (por ejemplo, 8 horas) al tiempo total que un conductor pasa en la ruta. Agregar vehículos por sí solo no acortará las rutas, a menos que también apliques límites de duración para obligar al solucionador a distribuir la carga de trabajo en la flota más grande. |
Actualiza un plan de ruta
A menudo, es necesario actualizar un plan de ruta sin cambiar la base, por ejemplo, agregar una recogida al programa de un conductor activo. Para ello, usa parámetros de inserción, que proporcionan a la API un punto de partida basado en tu solución anterior, lo que le permite modificar el plan existente en lugar de calcular uno nuevo desde cero.
A continuación, se muestran diferentes formas en las que puedes actualizar un plan de ruta con parámetros de inserción:
- Pasa las rutas de una respuesta anterior al campo
injectedFirstSolutionRoutesde tu nueva solicitud. Esto acelera la búsqueda de optimización y es útil para volver a planificar antes de que comiencen las operaciones diarias, como integrar envíos de último momento. - Controla el grado de cambio con el campo
injectedSolutionConstraint. Esto es útil cuando las operaciones ya están en curso, ya que te permite conservar la secuencia actual del conductor o corregir partes del plan que ya se ejecutaron. - Asegúrate de que la ruta actualizada siga asignada al vehículo correcto configurando
interpretInjectedSolutionsUsingLabelscomotrue. Esto es útil en la experimentación cuando se agregan o quitan envíos y vehículos, ya que las rutas se correlacionan con etiquetas en lugar de índices. Esto requiere que todas las etiquetas de vehículos y envíos sean únicas.
Integra tu plan de ruta
Tu plan de ruta finalizado es un objeto de datos que representa una administración optimizada de tus recursos y tareas, a la vez que cumple con tus restricciones y objetivos. Integra este plan de ruta en tu sistema para usarlo en tus operaciones diarias. Por lo general, esto implica visualizar tu plan de ruta para los administradores de la flota y enviar instrucciones paso a paso a los conductores.
Visualización
Para permitir que los administradores de la flota verifiquen y supervisen tu plan de ruta, puedes visualizarlo de las siguientes maneras:
Para permitir que los administradores de flota verifiquen y supervisen tu plan de ruta, puedes mostrarlo en un mapa del panel. Según la etapa de desarrollo en la que te encuentres, puedes visualizar tu plan de ruta de las siguientes maneras:
- Explora sin código: Puedes usar la app de código abierto Route Optimization para ver cómo la API traduce tus datos en rutas físicas en un mapa. Esta aplicación web funciona como una herramienta de exploración que te permite crear situaciones, ajustar parámetros de restricción y renderizar visualmente los planes de rutas resultantes antes de escribir cualquier código.
- Mostrar el orden de las visitas: Puedes mostrar la secuencia de visitas como puntos numerados en un mapa para evaluar tus planes de optimización y despacho en tu propio sistema. Para ello, ubica el array
visitsdentro de cada ruta de la respuesta de la API. Los elementos de este array se ordenan exactamente como el conductor debe ejecutarlos. Puedes iterar esta lista, usarshipmentIndexpara recuperar las coordenadas de ubicación de cada parada y usar tu biblioteca de mapas para renderizar marcadores numerados en el mapa según su orden en la lista. - Dibuja la ruta física: Puedes visualizar la ruta planificada exacta en un mapa para comprender por qué el optimizador eligió una secuencia específica. Esta polilínea representa la ruta prevista para la planificación y la evaluación, no la ruta en tiempo real que tomó un conductor. Establece
populatePolylines: trueen tu solicitud para obtener un campoencodedPolylinepara cada ruta y decodifícalo con el métodogoogle.maps.geometry.encoding.decodePath()de la API de Maps JavaScript.
Envío a los conductores
Puedes integrar las instrucciones paso a paso en tu aplicación para conductores con el SDK de Navigation o proporcionar vínculos directos a la app para consumidores de Google Maps.
- SDK de Navigation: Si tienes una aplicación personalizada para conductores, puedes integrar el SDK de Navigation para Android o iOS para obtener indicaciones paso a paso integradas en la app.
Puedes integrar la información de la tarea de la respuesta de la API en tu sistema y usar el SDK para la navegación. Para pasar las rutas de la respuesta de la API al SDK, configura
populateTransitionPolylines: trueen tu solicitud. Esto genera unrouteTokenpara cada transición en la respuesta. - Fleet Engine: Para la administración avanzada de la flota, puedes importar el plan de rutas generado por la API en Fleet Engine para supervisar la ejecución de la ruta en tiempo real. Si bien la API proporciona una polilínea del camino previsto para la evaluación, Fleet Engine vincula tu secuencia planificada de visitas con el seguimiento en tiempo real del vehículo.