[API Optimización] Cómo usar la API de Optimización de rutas

API de optimización Optiroute


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/

Optimización asíncrona


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.


Objetos definidos para el uso de la API

Para interactuar con la API se deben utilizar las estructuras de datos que se describirán a continuación.


Objeto Direcció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.


Propiedad

Tipo

Descripción

Requerido

name

Texto

Nombre identificador de la dirección

Requerido

latitude

Número decimal con máximo 10 decimales 

Latitud de la coordenada geográfica de la dirección

Requerido

longitude

Número decimal con máximo 10 decimales 

Longitud de la coordenada geográfica de la dirección

Requerido


Objeto Cliente


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.


Propiedad

Tipo

Descripción

Requerido

nombre

Texto

Lista de los clientes del problema a optimizar

Opcional

address

objeto tipo Dirección

Lista de los vehículos del problema a optimizar

Opcional

time_window_start

Hora con formato %H:%M

Hora de inicio de la ventana de tiempo del cliente

Opcional

time_window_end

Hora con formato %H:%M

Hora de término de la ventana de tiempo del cliente

Opcional

delivery_time

Número entero entre 0 y 600

Tiempo de servicio de la entrega por defecto para todos aquellos pedidos que no lo tengan asignado. Cuánto demora el conductor en entregar el servicio

Opcional

demand

Número entero

Corresponde a la demanda de la visita. Corresponde a cualquier unidad que se desee aplicar, que coincida con la capacidad del vehículo. Está opción es utilizada para la configuración use_capacity

Opcional

priority

Número entero

Corresponde a la prioridad que se le desea dar a la visita respecto a otras. El número mayor es más prioritario que uno menor. 

Opcional

skills

Arreglo de Textos

Corresponde a la lista de habilidades asignadas a la visita. Esto indica que para esta visita serán considerados sólo los vehículos que tenga asignado alguna de las habilidades asignadas

Opcional

precio

Número entero

Corresponde al precio asignado a la visita. Está opción es utilizada para la configuración use_profitability_percentage 

Opcional


Objeto Bodega


El objeto Dirección corresponde a un hash con la información necesaria para definir una bodega para el objeto Vehículo. A continuación se detallan las propiedades del objeto.

Propiedad

Tipo

Descripción

Requerido

name

Texto

Nombre identificador de la bodega

Requerido

address

Objeto Dirección

Dirección de la bodega

Requerido


Objeto Vehículo


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.


Propiedad

Tipo

Descripción

Requerido

name

Texto

Nombre identificador del vehículo

Opcional

driver

Texto

Lista de los vehículos del problema a optimizar

Opcional

start_warehouse


objeto tipo Bodega

Bodega de inicio de la ruta

Opcional

end_warehouse


objeto tipo Bodega

Bodega de término de la ruta

Opcional

capacity

Número entero

Capacidad total del vehículo. Está opción es utilizada para la configuración use_capacity

Opcional

break_start

Hora con formato %H:%M

Hora de inicio del descanso del conductor

Opcional

break_end

Hora con formato %H:%M

Hora de término del descanso del conductor

Opcional

route_skills

Arreglo de Textos

Corresponde a la lista de habilidades asignadas al vehículo. Las visita que tengan los mismas habilidades serán consideradas

Opcional

speed_factor

Número decimal entre 0.5 y 1.5

Factor de velocidad aplicado al tiempo o distancia estándar entre puntos

Opcional

shift_start

Texto con formato %H:%M

Hora de inicio del turno del conductor. Debe coincidir dentro del rango de tiempo de la planificación

Opcional

shift_end

Texto con formato %H:%M

Hora de término del turno del conductor. Debe coincidir dentro del rango de tiempo de la planificación

Opcional

cost

Número entero

Costo operacional del vehículo

Opcional


Objeto Configuración


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. 


Propiedad

Tipo

Descripción

Valor por defecto

Requerido

name

Texto de largo máximo 255 caracteres

Nombre de la optimización. Referencia para el cliente

Requerido

departure_date

Texto con formato %Y-%m-%d

Fecha establecida para realizar la ruta

Requerido

start_time

Texto con formato %H:%M

Hora de inicio de las rutas en la fecha configurada

Requerido

end_time

Texto con formato %H:%M

Hora de término de las rutas en la fecha configurada

Requerido

optimization_type

Texto ‘Distance’ o ‘Time’

Variable a optimizar

‘Time’

Opcional

speed_factor

Número decimal entre 0.5 y 1.5

Factor de velocidad aplicado al tiempo o distancia estándar entre puntos

1.0

Opcional

delivery_time

Número entero entre 0 y 600

Tiempo de servicio de la entrega por defecto para todos aquellos pedidos que no lo tengan asignado. Cuánto demora el conductor en entregar el servicio

5

Opcional

use_load_balance

Booleano

Buscar soluciones que posean carga similar entre los vehículos asignados al problema

False

Opcional

use_time_balance

Booleano

Buscar soluciones que utilicen un tiempo total similar entre los vehículos asignados al problema

False

Opcional

use_distance_balance

Booleano

Buscar soluciones que utilicen un tiempo total similar entre los vehículos asignados al problema

False

Opcional

minimize_fleet

Booleano

Buscar soluciones que utilicen la menor cantidad de vehículos asignados al problema

True

Opcional

force_use_all_vehicles

Booleano

Buscar soluciones que utilicen todos los vehículos asignados al problema

False

Opcional

use_time_windows

Booleano

Utilizar o no la configuración de ventanas de tiempos ingresadas para los clientes

True

Opcional

use_capacity

Booleano

Utilizar o no la configuración de capacidades de vehículos y demanda de clientes asignados al problema

True

Opcional

optimize_start_time

Booleano

Sí es True el algoritmo se encarga de definir la hora de inicio apropiada para cada vehículo, dentro del rango de horas configurado

False

Opcional

search_time

Número entero

Tiempo de búsqueda en minutos asignado para el problema. Si no es definido tiempo de búsqueda sugerido será utilizado

False

Opcional

use_quick_optimization

Booleano

Esta opción entrega la primera solución que cumpla con todas las restricciones ingresadas. Probablemente existan mejoras soluciones si asignas más tiempo

False

Opcional

maximum_waiting_time

Número entero 

Tiempo máximo que un vehículo puede esperar para iniciar el viaje a un punto. Es posible que la solución encontrada asigne esperas para cumplir con ciertas ventanas de tiempo

Opcional

fleet_kind

Número entero 

Define el tipo de flota para el problema. 0 para vehículos motorizados, 1 para bicicletas

0

Opcional

use_open_routes

Booleano

Si es True el punto final de todas las rutas será cualquiera de los puntos de visita. Si es False debe volver a la bodega configurada

False

Opcional

merge_service_times

Booleano

Si es True combina el tiempo de servicio de todas las visitas que son en un mismo punto geográfico (igual latitude y longitude)

False

Opcional

same_address_in_same_vehicle

Booleano

Si es True busca soluciones que asignen al mismo vehículo todas las visitas que son en un mismo punto geográfico (igual latitude y longitude)

False

Opcional

use_costs

Booleano

Si es True busca soluciones que consideren la minimización de los costos totales de los vehículos ingresados al problema

False

Opcional

use_profitability_percentage


Booleano

Si es True busca soluciones que consideren el precio total mínima de los pedidos del camión para ser asignados 

False

Opcional


Objeto Entrada de Optimización


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.


Propiedad

Tipo

Descripción

Requerido

customers

lista de objetos tipo Clientes

Lista de los clientes del problema a optimizar

Opcional

vehicles

lista de objetos tipo Vehicles

Lista de los vehículos del problema a optimizar

Opcional

configuration

objeto tipo Configuración

Configuración utilizada para optimizar el problema

Opcional


Objeto Destino


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.


Propiedad

Tipo

Descripción

Presente

order

Número mayor o igual a 0

Orden del destino en la ruta

Siempre

arrival

Fecha con formato %Y-%m-%dT%H:%M:%S%z

Lista de todos los destinos considerados en la ruta de la solución

Siempre

demand

Número

Demanda configurada en el destino

Opcional

name

String

Identificador del objeto Cliente que será entregado en este destino. Si el Waypoint corresponde a un descanso su nombre será “break”. El destino de inicio y el destino de finalización no contienen nombre

Opcional

customer_order

Número mayor a 0

Corresponde al orden de cliente de la ruta, esto es sin considerar a los destinos de tipo “break” ni la bodega de inicio y finalización, comenzando de 1

Opcional

travel_duration

Número

Duración del viaje desde el destino anterior al actual

Opcional

service_duration

Número

Duración del tiempo de servicio en el destino

Opcional


Objeto Ruta


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.


Propiedad

Tipo

Descripción

Presente

vehicle

String

Identificador del vehículo utilizado para esta ruta. Es el mismo que el ingresado en el objeto tipo Vehículo

Siempre

distance

Número

Distance recorrida la ruta

Siempre

duration

Número

Duración de la ruta

Siempre

waypoints

Lista de objetos Destino

Lista de todos los destinos considerados en la ruta de la solución

Siempre


Objeto Solución


Este objeto contiene la solución al problema de enrutamiento ingresado. A continuación se detallan las propiedades del objeto.


Propiedad

Tipo

Descripción

Presente

routes

Lista de objetos Ruta

Lista de las rutas consideradas en la solución

Siempre

total_distance

Número

Distancia total recorrida por todas las rutas

Siempre

total_duration

Número

Duración total de todas las rutas utilizadas. Corresponde al rango entre la hora de inicio más temprana y la hora de término más tarde entre las rutas de la solución

Siempre


Objeto Respuesta de Optimización


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.


Propiedad

Tipo

Descripción

Presente

reference

String de 6 caracteres de largo

Texto con el identificador de la optimización ingresada.

Siempre

id

Número

Número interno de identificación de la optimización

Siempre

raw_request

objeto tipo Entrada de Optimización

objeto ingresado para la creación de la optimización

Siempre

solution

objeto tipo Solución

objeto creado en la optimización del problema

Opcional


Creación de Optimizaciones


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"
      ]
    }
  ]
}

Inicio de la Optimización


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/

Estado de la Optimización


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.