En este documento, se muestra cómo realizar tu primera solicitud a la API de Route Optimization con un caso de uso del mundo real.
Para simplificar, en el ejemplo, se usan HTTP y JSON para demostrar la API de REST. Sin embargo, para tu entorno de producción, la recomendación general es usar gRPC por sus beneficios de rendimiento. Sin embargo, gRPC requiere cierta instalación. Para obtener más información, consulta Bibliotecas cliente de la API de Route Optimization.
Situación
Diriges un servicio de guardería para perros de 7:00 a.m. a 7:00 p.m. en San Francisco. Esta mañana, debes recoger dos perros en diferentes ubicaciones de la ciudad. Ambos dueños de perros te dieron un horario de retiro entre las 7:30 a.m. y las 9:30 a.m.
Tienes una camioneta para el trabajo y le pagas al conductor 27 dólares por hora. El conductor y la camioneta comienzan el día en tu centro de cuidado infantil a las 7:00 a.m. y deben regresar de las recogidas de la mañana a las 12:00 p.m. para un descanso para el almuerzo.
Hoy es 13 de febrero de 2024, y el conductor tiene las siguientes tareas:
- Recoge al boyero de Berna cerca de la torre Coit.
- Recoge al chihuahua en el parque South Sunset Playground.
- Dejar a ambos perros en la guardería canina del parque Mission Dolores
Necesitas una ruta que minimice el tiempo que los perros pasan en la camioneta y que cumpla con los requisitos de recogida y entrega.
Antes de comenzar
Para ejecutar el código en este caso de ejemplo, primero debes completar las instrucciones en Configura la API de Route Optimization.
1. Elige tu enfoque de optimización de rutas
La API de Route Optimization tiene varios métodos para que elijas según la complejidad de tu problema de optimización.
Dado que este caso de guardería para perros es una solicitud pequeña y directa, usa un método de bloqueo, como optimizeTours, que entrega resultados rápidamente para solicitudes pequeñas. Para obtener más información sobre los métodos de la API de Route Optimization, consulta Extremos síncronos y asíncronos.
Usa la siguiente URL para realizar una solicitud HTTP POST al método optimizeTours:
https://routeoptimization.googleapis.com/v1/projects/PROJECT_OR_ID:optimizeTours
También debes configurar los parámetros de tiempo de espera y fecha límite para que sean cortos y reducir cualquier tiempo de espera innecesario. En este caso de guardería para perros, el optimizador no necesita mucho tiempo para responder a tu solicitud, por lo que puedes usar los siguientes parámetros de configuración:
- Establece el parámetro
timeouten 2 segundos. - Deja la configuración de plazo predeterminada, que es de 60 segundos para las solicitudes de REST.
2. Construye el cuerpo del mensaje de solicitud
Después de elegir el método de bloqueo optimizeTours y definir la configuración de tiempo de espera y fecha límite, el siguiente paso es construir el cuerpo del mensaje de solicitud.
En este caso, la solicitud es un mensaje OptimizeToursRequest codificado como JSON en la API de REST.
Para construir el mensaje de solicitud, sigue los pasos que se indican a continuación:
Comienza con la estructura básica de la solicitud, que es la siguiente:
{ "timeout": ..., "model": { "shipments": [...], "vehicles": [...], "globalStartTime": "...", "globalEndTime": "..." } }Para obtener más información sobre la estructura, consulta la guía de conceptos clave de Estructura básica (ShipmentModel, Shipment y Vehicle).
Define los envíos. En el campo
shipments, agrega un mensajeShipmentpara cada perro que deba recogerse y llevarse por la mañana. Aquí es donde defines la ubicación y los horarios de retiro preferidos de cada dueño de perro, así como la ubicación y los horarios del centro de cuidado para dejar a los perros.Para cada perro, crea un objeto
VisitRequestpara las recogidas y otro para las entregas, que, en este caso, se denomina entrega en la guardería.En las recogidas, establece el
arrivalWaypointen la ubicación de recogida del perro (Coit Tower para el boyero de Berna o South Sunset Playground Park para el chihuahua) y eltimeWindowsen la hora de recogida solicitada por el propietario (de 7:30 a.m. a 9:30 a.m.).En las entregas, establece
arrivalWaypointen el centro de cuidado infantil ytimeWindowspara la hora de entrega requerida (de 9:30 a.m. a 11:30 a.m.).
Para obtener más información sobre los períodos, consulta Períodos.
Puedes usar el campo
labelpara agregar un identificador para cada envío, como "Perro de montaña bernés" y "Chihuahua". Esto puede ayudarte a identificar los envíos en la respuesta.
Para obtener más información sobre cómo definir envíos, consulta Envío.
Define los vehículos. En el campo
vehicles, agrega un mensajeVehiclepara tu camioneta con la guardería como punto de partida y final, el costo del salario del conductor y las horas de funcionamiento de la camioneta.Establece
startWaypointyendWaypointpara la camioneta en las ubicaciones de inicio y finalización del día, que es la guardería cerca de Mission Dolores Park.Para minimizar los costos operativos, debes definir las restricciones de costos de tu empresa. Establece el parámetro de costo
costPerHouren 27, que es lo que le pagas al conductor por conducir la camioneta de la guardería canina. Para obtener más información sobre los parámetros de costos, consulta Modelo de costos.Para asegurarte de que el optimizador cree una ruta dentro del horario de funcionamiento de la camioneta, define
startTimeWindowsen el rango aceptable para que el conductor comience a operar la camioneta yendTimeWindowsen el rango aceptable para que el conductor regrese a la guardería. Para obtener más información sobre los períodos, consulta Períodos.
Establece un período global. El período global representa el período durante el cual la camioneta puede recoger y dejar a los niños de tu guardería a lo largo del día. Para este caso, establece
globalStartTimeen las 7:00 a.m. yglobalEndTimeen las 7:00 p.m. para el 13 de febrero de 2024, que representan el horario de atención de la guardería para perros.
3. Envía la solicitud
A continuación, se muestra una solicitud curl simple basada en la situación de la guardería canina y que usa el método de bloqueo optimizeTours.
Antes de enviar la solicitud, reemplaza PROJECT_NUMBER_OR_ID en el código de muestra por el ID de tu proyecto de Google Cloud.
curl -X POST 'https://routeoptimization.googleapis.com/v1/projects/PROJECT_NUMBER_OR_ID:optimizeTours' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
--data @- << EOM
{
"timeout": 2s,
"model": {
"shipments": [
{
"pickups": [
{
"arrivalWaypoint": {
"location": {
"latLng": {
"latitude": 37.802395,
"longitude": -122.405822
}
}
},
"timeWindows": [
{
"startTime": "2024-02-13T07:30:00Z",
"endTime": "2024-02-13T09:30:00Z"
}
]
}
],
"deliveries": [
{
"arrivalWaypoint": {
"location": {
"latLng": {
"latitude": 37.760202,
"longitude": -122.426796
}
}
},
"timeWindow": [
{
"startTime": "2024-02-13T09:30:00Z",
"endTime": "2024-02-13T11:30:00Z"
}
]
}
],
"label": "Bernese mountain dog"
},
{
"pickups": [
{
"arrivalWaypoint": {
"location": {
"latLng": {
"latitude": 37.738067,
"longitude": -122.498593
}
}
},
"timeWindows": [
{
"startTime": "2024-02-13T07:30:00Z",
"endTime": "2024-02-13T09:30:00Z"
}
]
}
],
"deliveries": [
{
"arrivalWaypoint": {
"location": {
"latLng": {
"latitude": 37.760202,
"longitude": -122.426796
}
}
},
"timeWindow": [
{
"startTime": "2024-02-13T09:30:00Z",
"endTime": "2024-02-13T11:30:00Z"
}
]
}
],
"label": "Chihuahua"
}
],
"vehicles": [
{
"startWaypoint": {
"location": {
"latLng": {
"latitude": 37.760202,
"longitude": -122.426796
}
}
},
"endWaypoint": {
"location": {
"latLng": {
"latitude": 37.760202,
"longitude": -122.426796
}
}
},
"costPerHour": 27,
"startTimeWindows": [
{
"startTime": "2024-02-13T07:00:00Z",
"endTime": "2024-02-13T07:15:00Z"
}
],
"endTimeWindows": [
{
"startTime": "2024-02-13T11:45:00Z",
"endTime": "2024-02-13T12:00:00Z"
}
]
}
],
"globalStartTime": "2024-02-13T07:00:00Z",
"globalEndTime": "2024-02-13T19:00:00Z"
}
}
EOM
Parámetros de solicitud utilizados en la solicitud
En la siguiente tabla, se describen los parámetros de la solicitud que se usan en el cuerpo de la solicitud del ejemplo. Puedes filtrar el contenido por elemento superior o por búsqueda de texto.
| Madre o padre | Parámetro | Tipo de propiedad | Descripción |
|---|---|---|---|
OptimizeToursRequest |
model |
object (ShipmentModel) |
Este es el núcleo de tu solicitud. Es un solo objeto en el que defines todo el problema, incluidos todos los perros que debes recoger y dejar (shipments) y la camioneta de tu flota (vehicles). Piénsalo como el plano completo del problema que debes optimizar. |
timeout |
Duración | Este parámetro especifica el tiempo máximo que el servidor trabaja en una solicitud antes de devolver una respuesta. Usa este parámetro para reducir el tiempo de espera. Para solicitudes pequeñas y rápidas, como este caso de guardería para perros, establece este valor en 2 s. | |
ShipmentModel |
shipments[] |
Array de objetos (Shipment) |
Es un array de objetos en el que cada objeto representa un perro que se debe recoger o dejar. |
vehicles[] |
Array de objetos (Vehicle) |
Es un array de objetos en el que cada objeto define un vehículo de tu flota. Es donde describes tus recursos, como la camioneta que realiza las recolecciones y las entregas. Debes definir al menos un vehículo para obtener una ruta optimizada. | |
globalStartTime |
Marca de tiempo | Es la fecha y hora más temprana posible para cualquier evento de todo tu modelo. Este parámetro reduce el problema de optimización con el tiempo, lo que es fundamental para realizar cálculos precisos del tráfico y las rutas. En este caso de guardería para perros, establece este valor en la hora más temprana en la que el conductor puede operar la camioneta durante el día, que es las 7:00 a.m. del 13 de febrero de 2024. | |
globalEndTime |
Marca de tiempo | Esta es la fecha y hora más tardías posibles para cualquier evento de todo tu modelo. En este caso de la guardería canina, establece este valor en el momento en que se espera que la camioneta finalice su operación, que es a las 7 p.m. del 13 de febrero de 2024. | |
Shipment |
pickups[] |
Array de objetos (VisitRequest) |
Es una lista de todas las opciones de retiro posibles para el envío. El optimizador elige la mejor opción para resolver tu problema. Para este caso de guardería canina, enumera las ubicaciones de retiro y los períodos que cada propietario proporcionó para cada perro. |
deliveries[] |
Array de objetos (VisitRequest) |
Esta es una lista de todas las opciones de entrega posibles para el envío. El optimizador elige la mejor opción para resolver tu problema. Para este caso de guardería canina, enumera la ubicación de la instalación y el período en el que el conductor debe regresar para el almuerzo de cada perro. | |
label |
string | Es un identificador de un envío específico en tu solicitud. Puedes especificar etiquetas en tu solicitud para que sea más fácil leer la respuesta. Para este caso de guardería canina, usa una cadena descriptiva como "Chihuahua", "Boyero de Berna" o el nombre del perro para que la solución coincida con tu entrada cuando recibas la respuesta de la API. | |
VisitRequest |
arrivalWaypoint[] |
object (Waypoint) |
Es la ubicación de una visita específica en la ruta. Puedes definirlo con coordenadas de latitud y longitud, un ID de lugar o un encabezado. En este caso de guardería para perros, establece este parámetro en la ubicación que proporcionó el propietario para pickups y en la dirección de la guardería para deliveries. |
timeWindows[] |
Array de objetos (TimeWindow) |
Es un array de objetos que definen las restricciones de tiempo para un retiro o una entrega. En este caso, usa este parámetro para definir el período de retiro de cada perro y el período aceptable para dejarlos en la guardería. | |
Vehicle |
startWaypoint[] |
object (Waypoint) |
Es la ubicación de inicio de la ruta del vehículo, definida con coordenadas de latitud y longitud o un ID de lugar. Este parámetro le indica al optimizador dónde debe comenzar la ruta el vehículo. Si no defines este punto de referencia, el optimizador elegirá una de las ubicaciones de retiro o entrega como la ubicación inicial. En este caso de guardería canina, como el conductor comienza el día en las instalaciones de la guardería, usa las coordenadas del parque Dolores Mission. |
endWaypoint[] |
object (Waypoint) |
Es el destino final de la ruta del vehículo, definido con coordenadas de latitud y longitud o un ID de lugar. Este parámetro le indica al optimizador dónde debe finalizar la ruta el vehículo. Si no defines este punto de referencia, el optimizador elegirá uno de los puntos de retiro o entrega como el final de la ruta. Para este caso de guardería de perros, como el conductor debe terminar el día en las instalaciones de la guardería, usa las coordenadas de Mission Dolores Park. | |
costPerHour |
número | Es el costo que se genera por cada hora que se usa un vehículo, independientemente de si está en movimiento o detenido. En este caso de guardería para perros, usa esta fórmula para modelar el salario por hora de un conductor. | |
startTimeWindows[] |
Array de objetos (TimeWindow) |
Este es el período aceptable para que el conductor comience a conducir la camioneta para recoger a los perros por la mañana. | |
endTimeWindows[] |
Array de objetos (TimeWindow) |
Este es el período aceptable para que el conductor termine de conducir la camioneta y la estacione en la guardería para perros. |