A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

40
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

Transcript of A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

Page 1: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 2: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 3: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 4: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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:

Page 5: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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.

Page 6: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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.

Page 7: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 8: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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).

Page 9: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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.

Page 10: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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á.

Page 11: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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.

Page 12: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 13: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 14: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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.

Page 15: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 16: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 17: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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.

Page 18: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 19: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 20: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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.

Page 21: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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.

Page 22: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

22

Page 23: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 24: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 25: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 26: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 27: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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),

Page 28: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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)

Page 29: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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),

Page 30: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 31: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 32: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 33: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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()

Page 34: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 35: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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,

Page 36: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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],

Page 37: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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],

Page 38: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 39: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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

Page 40: A VRPTW FOR PHARMACEUTICAL DISTRIBUTION HECHO POR

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)