La API de optimización Optiroute permite integrar la optimización de rutas a tu propia plataforma sin necesidad de usar la interfaz de Optiroute.
Esta API es agnóstica respecto a la información de pedidos, es decir no es necesario tener pedidos integrados en Optiroute para utilizarla.
La API de optimización funciona en base al siguiente endpoint:
https://app.optiroute.cl/api/optimizations/
Según la teoría de complejidad computacional, encontrar la solución óptima para un problema de ruteo de flotas es del tipo NP-Duro, lo que quiere decir que solo cuando la cantidad de vehículos y destinos es relativamente pequeña, es posible encontrar la solución efectivamente más corta comparando todas las soluciones posibles entre ellas. Pero para encontrar la solución óptima de un problema relativamente grande (con muchos pedidos y vehículos asignados) podría tomar un tiempo demasiado largo, lo que es productivamente inviable. Es por esto que para encontrar soluciones en un tiempo razonable es necesario utilizar métodos o meta-heurísticas que permiten buscar la solución óptima sin tener que analizar una por una todas las soluciones posibles, y así acercarse de mejor manera al óptimo en un tiempo controlado, sin garantizar necesariamente que la solución encontrada sea la mejor.
Para dar soporte a tiempos de búsqueda que superan el tiempo límite de espera de llamadas sobre Internet es que utilizamos una arquitectura asíncrona compuesta por llamadas REST para la creación del problema, el inicio de la optimización del problema y para la obtención del estado del problema ingresado.
De esta manera la API de optimización de Optiroute da soporte tanto a problemas de baja complejidad como a aquellos que requieren de mucho tiempo de búsqueda, todo bajo el mismo esquema de información.
Para interactuar con la API se deben utilizar las estructuras de datos que se describirán a continuación.
El objeto Dirección corresponde a un hash con la información necesaria para definir una dirección tanto para el objeto Cliente como el objeto Vehículo.
A continuación se detalla el contenido del objeto.
El objeto Cliente del input corresponde a un hash de todos los puntos de visitas de las rutas. A continuación se detallan las propiedades del objeto.
El objeto Vehículo del input corresponde a un hash con la información de determinado vehículo agregado al problema. A continuación se detallan las propiedades del objeto.
Este objeto corresponde a la configuración utilizada para optimizar los datos ingresados y obtener las rutas de despacho necesarias.
A continuación se detallan todas las opciones de configuración disponibles. Estas son las mismas que se utilizan en la plataforma web Optiroute.
Este objeto corresponde a los datos que deben ser añadidos a la llamada para la creación de un objeto de Optimización. Está compuesto por tres objetos de tipo JSON, Configuración, Cliente y Vehículo. A continuación se detallan las propiedades del objeto.
Este objeto define un destino en alguna de las rutas de la solución al problema de optimización ingresado. A continuación se detallan las propiedades del objeto.
Este objeto define una de las rutas obtenidas en la solución del problema de optimización ingresado. A continuación se detallan las propiedades del objeto.
Este objeto contiene la solución al problema de enrutamiento ingresado. A continuación se detallan las propiedades del objeto.
Este objeto corresponde a los datos que el endpoint de creación de pedidos responde cuando la optimización fue creada correctamente. A continuación se detallan las propiedades del objeto.
Para agregar un problema de optimización a través de la API de Optiroute debes realizar una llamada tipo POST en el endpoint de la API añadiendo a ella el objeto tipo Entrada de Optimización que deseas crear.
Cuando ingreses una optimización en el endpoint de creación, si la información fue correctamente validada devolverá inmediatamente un objeto de tipo Respuesta de Optimización.
Un ejemplo de un input completo para crear un objeto optimización corresponde al siguiente:
{
"configuration": {
"name": "Test",
"departure_date": "2019-12-07",
"start_time": "09:00",
"end_time": "18:00",
"optimization_type": "distance",
"speed_factor": 1,
"delivery_time": 10,
"use_load_balance": false,
"use_time_windows": true,
"use_capacity": true,
"optimize_start_time": false,
"use_exhaustive_search": false,
"exhaustive_search_time": 1
},
"customers": [
{
"name": "Optiroute HQ",
"address": {
"name": "Bascuñan 1556 Viña del Mar",
"address": "Bascuñan 1556 Viña del Mar",
"latitude": -33.0281222,
"longitude": -71.5807181
},
"demand": 1,
"priority": 0,
"skills": [
"Skill A"
]
},
{
"name": "Rand norte",
"address": {
"name": "8 Nte. 313, Viña del Mar",
"address": "8 Nte. 313, Viña del Mar",
"latitude": -33.0145786,
"longitude": -71.5568975
},
"demand": 1,
"priority": 0,
"skills": [
"Skill B"
]
},
{
"name": "Rand oriente",
"address": {
"name": "1 Ote. 1244, Viña del Mar",
"address": "1 Ote. 1244, Viña del Mar",
"latitude": -33.0098962,
"longitude": -71.5496237
},
"demand": 1,
"priority": 0
},
{
"name": "Rand latlong",
"address": {
"name": "Rand sur",
"address": "Rand sur",
"latitude": -33.0282161,
"longitude": -71.5784855
},
"delivery_time": 20,
"demand": 1,
"priority": 0,
"skills": [
"Skill A"
]
}
],
"vehicles": [
{
"name": "Auto 1",
"driver": "Auto 1",
"start_warehouse": {
"name": "Arlegui 441 Viña del Mar",
"address": {
"name": "1 Ote. 1244, Viña del Mar",
"address": "1 Ote. 1244, Viña del Mar",
"latitude": -33.0284449,
"longitude": -71.5528639
}
},
"end_warehouse": {
"name": "Arlegui 4 Viña del Mar",
"address": {
"name": "Arlegui 441 Viña del Mar",
"address": "Arlegui 441 Viña del Mar",
"latitude": -33.0232505,
"longitude": -71.5583657
}
},
"capacity": 100,
"break_start": "12:00",
"break_end": "12:30",
"route_skills": [
"Skill B"
]
}
]
}
Que nuestra API de optimización sea asíncrona permite que la creación de objetos optimizaciones sea independiente del inicio del procesamiento de la misma y de la obtención del resultado. Esto quiere decir que puedes elegir cuándo comenzar a procesar una optimización previamente creada, y que puedes obtener el estado de la optimización en cualquier momento.
Una vez creado objeto optimización el endpoint retornará un número de referencia “reference” con el cual puedes iniciar el proceso de optimización haciendo un POST a la siguiente endpoint:
https://app.optiroute.cl/api/v1/optimizations/{reference}/long_optimize/
Luego de que inicies la optimización de tu objeto recién creado puedes obtener el estado de la misma ingresando su código de referencia en el siguiente endpoint.
https://app.optiroute.cl/api/optimizations/{reference}/
Cuando la optimización haya sido resuelta este endpoint retornará un objeto de tipo Entrada de Optimización con la propiedad solution definida.