a vrptw for pharmaceutical distribution hecho por
TRANSCRIPT
1
A VRPTW FOR PHARMACEUTICAL DISTRIBUTION
HECHO POR:
CAMILA ANDREA ARIAS ALFONSO
JULIANA MICHELLE BULLA CORZO
UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERIA
PROGRAMA: INGENIERIA INDUSTRIAL
BOGOTÁ D.C
FEBERO DE 2021
2
1.TITULO .......................................................................................................................................... 4
A VRPTW FOR PHARMACEUTICAL DISTRIBUTION .......................................................... 4
2.RESUMEN ...................................................................................................................................... 4
3.ABSTRACT .................................................................................................................................... 5
4.INTRODUCCIÓN .......................................................................................................................... 5
5.OBJETIVO GENERAL ................................................................................................................ 6
7. METODOLOGÍA ........................................................................................................................ 7
8.DIAGNOSTICO ............................................................................................................................. 7
9.ANALISIS DE INVESTIGACION ............................................................................................... 9
10.APLICACIÓN DEL MODELO ................................................................................................ 11
10.1 Puntos Aleatorios..................................................................................................................... 11
10.2 Capacidad del vehículo ........................................................................................................... 12
11.RESULTADOS ........................................................................................................................... 13
12.DISCUSIÓN ................................................................................................................................ 15
13.LIMITACIONES ....................................................................................................................... 15
14.CONCLUSIONES ...................................................................................................................... 16
15.AGRADECIMIENTO ............................................................................................................... 16
16.BIBLIOGRAFIA ........................................................................................................................ 18
17.ANEXOS ..................................................................................................................................... 20
Anexo 1. ............................................................................................................................................ 20
Anexo 2. ............................................................................................................................................ 21
Tabla de Figuras
Figura 1. Diagrama de Ishikawa (causa y efecto) ................................................................................ 7
Figura 2. Pirámide Poblacional de Bogotá D.C ................................................................................. 10
Figura 3. Puntos aleatorios generados por QGIS en Bogotá D.C ...................................................... 11
Figura 4. Cálculo de unidades de morfina para una moto ................................................................ 12
Figura 5. Resultados código Python .................................................................................................. 20
Figura 6. Matriz de VRP en Excel ....................................................................................................... 21
3
Figura 7. Error en Solver de VRP ........................................................................................................ 21
Tabla de Tablas
Tabla 1. Solicitud de medicamentos a domicilio ................................................................................ 8
Tabla 2. Tasa Ajustada de Incidencia por sexo en cáncer, Colombia 2007-2011 ............................... 9
Tabla 3. Resultados obtenidos por VRP en Python ........................................................................... 13
4
Facultad de Ciencias Naturales e Ingeniería
Programa de Ingeniería Industrial
Proyecto de grado
Trabajo de información para la investigación.
1.TITULO
A VRPTW FOR PHARMACEUTICAL DISTRIBUTION
Arias Alfonso, Camila Andrea 1. Bulla Corzo Juliana Michelle 2.
[email protected] 1. [email protected] 2.
2.RESUMEN
Debido a la actual crisis sanitaria que estamos atravesando en el país el servicio de las eps
con sus operadores logísticos han aumentado la demanda de domicilios de medicamentos
como la morfina, para mitigar el flujo de personas de la tercera edad que sufren enfermedades
como el cáncer de próstata, teniendo como consecuencia una entrega tardía de los domicilios,
incumpliendo el tiempo estipulado según la resolución 1406 de 2013 y afecta directamente a
los hombres que ya están en la etapa madura de dicha enfermedad, enfocándonos en la ciudad
de Bogotá.
El objetivo de esta investigación es mejorar el tiempo de distribución de transporte
implementando un modelo logístico que permita conocer la ruta optima y la cantidad de
vehículos necesarios.
En el desarrollo de la investigación se utilizó el modelo clásico de VRP (Vehicle Route
Problem) o más conocido como el Ruteo de Vehículo que diseña la ruta optima a partir de
un depósito del que sale cada vehículo, luego de visitar una sola vez a los clientes para
satisfacer su demanda conocida, sin violar la capacidad de carga de los vehículos, respetando
el horario de trabajo: todo esto con el fin de encontrar el menor tiempo posible.
Al implementar el modelo se obtuvo como resultado que se necesitan 18 vehículos para
distribuir 615 medicamentos en un día, optimizando en un 80% el tiempo de entrega y
generando la mejor ruta posible.
Palabras clave:
5
Optimizar, Ruteo de Vehículos, transporte, tiempo, morfina.
3.ABSTRACT
Due to the current health crisis that we are going through in the country, the health service
with its logistics operators have increased the demand for medicines such as morphine at
home, to mitigate the flow of old people suffering from diseases such as cancer of prostate,
as a result in a late delivery of homes, indeed not complying with the time stipulated
according to resolution 1406 of 2013 and directly affects men who are already in the mature
stage of this disease, this is focusing on Bogotá city.
The objective of this research is to improve the transport distribution time by implementing
a logistics model that allows knowing the best route and the number of necessary vehicles.
In the development of the research, the classic model of VRP (Vehicle Route Problem) or
better known as Vehicle Routing was used, which designs the optimal route from a deposit
from which each vehicle leaves, after visiting the vehicles only once. Customers to meet their
known demand, without infringe upon the load capacity of the vehicles, while respecting the
working hours: all this in order to find the shortest time possible.
When the model was implementing, the result was that 18 vehicles are needed to distribute
615 drugs in one day, optimizing delivery time by 80% and generating the best possible route.
Key words: Optimize, vehicle route, transport, time, morphine.
4.INTRODUCCIÓN
En la actualidad con el nuevo virus (covid-19) los colombianos nos enfrentamos a
una dura crisis tanto económica como de salud, que son las principales fuentes que se han
visto afectadas a lo largo de la pandemia. En Colombia los pacientes con cáncer de próstata
son los más perjudicados desde el inicio de la pandemia, ya que anteriormente mediante sus
EPS tratan su enfermedad con medicamentos suministrados por diferentes vías como la vía
intravenosa y en otros casos se les suministran medicamentos vía oral, que son medicamentos
que se tienen que ingerir de forma constante y el paciente normalmente se dirige a la farmacia
asignada por su eps a que le suministren la entrega de los mismos.
6
Con la crisis sanitaria por la que atraviesa el país los pacientes con cáncer de próstata que
están afiliados a la Eps Sanitas tienen la opción de pedir su medicamento a domicilio a través
del operador logístico y distribuidor de Sanitas que es droguerías Cruz Verde, ellos tardan 5
días calendario en hacer la entrega de estos medicamentos. Esto se debe al aumento de los
domicilios por parte de las farmacias y droguerías, especialmente en Bogotá D,C ya que ha
sido una de las principales ciudades más afectadas por el Coronavirus (Covid-29) en
Colombia.
De esta manera vemos cómo se afectan las personas que tienen cualquier tipo de
enfermedad terminal y/o enfermedades crónicas, entre otras. Nos centramos en las personas
con cáncer de próstata ya que directamente ataca al género masculino y se detecta desde los
40 años, pero cuando ya está en tratamiento un hombre se puede considerar que tiene
aproximadamente entre 60-75 años de edad, por esto se entiende que son pacientes de la
tercera edad, es decir, son los más perjudicados.
5.OBJETIVO GENERAL
Mejorar el tiempo, la distribución y transporte de la morfina en pacientes con
cáncer de próstata e implementar un modelo desde la ingeniería industrial que permita
conocer el número de vehículos y el tiempo que tarda cada uno en entregar el
medicamento en la ciudad de Bogotá D.C, para así cumplir con lo establecido según
la resolución 1406 del 2013.
6.OBJETIVOS ESPECIFICOS
• Identificar las fallas que hay en el servicio de distribución de medicamentos por parte
de la eps sanitas y su operador cruz verde.
• Establecer el modelo logístico óptimo para el desarrollo de la investigación.
• Definir la capacidad de carga del vehículo seleccionado teniendo en cuenta las
especificaciones.
7
7. METODOLOGÍA
En este proyecto de investigación se optó por utilizar el modelo clásico de VRP
(vehicle route problem), según Unisolution News “describe el diseño de rutas donde a partir
de un depósito del que sale cada vehículo y luego de visitar una sola vez a los clientes para
satisfacer su demanda conocida, sin violar la capacidad de carga de los vehículos, respetando
el horario de trabajo: todo esto con el fin de encontrar el menor tiempo posible”
(Unisolutions,2016).
8.DIAGNOSTICO
Figura 1. Diagrama de Ishikawa (causa y efecto)
Fuente: propia
En el diagrama de Ishikawa o más conocido como espina de pescado, podemos
identificar las diferentes causas que generan fallas en la entrega de medicamentos como la
morfina de droguerías Cruz Verde, tales como el mal manejo en el tiempo de entrega, debido
a que los usuarios deben esperar lo establecido que son cinco días calendario, como se
8
observa en la imagen 1 donde al finalizar el proceso de solicitud de domicilio aparece el
mensaje al cliente.
Tabla 1. Solicitud de medicamentos a domicilio
Fuente: https://www.youtube.com/watch?v=Xq4FYjbbKRY&feature=emb_title
Otra de las causas es la actual crisis sanitaria que ha generado el Covid-19 ya que esto obligó
a los usuarios a un confinamiento estricto y aumentó la demanda del servicio de domicilios,
teniendo en cuenta la prioridad que la eps estableció para las personas de la tercera edad
siendo estas las más afectadas por el virus, y además, según (American Cancer Society,2020)
“Alrededor de 6 de 10 casos se diagnostican en hombres de 65 años o más, y en pocas
ocasiones se presenta en hombres menores de 40 años. La edad media en el momento del
diagnóstico es aproximadamente 66 años.”
También se tienen quejas de usuarios por el mal servicio de los domicilios. Según el
Heraldo, “Regina Donado, una mujer de 77 años de edad, y quien, por no poder salir por la
pandemia, envió a un punto de la droguería Cruz Verde a un mensajero para que le reclamara
unos medicamentos. Regina Donado dice “A mí la EPS Colsanitas me da las medicinas, yo
tengo una enfermedad pulmonar obstructiva crónica, la cual me afecta la presión, los
triglicéridos y el colesterol”. Ha pasado una semana y nunca le llegó el medicamento a
domicilio. Con preocupación dijo que Colsanitas y Cruz Verde “están colapsadas y no están
dando abasto con sus pacientes”.”(Carrillo S,2020).
9
9.ANALISIS DE INVESTIGACION
Una vez realizado el diagnostico se procede a realizar un análisis de los datos que se
encontraron para desarrollar el modelo.
Según las estadísticas del Observatorio Nacional de Cáncer del Ministerio de Salud, el tipo
de cáncer con mayor tasa de incidencia es el Cáncer de Próstata en hombres, con
aproximadamente 47 personas por cada 100,000 hombres. (Minsalud,2018)
Tabla 2. Tasa Ajustada de Incidencia por sexo en cáncer, Colombia 2007-2011
Fuente: Instituto Nacional de Cancerología. Incidencia, mortalidad y prevalencia de Cáncer
en Colombia. 2007-2011.
Se obtuvo por medio de la pirámide poblacional de Bogotá D.C para el año 2020 el
número de hombres que hay en la capital por edades, donde se observa que hay 1´324,280
hombres desde los 40 años hasta más de los 80 años.
10
Figura 2. Pirámide Poblacional de Bogotá D.C
Fuente: Observatorio de Salud de Bogotá
https://saludata.saludcapital.gov.co/osb/index.php/datos-de-
salud/demografia/piramidepoblacional/
Una vez obtenido los datos de la tasa de incidencia de Cáncer de próstata y el número
de hombres según la pirámide poblacional de Bogotá, se realiza un cálculo para conocer la
población real de los hombres que padecen esta enfermedad, de 1´324,280 hombres desde
los 40 años hasta más de 80 años.
100,000 ℎ𝑜𝑚𝑏𝑟𝑒𝑠 − − − −−→ 46,5
1´324,280 ℎ𝑜𝑚𝑏𝑟𝑒𝑠 − − − −→ 𝑥
1´324,280 ∗ 46,5 = 61,579,020
61,579,020
100,000= 615,7902 ≈ 616 ℎ𝑜𝑚𝑏𝑟𝑒𝑠
X= 616 Hombres que padecen de Cáncer de próstata en la ciudad de Bogotá.
11
Por esta razón, para aplicar el modelo de Ruteo de Vehículos nuestra demanda total
será de 615 medicamentos de morfina para distribuirlos en la capital.
10.APLICACIÓN DEL MODELO
Para la aplicación del modelo se debe conocer la demanda total, latitud y longitud de
cada uno de los puntos por usuario. También, se debe conocer la velocidad máxima dentro
de la ciudad para el vehículo a utilizar, la capacidad y dimensiones de unidades de
medicamento que puede cargar el vehículo, respetando el horario laboral de 8 horas diarias
del transportador.
10.1 Puntos Aleatorios.
Con la herramienta de QGIS se identifica el depósito que será en la Localidad de
Puente Aranda donde partirán los vehículos a distribuir el medicamento, y a partir de este
depósito se generan los puntos aleatorios con la herramienta mencionada, esta a su vez nos
muestra en el mapa los 616 puntos (latitud y longitud) como se muestra en la imagen 2.
Figura 3. Puntos aleatorios generados por QGIS en Bogotá D.C
Fuente: Propia
Para llevar a cabo la programación del modelo ruteo de vehículos se utilizó el servidor
de Google colaboratory en Python.
12
10.2 Capacidad del vehículo
Para conocer las dimensiones del vehículo debemos tener en cuenta que se escogió el
transporte motorizado que resulta más eficaz, ya que según la secretaria de movilidad “A
partir de la expedición del Decreto 126 del 10 de mayo de 2020, la Alcaldía Mayor de Bogotá
establece como límite máximo de velocidad en la ciudad en cincuenta kilómetros por hora
(50 km/h) para la circulación” con la excepción de “Zonas con límite de 30 km/hora: - Las
zonas residenciales. - Las zonas escolares.”, (MovilidadBogotá,2021) esto hace que el tiempo
de entrega sea óptimo. Una moto domiciliaria tiene una capacidad máxima de peso de 15 kg
y las dimensiones del contenedor convencional (maletero) son de 45 cm x 50 cm x 48 cm.
También se debe conocer las dimensiones de la caja de morfina a distribuir las cuales
son 6,5 cm x 5 cm x 3,8 cm que contiene un frasco de 30 ml. A continuación, se muestra el
cálculo de la capacidad máxima de unidades que la moto puede transportar con la ayuda de
easycargo3d.com.
Figura 4. Cálculo de unidades de morfina para una moto
13
Fuente: Propia
Como resultado se obtuvo, que para una moto con capacidad de peso de 15 kg se
puede cargar un máximo de 500 unidades de morfina. Sin embargo, se espera que con la
ayuda del modelo se conozca la cantidad necesaria de motos para distribuir las 615 cajas, en
el menor tiempo posible con una ventana de tiempo de 8 horas, las cuales corresponden a la
jornada laboral del transportador.
11.RESULTADOS
A continuación, se muestran en la tabla1 los resultados de la programación del modelo
de VRP, donde ilustra la cantidad de vehículos a utilizar, la distancia que recorre cada uno,
las unidades a distribuir y el tiempo recorrido en minutos diarios (480 min-Jornada laboral).
Tabla 3. Resultados obtenidos por VRP en Python
Fuente: propia
14
Como ejemplo, se muestra a continuación el resultado del ruteo para el primer vehículo.
0 Load(0) Time(0,0) -> 145 Load(0) Time(200,202) -> 226 Load(1)
Time(208,210) -> 570 Load(2) Time(220,222) -> 271 Load(3)
Time(227,229) -> 240 Load(4) Time(235,237) -> 480 Load(5)
Time(247,249) -> 308 Load(6) Time(261,263) -> 315 Load(7)
Time(281,283) -> 133 Load(8) Time(290,292) -> 0 Load(9)
Time(478,480)
Distance of the route: 213km
Load of the route: 9
Time of the route: 478
Este vehículo visitó 9 clientes recorriendo la distancia de 213 Km y un tiempo en ruta de 478
minutos. Como puede verse en la gráfica a continuación.
Figura 4. Mapa de ruta aleatoria
1. Para cumplir la demanda de 615 unidades de morfina se requieren un total de 18
motos, que recorren diariamente 2418 Km respetando la jornada laboral de 8
horas, también se tiene en cuenta que el transportador cuenta con un tiempo de
entrega de 5 minutos por cada cliente.
2. Gracias al modelo de VRP se logra conocer el tiempo recorrido por cada uno de
los vehículos logrando entregar la demanda conocida en un día y así se reduce el
tiempo en un 80%.
3. Se logró obtener la ruta óptima para suplir el total de la demanda haciendo uso de
los 18 vehículos.
15
4. Gracias al código de Python se generó una ruta aleatoria para mostrar los puntos
por donde estará el operario haciendo la distribución de morfina en un día laboral.
12.DISCUSIÓN
• Es evidente que en el servicio de la eps Sanitas y su operador logístico cruz verde hay
situaciones como el mal manejo del tiempo de entrega, la alta demanda de servicios
a domicilio y lo más importante, pandemia de Covid-19; lo cual genera una
problemática en la distribución de los medicamentos disminuyendo la calidad del
servicio.
• Se logró establecer que el ruteo de vehículos (VRP) es el modelo óptimo para llevar
a cabo nuestra investigación, a través de la herramienta de programación Python que
según Akademus “usa un lenguaje de escritura rápido, escalable, robusto y de código
abierto, el cual permite plasmar ideas complejas con pocas líneas de código
mostrándonos los resultados necesarios” (Soloaga A,2018).
• El aplicativo Easycargo 3D fue una herramienta clave para el desarrollo del modelo,
ya que nos permitió calcular de una manera más rápida la capacidad de carga del
vehículo a utilizar.
• Se recomienda que el vehículo a usar (motocicletas) sea contratado o subcontratado
por otra empresa, ya que es más económico que comprar una flota de vehículos nueva.
13.LIMITACIONES
16
Una de las grandes limitaciones que se tuvo fue la creación del modelo en una de las
herramientas ofimáticas más utilizadas que es Excel, ya que al resolver el modelo por solver
no se obtuvo resultado debido a que la matriz superaba el tamaña permitido.
También limitó la investigación el confinamiento obligatorio debido a la pandemia, razón
por la que solo se tenía acceso a información de la web, reduciendo el proyecto a fuentes
secundarias.
14.CONCLUSIONES
1. Se concluye de la investigación que se puede aplicar el modelo en cualquier
empresa que cumpla la función de distribuir algún producto u ofrecer un servicio
para poder incrementar la calidad del mismo, respetando horarios laborales,
capacidad de carga del vehículo a usar, logrando optimizar tiempo y buscar la
mejor ruta posible.
2. Actualmente en el proceso de distribución de Cruz Verde han priorizado a los
usuarios de la tercera edad, personas con enfermedades terminales y personas
reportadas con Covid-19; con la ayuda de nuestro modelo se puede garantizar un
80% de mejora en el cumplimiento de la entrega de medicamentos a los usuarios.
15.AGRADECIMIENTO
17
El agradecimiento de este proyecto va dirigido a Jorge Iván Romero Gelves, director
de este proyecto, que gracias a sus conocimientos y ayuda nos permitió concluir con éxito
la investigación y poder finalizar nuestro ciclo académico de pregrado.
18
16.BIBLIOGRAFIA
• A. (2020). factores de riesgo para el cáncer de próstata. American Cancer Society.
https://www.cancer.org/es.html
• Carrillo, S. (2020, 5 julio). Continúan quejas de usuarios por mala atención de las
EPS. El Heraldo. https://www.elheraldo.co/barranquilla/continuan-quejas-de-
usuarios-por-mala-atencion-de-las-eps-739991
• Entrega de Medicamentos EPS a domicilio. (2020). Cruz Verde.
http://blog.cruzverde.com.co/seccion/usuarios-eps/servicio-domicilio-
medicamentos-eps.html
• Guerrero, H. (2018, abril). mejora en las rutas de entregas de una empresa de
productos farmacéuticos. Universidad Andrés Bello.
http://repositorio.unab.cl/xmlui/bitstream/handle/ria/11804/a129280_Shieh_H_Mej
ora_en_las_rutas_de_2018_Tesis.pdf?sequence=1&isAllowed=y
• M. (2018). OBSERVATORIO NACIONAL DE CANCER.
https://www.minsalud.gov.co/sites/rid/Lists/BibliotecaDigital/RIDE/VS/ED/GCFI/g
uia-ross-cancer.pdf.
• Ministerio de Salud. (2013). resolución número, o o o 1 6 o 4 de 2013. República de
Colombia.
https://www.minsalud.gov.co/sites/rid/Lists/BibliotecaDigital/RIDE/DE/DIJ/resoluc
ion-1604-de-2013.pdf
• Movilidad Bogotá. (2021). VELOCIDAD MÁXIMA EN EL DISTRITO CAPITAL.
Secretaria de Movilidad.
https://www.movilidadbogota.gov.co/web/preguntas_frecuentes/cuales_son_las_nor
mas_que_determinan_los_limites_maximos_de_velocidad_y_la#:~:text=A%20parti
r%20de%20la%20expedici%C3%B3n,circulaci%C3%B3n%20de%20todos%20los
%20veh%C3%ADculos.
• ¿Sabías que ahora tu EPS debe entregarte los medicamentos en máximo 48 horas?
(2018). URNA DE CRISTAL. https://www.urnadecristal.gov.co/gestion-
gobierno/sab-as-que-ahora-tu-eps-debe-entregarte-medicamentos-en-m-ximo-48-
horas#:~:text=Mediante%20la%20resoluci%C3%B3n%201604%20de,no%20m%C
3%A1s%20de%2048%20horas
19
• Saludata. (2020). Piramide Poblacional Bogotá D.C. Observatorio de Bogotá.
https://saludata.saludcapital.gov.co/osb/index.php/datos-de-
salud/demografia/piramidepoblacional/
• Soloaga, A. (2018). Principales Usos de Python. AKADEMUS.
https://www.akademus.es/blog/programacion/principales-usos-python/
• UNISOLUTIONSNEWS. (2016a). Qué es el VRP y cuáles son sus variantes.
UNISOLUTIONSNEWS. https://unisolutionsnews.wordpress.com/2016/08/22/que-
es-el-vrp-y-cuales-son-sus-variantes/
• Velásquez, Y. (2015). análisis de las características y aplicaciones de los sistemas
de ruteo de vehículos.
https://repository.unimilitar.edu.co/bitstream/handle/10654/13308/An%E1lisis%20d
e%20las%20caracter%EDsticas%20y%20aplicaciones%20de%20los%20sistemas%
20de%20ruteo%20de%20veh%EDculos.pdf;jsessionid=F8C0C286DD3C7DC4E93
AB6B5D0960D97?sequence=1.
• Verde, C. (2020). Entrega de medicamentos a domicilio EPS a domicilio. Blog cruz
verde. http://blog.cruzverde.com.co/seccion/usuarios-eps/servicio-domicilio-
medicamentos-eps.html
20
17.ANEXOS
Anexo 1.
Figura 5. Resultados código Python
Fuente: Propia
Se muestra en la figura 4 parte del código y resultados de programación en Python con el fin
de evidenciar el modelo, se adjunta junto a este documento el pdf del anexo 1.
21
Anexo 2.
Figura 6. Matriz de VRP en Excel
Fuente: Propia
Figura 7. Error en Solver de VRP
Fuente: Propia
Previamente se optó por utilizar la herramienta de solver y una vez ingresados los datos a la
herramienta, excede el limite de variables que es permitido, por tal motivo, es un limitante
para nuestro proyecto. Se adjunta el documento Excel Anexo 2.
22
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 1/18
Collecting ortools Downloading https://files.pythonhosted.org/packages/8f/df/aff5a745ab55d95fcf50ec3c0aa8 |████████████████████████████████| 14.2MB 334kB/s Collecting protobuf>=3.14.0 Downloading https://files.pythonhosted.org/packages/7d/cc/abf8e30629db7a8b15efb79d4c87 |████████████████████████████████| 1.0MB 46.2MB/s Collecting absl-py>=0.11 Downloading https://files.pythonhosted.org/packages/92/c9/ef0fae29182d7a867d203f0eff82 |████████████████████████████████| 133kB 44.9MB/s Requirement already satisfied: six>=1.9 in /usr/local/lib/python3.7/dist-packages (from ERROR: tensorflow-metadata 0.28.0 has requirement absl-py<0.11,>=0.9, but you'll have abInstalling collected packages: protobuf, absl-py, ortools Found existing installation: protobuf 3.12.4 Uninstalling protobuf-3.12.4: Successfully uninstalled protobuf-3.12.4 Found existing installation: absl-py 0.10.0 Uninstalling absl-py-0.10.0: Successfully uninstalled absl-py-0.10.0 Successfully installed absl-py-0.12.0 ortools-8.2.8710 protobuf-3.15.6
pip install ortools
pip install routingpy
Collecting routingpy Downloading https://files.pythonhosted.org/packages/96/70/d28851f2a39cc1a8629afae8f65f |████████████████████████████████| 81kB 3.5MB/s Requirement already satisfied: requests<3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-pRequirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packagRequirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (fRequirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/libRequirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packaInstalling collected packages: routingpy Successfully installed routingpy-0.3.2
a=[]plan=[]grafica=[]graph_output = []
pip install pycristoforo
Collecting pycristoforo Downloading https://files.pythonhosted.org/packages/fd/7a/3ae7fe1692c53a680273683b9949 |████████████████████████████████| 8.0MB 5.8MB/s Installing collected packages: pycristoforo Successfully installed pycristoforo-2.0.0
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 2/18
import numpy as npfrom shapely.geometry import Polygon, Point poly = Polygon([(-74.1281891,4.7427283),(-74.0938568,4.7536769),(-74.0622711,4.7605197 ), ( -74.0512848, 4.7673624 ), ( -74.0361786, 4.7673624 ), ( -74.023819, 4.7632568 ), ( -74.0327454, 4.7434126 ), ( -74.0210724, 4.7331481 ), ( -74.0293121, 4.6982477 ), ( -74.0423584, 4.6729267 ), ( -74.054718, 4.6434985 ), ( -74.0698242, 4.5935361 ), ( -74.0835571, 4.5428858 ), ( -74.0952301, 4.5004463
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 3/18
), ( -74.1151428, 4.4833329 ), ( -74.1254425, 4.5148212 ), ( -74.1254425, 4.5346719 ), ( -74.141922, 4.554522 ), ( -74.1625214, 4.5668425 ), ( -74.1920471, 4.5791628 ), ( -74.2085266, 4.594905 ), ( -74.2064667, 4.6202288 ), ( -74.2044067, 4.6373389 ), ( -74.1707611, 4.6476048 ), ( -74.1460419, 4.6565018 ), ( -74.1584015, 4.6756642 ), ( -74.1625214,
4 6914043
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 4/18
4.6914043 ), ( -74.1295624, 4.7440969 )]) minx, miny, maxx, maxy = poly.bounds longs = np.arange(minx, maxx, 0.002); lats = np.arange(miny, maxy, 0.002) longs = np.tile(longs,3).ravel(); lats = np.repeat(lats,3).ravel()coords = np.array([(x,y) for x,y in zip(longs,lats)]) points = [Point(xy) for xy in coords] check = [xy.within(poly) for xy in points]pointsInside = coords[check] ranIdx = np.random.choice(len(pointsInside),616,replace=True) result = pointsInside[ranIdx] result
array([[-74.0725266, 4.5913329], [-74.0805266, 4.6513329], [-74.1345266, 4.5693329], ..., [-74.0965266, 4.5833329], [-74.1445266, 4.6293329], [-74.1925266, 4.6133329]])
from __future__ import print_function from functools import partialfrom six.moves import range from ortools.constraint_solver import pywrapcpfrom ortools.constraint_solver import routing_enums_pb2import mathimport timestart_time = time.time()############################ Problem Data Definition ############################ # Locations in block unitdef create_data_model(): """Stores the data for the problem""" data={} # Locations in block unit _locations = result
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 5/18
data['locations'] = _locations data['demands'] = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, data['vehicle_capacity'] = [500,500,500,500,500,500,500,500,500,500,500,500,500,500,500,5 data['num_vehicles'] = 19 data['num_locations'] = len(data['locations']) data['time_windows'] = \ [( 0,0),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480),
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 6/18
( , ),( , ),( , ),( , ), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480),
( 0 480) (0 480) (0 480) (0 480)
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 7/18
( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480),
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 8/18
( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ( 0,480),(0,480),(0,480),(0,480), ] # 15, 16# 15, 16 data['time_per_demand_unit'] = 5 data['vehicle_speed'] = 0.5 # Travel speed: 25km/h converted in m/min data['depot'] = 0 return data ######################## Problem Constraints ######################## def manhattan_distance(position_1, position_2): rad=math.pi/180 lat1=position_1[0] lat2=position_2[0] lon1=position_1[1] lon2=position_2[1] dlat=position_1[0]-position_2[0] dlon=position_1[1]-position_2[1] R=6372.795477598 a=(math.sin(rad*dlat/2))**2 + math.cos(rad*lat1)*math.cos(rad*lat2)*(math.sin(rad*dlon/2) distancia=2*R*math.asin(math.sqrt(a)) return distancia def create_distance_evaluator(data): """Creates callback to return distance between points.""" _distances = {} # precompute distance between location to have distance callback in O(1) for from_node in range(data['num_locations']): _distances[from_node] = {} for to_node in range(data['num_locations']): if from_node == to_node: _distances[from_node][to_node] = 0 else: _distances[from_node][to_node] = (manhattan_distance( data['locations'][from_node], data['locations'][to_node])) def distance_evaluator(manager, from_node, to_node):
"""Returns the manhattan distance between the two nodes"""
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 9/18
Returns the manhattan distance between the two nodes return _distances[manager.IndexToNode(from_node)][manager.IndexToNode( to_node)] return distance_evaluator def create_demand_evaluator(data): """Creates callback to get demands at each location.""" _demands = data['demands'] def demand_evaluator(manager, node): """Returns the demand of the current node""" return _demands[manager.IndexToNode(node)] return demand_evaluator def add_capacity_constraints(routing, data, demand_evaluator_index): """Adds capacity constraint""" capacity = 'Capacity' routing.AddDimensionWithVehicleCapacity( demand_evaluator_index, 0, # null capacity slack data['vehicle_capacity'], True, # start cumul to zero capacity) def create_time_evaluator(data): """Creates callback to get total times between locations.""" def service_time(data, node): """Gets the service time for the specified location.""" return data['demands'][node] * data['time_per_demand_unit'] def travel_time(data, from_node, to_node): """Gets the travel times between two locations.""" if from_node == to_node: travel_time = 0 else: travel_time = manhattan_distance(data['locations'][from_node], data[ 'locations'][to_node]) / data['vehicle_speed'] return travel_time _total_time = {} # precompute total time to have time callback in O(1) for from_node in range(data['num_locations']): _total_time[from_node] = {} for to_node in range(data['num_locations']): if from_node == to_node: _total_time[from_node][to_node] = 0
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 10/18
else: _total_time[from_node][to_node] = int( service_time(data, from_node) + travel_time( data, from_node, to_node)) def time_evaluator(manager, from_node, to_node): """Returns the total time between the two nodes""" return _total_time[manager.IndexToNode(from_node)][manager.IndexToNode( to_node)] return time_evaluator def add_time_window_constraints(routing, manager, data, time_evaluator_index): """Add Global Span constraint""" time = 'Time' horizon = 480 routing.AddDimension( time_evaluator_index, horizon, # allow waiting time horizon, # maximum time per vehicle False, # don't force start cumul to zero since we are giving TW to start nodes time) time_dimension = routing.GetDimensionOrDie(time) # Add time window constraints for each location except depot # and 'copy' the slack var in the solution object (aka Assignment) to print it for location_idx, time_window in enumerate(data['time_windows']): if location_idx == 0: continue index = manager.NodeToIndex(location_idx) time_dimension.CumulVar(index).SetRange(time_window[0], time_window[1]) routing.AddToAssignment(time_dimension.SlackVar(index)) # Add time window constraints for each vehicle start node # and 'copy' the slack var in the solution object (aka Assignment) to print it for vehicle_id in range(data['num_vehicles']): index = routing.Start(vehicle_id) time_dimension.CumulVar(index).SetRange(data['time_windows'][0][0], data['time_windows'][0][1]) routing.AddToAssignment(time_dimension.SlackVar(index)) # Warning: Slack var is not defined for vehicle's end node #routing.AddToAssignment(time_dimension.SlackVar(self.routing.End(vehicle_id))) ############ Printer ############def print_solution(data, manager, routing, assignment): # pylint:disable=too-many-locals """Prints assignment on console""" print('Objective: {}'.format(assignment.ObjectiveValue())) total_distance = 0 total_load = 0 total time = 0
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 11/18
tota _t e 0 capacity_dimension = routing.GetDimensionOrDie('Capacity') time_dimension = routing.GetDimensionOrDie('Time') for vehicle_id in range(data['num_vehicles']): index = routing.Start(vehicle_id) plan_output = 'Route for vehicle {}:\n'.format(vehicle_id) plan_output2 = 'Ruta{}:\n'.format(vehicle_id) distance = 0 while not routing.IsEnd(index): load_var = capacity_dimension.CumulVar(index) time_var = time_dimension.CumulVar(index) slack_var = time_dimension.SlackVar(index) plan_output2 += '{0}->'.format( manager.IndexToNode(index)) plan_output += ' {0} Load({1}) Time({2},{3}) ->'.format( manager.IndexToNode(index), assignment.Value(load_var), assignment.Min(time_var), assignment.Max(time_var), assignment.Min(slack_var), assignment.Max(slack_var)) previous_index = index index = assignment.Value(routing.NextVar(index)) distance += routing.GetArcCostForVehicle(previous_index, index, vehicle_id) load_var = capacity_dimension.CumulVar(index) time_var = time_dimension.CumulVar(index) slack_var = time_dimension.SlackVar(index) plan_output += ' {0} Load({1}) Time({2},{3})\n'.format( manager.IndexToNode(index), assignment.Value(load_var), assignment.Min(time_var), assignment.Max(time_var)) plan_output += 'Distance of the route: {0}km\n'.format(distance) plan_output += 'Load of the route: {}\n'.format( assignment.Value(load_var)) plan_output += 'Time of the route: {}\n'.format( assignment.Value(time_var)) print(plan_output) a.append(plan_output2) total_distance += distance total_load += assignment.Value(load_var) total_time += assignment.Value(time_var) print('Distancia total: {0}km'.format(total_distance)) print('Carga total: {}'.format(total_load)) print('Tiempo total: {0}minutos'.format(total_time)) ######### Main #########def main(): """Entry point of the program""" # Instantiate the data problem.
d t t d t d l()
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 12/18
data = create_data_model() print(data['locations']) # Create the routing index manager manager = pywrapcp.RoutingIndexManager(data['num_locations'], data['num_vehicles'], data['depot']) # Create Routing Model routing = pywrapcp.RoutingModel(manager) # Define weight of each edge distance_evaluator_index = routing.RegisterTransitCallback( partial(create_distance_evaluator(data), manager)) routing.SetArcCostEvaluatorOfAllVehicles(distance_evaluator_index) # Add Capacity constraint demand_evaluator_index = routing.RegisterUnaryTransitCallback( partial(create_demand_evaluator(data), manager)) add_capacity_constraints(routing, data, demand_evaluator_index) # Add Time Window constraint time_evaluator_index = routing.RegisterTransitCallback( partial(create_time_evaluator(data), manager)) add_time_window_constraints(routing, manager, data, time_evaluator_index) # Setting first solution heuristic (cheapest addition). search_parameters = pywrapcp.DefaultRoutingSearchParameters() search_parameters.first_solution_strategy = ( routing_enums_pb2.FirstSolutionStrategy.PATH_CHEAPEST_ARC) # pylint: disable=no-memb search_parameters.local_search_metaheuristic = ( routing_enums_pb2.LocalSearchMetaheuristic.TABU_SEARCH) search_parameters.time_limit.seconds = 30 search_parameters.log_search = True # Solve the problem. assignment = routing.SolveWithParameters(search_parameters) print_solution(data, manager, routing, assignment) if __name__ == '__main__': main()print("--- %s seconds ---" % (time.time() - start_time))a
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 13/18
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-1-21bd68b9e50f> in <module>() 420 421 if __name__ == '__main__': --> 422 main() 423 print("--- %s seconds ---" % (time.time() - start_time)) 424 a
1 frames<ipython-input-1-21bd68b9e50f> in create_data_model() 18 data={} 19 # Locations in block unit ---> 20 _locations = result 21 22
NameError: name 'result' is not defined
SEARCH STACK OVERFLOW
b=a[11]c=b.split("->")d=c[1:] while '' in d: d.remove('')for i in range(0, len(d)): d[i] = int(d[i]) d
[596, 605, 460, 424, 29, 13, 4, 171, 143, 120, 111, 77, 87, 151, 157, 147, 153, 249, 211, 191, 273, 284, 277, 272, 268, 227, 228, 180, 177, 165,
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 14/18
167, 387, 256, 223, 181, 159, 232, 229, 264, 253, 250, 230, 246]
list1 = result.tolist()list1[0]
[-74.07252660000032, 4.591332899999988]
type(list1)
list
ruta= [list1[d] for d in d] ruta.append(list1[0])ruta.insert(0,list1[0])ruta
[[-74.07252660000032, 4.591332899999988], [-74.0765266000003, 4.589332899999988], [-74.08452660000029, 4.587332899999988], [-74.08252660000029, 4.587332899999988], [-74.08452660000029, 4.587332899999988], [-74.0785266000003, 4.589332899999988], [-74.0805266000003, 4.587332899999988], [-74.08852660000028, 4.5853328999999885], [-74.09052660000027, 4.5853328999999885], [-74.09052660000027, 4.5853328999999885], [-74.09252660000027, 4.583332899999989], [-74.09252660000027, 4.583332899999989], [-74.09452660000026, 4.583332899999989], [-74.10252660000025, 4.581332899999989], [-74.10452660000024, 4.579332899999989], [-74.11252660000022, 4.577332899999989], [-74.11452660000022, 4.577332899999989], [-74.1225266000002, 4.57333289999999], [-74.12652660000019, 4.57333289999999], [-74.12652660000019, 4.57333289999999], [-74.13452660000017, 4.56933289999999], [-74.14252660000015, 4.5673328999999905], [-74.14652660000014, 4.565332899999991], [-74.14852660000014, 4.565332899999991],
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 15/18
[-74.15252660000013, 4.563332899999991], [-74.14852660000014, 4.565332899999991], [-74.14452660000015, 4.5673328999999905], [-74.13652660000017, 4.56933289999999], [-74.12852660000019, 4.57133289999999], [-74.13652660000017, 4.56933289999999], [-74.13452660000017, 4.56933289999999], [-74.12652660000019, 4.57333289999999], [-74.1205266000002, 4.57533289999999], [-74.11452660000022, 4.577332899999989], [-74.11652660000021, 4.57533289999999], [-74.11652660000021, 4.57533289999999], [-74.10852660000023, 4.579332899999989], [-74.10252660000025, 4.581332899999989], [-74.09452660000026, 4.583332899999989], [-74.09052660000027, 4.5853328999999885], [-74.09252660000027, 4.583332899999989], [-74.08852660000028, 4.5853328999999885], [-74.08252660000029, 4.587332899999988], [-74.07452660000031, 4.589332899999988], [-74.07252660000032, 4.591332899999988]]
coordinates = [elem[::-1] for elem in ruta]coordinates
[[4.591332899999988, -74.07252660000032], [4.589332899999988, -74.0765266000003], [4.587332899999988, -74.08452660000029], [4.587332899999988, -74.08252660000029], [4.587332899999988, -74.08452660000029], [4.589332899999988, -74.0785266000003], [4.587332899999988, -74.0805266000003], [4.5853328999999885, -74.08852660000028], [4.5853328999999885, -74.09052660000027], [4.5853328999999885, -74.09052660000027], [4.583332899999989, -74.09252660000027], [4.583332899999989, -74.09252660000027], [4.583332899999989, -74.09452660000026], [4.581332899999989, -74.10252660000025], [4.579332899999989, -74.10452660000024], [4.577332899999989, -74.11252660000022], [4.577332899999989, -74.11452660000022], [4.57333289999999, -74.1225266000002], [4.57333289999999, -74.12652660000019], [4.57333289999999, -74.12652660000019], [4.56933289999999, -74.13452660000017], [4.5673328999999905, -74.14252660000015], [4.565332899999991, -74.14652660000014], [4.565332899999991, -74.14852660000014], [4.563332899999991, -74.15252660000013], [4.565332899999991, -74.14852660000014], [4.5673328999999905, -74.14452660000015], [4.56933289999999, -74.13652660000017], [4.57133289999999, -74.12852660000019], [4.56933289999999, -74.13652660000017], [4.56933289999999, -74.13452660000017],
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 16/18
[4.57333289999999, -74.12652660000019], [4.57533289999999, -74.1205266000002], [4.577332899999989, -74.11452660000022], [4.57533289999999, -74.11652660000021], [4.57533289999999, -74.11652660000021], [4.579332899999989, -74.10852660000023], [4.581332899999989, -74.10252660000025], [4.583332899999989, -74.09452660000026], [4.5853328999999885, -74.09052660000027], [4.583332899999989, -74.09252660000027], [4.5853328999999885, -74.08852660000028], [4.587332899999988, -74.08252660000029], [4.589332899999988, -74.07452660000031], [4.591332899999988, -74.07252660000032]]
import folium m = folium.Map(location=coordinates[0], zoom_start=15)start=coordinates[0] from routingpy import ORS # Create your own API key at https://openrouteservice.org/sign-upapi = ORS(api_key='5b3ce3597851110001cf62486efbc7b8f26f4c4f8f240c86408537f1') route = api.directions(locations=ruta,profile='driving-car')locations2=[list(reversed(coord)) for coord in route.geometry]# Access the geometry object as [[lon, lat], ...] list from the geometry # Folium (like leaflet) expects coordinates in [[lat, lon], ...] format though. Yep, annoyingfor each in coordinates: m.add_child(folium.Marker(location=each, popup='ruta-1', icon=folium.Icon(icon='motorcycle',prefix='fa',color="green"))) folium.Marker(location=start,popup='ruta-1',icon=folium.Icon(icon='plus-square',prefix='fa',c folium.PolyLine( color='red', weight=3.5, opacity=1,locations=[list(reversed(coord)) for coor # Other attributes are duration and distance. The full response is in 'raw' attributeprint("Duration in seconds: {}".format(route.duration))print("Distance in meters: {}".format(route.distance))m
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 17/18
Duration in seconds: 5818 Distance in meters: 48946 Make this Notebook Trusted to load map: File -> Trust Notebook
+
−
Leaflet (http://leafletjs.com)
from folium import pluginsfolium.plugins.AntPath( locations=[list(reversed(coord)) for coord in route.geometry], dash_array=[20, 30]).add_to(m) m.fit_bounds(m.get_bounds()) m
22/3/2021 Copia de VRPMorfinaTESIS.ipynb - Colaboratory
https://colab.research.google.com/drive/1TCROPx6PqAUXcQDDcOws5_MZhzg7CBf8#printMode=true 18/18
Make this Notebook Trusted to load map: File -> Trust Notebook
+
−
Leaflet (http://leafletjs.com)