Método Heurístico para Reparto Eficiente
Método Heurístico para Reparto Eficiente
CAMPUS MONTERREY
TESIS
PRESENTADA COMO REQUISITO PARCIAL PARA OBTENER EL GRADO ACADÉMICO DE:
MAESTRA EN CIENCIAS
CON ESPECIALIDAD EN SISTEMAS DE MANUFACTURA
POR:
ING. MARCELA MACIEL NAVA
El presente trabajo aborda el problema de generar zonas de reparto para apoyar la labor
diaria de rutear vehículos para una empresa que realiza entregas a domicilio.
La pregunta que resuelve el problema completo se define como ¿qué clientes debe
atender cada vehículo y en que orden debe de visitarlos?. Y la que resuelve el problema
del trabajo es ¿Qué clientes debe atender cada vehículo?
3
Indice
Resumen 3
Indice General 4
Indice de Figuras 6
Indice de Tablas 7
1.3 Justificación 11
1.4 Objetivos 11
4
2.4.2 Comparación de trabajos publicados sobre el tema 43
2.4.3 Método de solución vs trabajos publicados 46
2.5 Método de Barrido 49
2.6 Árbol de Costo Mínimo Total 52
2.6.1 Algoritmo Boruvka 54
2.6.2 Algoritmo Kruskal 56
2.6.3 Algoritmo Prim/Dijkstra 58
Conclusiones 98
Recomendaciones 99
Bibliografía 100
5
Indice de Figuras
6
Índice de Tablas
7
CAPÍTULO 1 PROPUESTA DE INVESTIGACIÓN
1.1 Introducción
Hoy en día el entorno competitivo es muy exigente, día con día los consumidores exigen
más para estar satisfechos, solicitan mejores servicios a menores costos, con rápidos
tiempos de respuesta y también esperan productos de gran variedad o hechos a la medida
“customized”. Esto nos demuestra que hoy, quien dicta las reglas del mercado es el
consumidor. Sumamos a estas circunstancias la globalización de los mercados que trae
consigo el aumento de competencia y por tanto la repartición del mercado entre estos
productores. Por tales razones las empresas siempre deben buscar la manera de mejorar y
tener una ventaja sobre sus competidores para poder acaparar una parte de ese mercado.
Todo esto confronta el entorno competitivo que se teñía no hace más de 10 años, donde el
productor era quien fijaba el movimiento del mercado, fijaba los precios, los tiempos de
respuesta, las condiciones de venta e incluso podía darse el lujo de no vender si así lo
determinaba ya que era el único que ofrecía ese producto, la competencia era poca o nula.
8
los tiempos de traslado no generan valor pero son necesarios e inevitables, por esto las
personas ya no quieren cargar con esta actividad. El crecimiento de vehículos transitando
las calles aumenta los tiempos de traslado e incluso los torna enfadosos por el tráfico y el
estrés que generan. De esta manera las personas están dispuestos a pagar un costo
razonable para evitarse esta actividad y dedicar su tiempo en otra que le produzca un
mayor beneficio.
9
1.2 Definición del Problema
El problema abordado por este trabajo implica lo siguiente: una empresa de reparto a
domicilio (comida rápida, lavandería, mensajería, mueblería, etc.) consta de una flota
de “m” vehículos disponibles para realizar el reparto a “n” puntos o clientes
diariamente. Los clientes a quien deben realizarse las entregas son variables, no siempre
son la misma dirección, ni el mismo número de clientes.
Tenemos que el problema de ruteo es un problema de nivel operativo, que se realiza día
con día, mientras la sectorización se considera un problema de estrategia, es decir no se
realiza frecuentemente, se supone una frecuencia de 6 meses a un año. Tiempo razonable
para reajustar los límites de los sectores o la modificación de los mismos.
La propuesta del trabajo es dividir la zona total de reparto (donde están contenidos todos
los puntos a repartir en un día) en pequeñas zonas que corresponderán a la zona de
reparto de cada vehículo. Al tener sectores formados, tenemos un mejor punto de partida
para el ruteo de los vehículos, ya que se tendrán límites geográficos para cada sector. Por
ejemplo, cuando tengamos una orden de reparto a un cliente, sabiendo su ubicación,
directamente sabremos a que zona asignarlo y que vehículo lo deberá de atender. Los
sectores permanecen fijos hasta que una nueva prueba se haga. Es decir las rutas cambian
diariamente pero los sectores no.
10
1.3 Justificación
1.4 Objetivos
• Objetivo general
Solucionar “la sectorización”, del problema de reparto modelado bajo el criterio
de las dos fases. Generando un método de solución para fraccionar una zona en
pequeños sectores equilibrados.
• Objetivos Particulares
2. Automatizar el método de solución para que su uso sea más fácil y apoye la toma
de decisiones de la empresa.
3. Probar que el método genera buenas soluciones y mejora los intentos ya hechos
en este tema para esta empresa.
11
1.5 Alcance de la Investigación
La confidencialidad del nombre de la empresa de la cual se obtuvieron los datos para una
aplicación real. La falta de datos de otra empresa para probar el alcance, comportamiento
y resultados del método de solución.
Se utilizan métodos cuantitativos para la creación del método de solución, siendo dos las
metodologías básicas: el método de barrido y el método de MST. La metodología usada
para el marco teórico es la investigación en fuentes bibliográficas y la revisión de trabajos
publicados que abordan este tipo de problema. El método de prueba y error, para ir
creando la heurística que solucionará el problema. También el método de prueba y error
para determinar los parámetros que requiere el programa y que generan la mejor solución
para el caso de aplicación.
12
CAPITULO 2 TRABAJOS Y LITERATURA RELACIONADOS
También se ubica el problema abordado por el trabajo dentro del contexto global de la
empresa, siendo la Logística la función principal de la empresa de la cuál se deriva el
concepto de Sectorización.
13
EMPRESA
Sectorizar Rutear
14
2.2 Logística
2.2.1 Historia
Tan remotamente como lo registra la historia, los bienes que las personas deseaban no se
producían en el lugar donde querían que se consumieran, o no eran accesibles cuando la
gente los quería consumir. Por esta razón el mercado y el consumo de productos se veía
limitado, el consumidor solo podía adquirir los productos que se cosechaban o producían
cerca del lugar donde habitaba, y el productor solo podía vender a aquellas personas en
las cercanías de su zona de producción.
Estos factores limitaban el potencial de venta de los productos, pero conforme el paso de
la historia, los avances tecnológicos han permitido expandir el alcance de venta de los
productos. Algunos de los avances tecnológicos que han aumentado el alcance de venta
son: conservadores, nuevas técnicas de conservación (la refrigeración, envasado al
vacío), los transportes (empezando por la rueda hasta terminar en el avión), los empaques
que permiten proteger los productos durante su traslado y lleguen con sus características
y cualidades intactas, por mencionar algunos.
15
Se tiene registro que el varón Antoine Henri Jomini, General de Napoleón manifestaba
por los años 1835 que la logística era definida como "el arte de alimentar a los ejércitos"
(Logística 2007). Pero varios investigadores concuerdan que no es sino durante la
Primera Guerra Mundial cuando al término se le da una importancia considerable, al
igual que la Investigación de Operaciones, y es definido como: “Parte de la ciencia
militar que calcula, prepara y realiza todo lo referente a movimientos y necesidades de las
tropas en campaña a fin de conseguir la máxima eficacia de una operación”. Dejando
atrás la historia y enfocando más el término de Logística en los negocios encontramos
varias definiciones:
1. "una función operativa importante que comprende todas las actividades necesarias
para la obtención y administración de materias primas y componentes, así como el
manejo de los productos terminados, su empaque y su distribución a los clientes"
(Ferrel 2004)
16
OBJETIVOS DE LOGÍSTICA
La Logística como cualquier función de negocio tiene objetivos particulares que serán sus
reglas para actuar dentro de la empresa y son:
La logística no es una función que se realice una sola vez, sino es una función recurrente
en varias actividades de la empresa, esto se explica porque las fuentes de materia prima o
los puntos de venta muchas de las veces no están en la misma ubicación que las fábricas.
En muchos de los casos y más hoy en día, se realiza nuevamente la función de logística
para llevar de los puntos de venta a los consumidores finales los productos o servicios
deseados.
17
2.2.2 Procesos de Logística
Logística de la Empresa
Para lograr la eficiencia de estos dos procesos deben de tomarse decisiones en los tres
niveles de planeación sobre las tres estrategias principales: Inventarios, Ubicación y
Transporte. Si una falla es posible que el proceso sea cual fuere distribución o gerencia de
materiales no pueda realizarse asegurando el menor costo.
18
2.2.3 Niveles de Planeación
Para lograr los objetivos de Logística de cada empresa es necesario tomar decisiones en
tres niveles de planeación para la empresa (fig ) para responder a las preguntas ¿que?
¿cuándo? y ¿como?. La diferencia entre estos tres niveles es el horizonte de tiempo
considerado. (Ballou 2004)
Estratégica
Táctica
Operativa
Nivel Estratégico: De largo alcance con horizonte de tiempo mayor a un año, trabaja con
información que por lo general esta incompleta o es imprecisa, los datos usados pueden
ser promedios o estimaciones. Los resultados se consideran adecuados si se encuentran
bastante cercanos a lo óptimo.
Nivel Táctico: Un horizonte de tiempo menor a un año, usa información más precisa y
los resultados deben ser más exactos que los de nivel estratégico.
Nivel Operativo: Toma de decisiones de corto alcance, las decisiones pueden ser día a
día u hora a hora. Utiliza información exacta y los métodos de planeación utilizados en
este nivel deben ser capaces de manejar esta gran cantidad de información y obtener
resultados óptimos.
19
2.2.4 Estrategias Principales
Las decisiones que deben tomarse en los tres niveles de planeación se refieren a las
cuatro estrategias de logística que permitirán brindar un servicio al cliente adecuado para
el mercado. (Ballou 2004)
Facilidades
Sistemas de
Información
Estrategia de Inventarios: Son decisiones o políticas que define cada empresa acerca de
cuanto stock en producto en proceso, producto terminado y materia prima quiere
mantener en sus facilidades. Las estrategias de reabastecimiento para los stocks, así como
las políticas para fijar los niveles y controlarlos.
20
Estrategia de Ubicación: Decisiones acerca de donde localizar geográficamente las
facilidades de una empresa, ya sean fábricas, almacenes, Centros de Distribución, puntos
de abastecimiento, etc.., el tamaño o capacidad de las mismas y el número de ellas. Todas
estas decisiones deben de considerar con mucho cuidado el transporte y el costo que este
incurre en llevar desde la materia prima hasta el consumidor final el flujo del material,
esto al menor costo posible.
Para entender mejor la relación entre nivel de planeación y las estrategias principales de
logística se presenta el siguiente cuadro que pone una actividad muestra para cada
interrelación.
21
Área de Nivel de Decisión
Decisión
Estratégica Táctica Operativa
(Estrategias)
Número, tamaño,
Ubicación de ubicación de
Facilidades almacenes, plantas y
terminales
Ubicación de Niveles de Cantidades y
Inventarios inventarios y inventario de tiempos de
políticas de control seguridad reabastecimiento
Tipos de reportes o Tipos de reportes o
Sistemas de Tipo de sistema a
comunicaciones comunicaciones
Información usar
mensuales diarias
Transporte Arrendamiento de
Diseño de ruta,
equipo, asignación
Selección del Modo asignación de rutas
de zonas de reparto
a vehículos
a vehículos
Tabla 1. Estrategia Logística vs Nivel Decisión
Nivel de Decisión
Estrategias
Estratégica Táctica Operativa
Facilidades
Sist. Inf.
Inventarios
Transporte Formación de Zonas de Reparto
Tabla 2. Sectorización y su relación Estrategia-Nivel Decisión
22
2.2.5 Clasificación en base al tipo de negocio
Ahora bien, dentro del ámbito de los negocios existen niveles o tipos de negocio por ello
las decisiones acerca de las estrategias no serán las mismas para uno y otro. Se presenta
una clasificación en base al tipo de negocio, sugiriendo que todas aquellas empresas que
pertenezcan a cada uno de estos niveles deben realizar decisiones similares en relación a
las estrategias de logística. Se definen tres niveles y sus actividades: nivel fábrica, nivel
distribuidor mayorista, nivel distribuidor detallista. (MAR 2007)
23
3. Logística de Distribución Comercial (Nivel Distribuidor Detallista o Minorista):
está relacionada con las actividades logísticas que realizan los puntos de venta y
minoristas. Los medios con los que cuentan son: superficie de venta y almacenes.
Las actividades que realizan son:
a. Compra de los productos
b. Almacenamiento de los productos
c. Venta de los productos al consumidor final.
Se observa que sea cual sea el nivel de negocio o el tipo de proceso (distribución física o
gerencia de materiales) una serie de decisiones debe ser tomada para lograr los objetivos
de logística de la empresa. Primero cada empresa define su objetivo primario: lo que
quiere hacer, ofrecer al cliente o lograr en el mercado y en base a esto se desarrolla su
plan logístico. Todas las decisiones logísticas en cualquiera de lo niveles de planeación
deberán de ir alineados a los objetivos primarios de la empresa. Ese objetivo determinará
el enfoque para actuar y decidir sobre las estrategias a implementar.
COSTOS
La razón por la cuál a la logística se le ha dado tanta importancia en los últimos años
radica en el costo que esta aporta a los productos o servicios de una empresa y al impacto
que tiene para el servicio y satisfacción del cliente. En un mundo tan cambiante como el
de hoy, donde la competencia es global y las exigencias del cliente son cada vez mayores
en cuestión de rapidez de servicio y menores costos, el menor objetivo de cualquier
empresa es subsistir a la competencia y lograr posicionarse en el mercado haciendo
cautivos a sus clientes y su máximo es ser el líder del mercado. Estamos viviendo un
mercado en el cual la guerra de precios es muy agresiva, día con día debemos de buscar
nuevas oportunidades de mejora para reducir nuestros costos. Una de la áreas a las que
más se han tornado los ojos de las empresas es la logística por incurrir en costos desde un
4% hasta un 30% del total de las ventas (Davis 2002), solo la función de compras le gana
con el 50% a 60%. Es por esto que optimizar la logística, buscar el conjunto de
24
decisiones que nos permita reducir este porcentaje, es y seguirá siendo un área de
oportunidad para cualquier empresa. Todos los esfuerzos que puedan ser realizados para
mejorar esta área serán bien apreciados tanto por la empresa como por el consumidor.
EMPRESAS DE SERVICIO
Ubicando la tesis dentro de todo este marco Logístico se dice que el presente trabajo
propone un método de solución para el nivel de planeación Táctico/Estratégico en
cuestión de estrategia de transporte. La estrategia de transporte se limita solo a la parte
de Distribución Física que es la encargada de llevar el producto o servicio al cliente final.
Si consideramos la clasificación en base a la unidad de negocio el problema a resolver se
ubica en el tercer nivel o tipo de negocio, Distribución Comercial.
25
2.3 Diseño y Programación de Rutas
Este tipo de problema fue primeramente abordado por Dantzig y Ramser (Dantzig 1959)
y seguido por Clarke and Wright (Clarke 1964). A partir de estos dos trabajos un gran
número de algoritmos, tanto exactos como heurísticos, han sido propuestos como
solución de este tipo de problema. La razón del esfuerzo que se ha hecho por solucionar
este problema es por su importancia práctica, es decir, la aplicación de este modelo a
problemas reales y su impacto en el desempeño de la empresa. Este tipo de problema
tiene un alto grado de dificultad para encontrar la solución óptima en problemas grandes,
es por eso que tantos métodos han sido desarrollados y siguen desarrollándose.
La solución del problema VRP se resume a encontrar el conjunto de rutas, cada una
realizada por un vehículo que sale del depósito al empezar la ruta y regresa al depósito al
terminar la ruta, tal que satisfagan los requerimientos del cliente y no violen ninguna
restricción de operación determinadas con anterioridad y el costo total de transporte sea
minimizado.
Normalmente una red vial es representada como un grafo formado por un conjunto de
arcos que representan una fracción de calle y por nodos o vértices que unen un arco con
26
otro y representan a los clientes y al depósito. Los arcos del grafo pueden ser
unidireccionales si el sentido de la calle es uno y bidireccional si el sentido de la calle es
doble. Cada arco tiene asociado un costo, que generalmente representa el tiempo de
traslado entre nodos o la distancia recorrida entre ellos. Estos arcos pueden ser
asimétricos o simétricos, el primero si no es lo mismo ir de A-B, que ir de B-A, el
segundo si el arco cuesta lo mismo A-B = B-A. Se presentan las características de cada
una de las entidades que intervienen y las restricciones del problema. (Toth 2002)
27
RESTRICCIONES DEL PROBLEMA
Las rutas que forman parte de la solución del problema deben de respetar las restricciones
de operación que dependen de varios factores como: naturaleza del producto, calidad del
servicio, características de los clientes y de los vehículos. Las más comunes son:
28
2.3.2 Clases de VRP
Esta clase de VRP es aquella donde todos los clientes corresponden a una entrega y las
demandas son determinísticas, conocidas y que no pueden separarse. Los vehículos
utilizados son idénticos, existe un solo depósito y solo hay restricción de capacidad de los
vehículos (puede ser peso o volumen). El objetivo es minimizar el costo total de servir a
todos los clientes.
Para asegurar la factibilidad del problema se tienen un número “k” de vehículos, dado
que “k” sea mayor o igual al número mínimo de vehículos necesarios para atender a
todos los clientes, este número mínimo puede obtenerse resolviendo el problema con
anterioridad bajo el concepto del problema de la mochila, teniendo una capacidad
supuesta y un número “n” de clientes a asignar.
El CVRP consiste en encontrar un número “k” de rutas, cada una asignada a un vehículo,
cuya suma sea el mínimo costo y que cumpla que la suma de las demandas de los clientes
de cada ruta no excede la capacidad del vehículo que los atiende.
Algunas variantes de este problema son: aquellas donde las capacidades de los vehículos
son variables; cuando las rutas que visitan a un solo cliente no son aceptadas; cuando el
número de vehículos disponibles es mayor al número mínimo de vehículos requeridos y
se dejan vehículos sin utilizar, en este caso se tienen que crear el número de rutas igual al
29
número de vehículos disponibles. Esta clase de problema se asemeja mucho al problema
del agente viajero (TSP).
Otra variante de esta clase es el llamado VRP con restricción de distancia (DVRP), este
tipo de problema tiene restricción de capacidad traducida en la distancia máxima (o el
tiempo máximo) que el vehículo puede recorrer para realizar su ruta. En este caso el costo
del arco es la distancia entre nodos o el tiempo que se tarda el vehículo en trasladarse de
un nodo a otro. Así también si se tienen los tiempos que tarda el vehículo en servir a un
cliente (tiempo en descargar su mercancía, tiempo en estacionarse u otros), el costo total
del arco será el tiempo que tarda en moverse de A-B más el tiempo que tarda en surtir B.
Y el objetivo de este problema es minimizar la longitud de las rutas o la duración de las
mismas. Si el problema considera capacidad de vehículo y restricción en distancia o
tiempo de recorrido el problema es llamado CDVRP.
30
El problema tiene una matriz de costo y tiempo normalmente simétrica, pero las ventanas
de tiempo inducen cierta orientación a las rutas por lo que el problema se modela como
un problema asimétrico. Se supone que los vehículos parten del depósito en el tiempo 0.
La solución del problema es encontrar rutas de mínimo costo que cumpla que la suma
de demandas de los clientes que visita una ruta no excede la capacidad del vehículo y que
cada cliente sea atendido durante su ventana de tiempo y el vehículo se queda en ese
lugar el tiempo (si).
VRPB: VRP donde primero se realizan las entregas y luego las recolecciones
Este problema supone dos conjuntos de clientes, aquellos a los que se les entrega
producto (A) y aquellos de los cuáles se recolecta producto (B). El problema tiene
restricción de precedencia, es decir primero tiene que visitar a todos los clientes del
conjunto A antes de atender a cualquier cliente del conjunto B. La solución del problema
es encontrar el conjunto de rutas de mínimo costo donde la suma de las demandas de los
clientes visitados (de entrega y recolección, separados) no excede la capacidad del
vehículo y en todas las rutas las entregas preceden a las recolecciones
Para saber el número de vehículos que se deben de tener se resuelve el problema con la
asignación de la mochila, uno para las recolecciones y otro para las entregas, entonces mi
número k de vehículos debe ser mayor o igual que el máximo de la k de recolecciones y
de la k de entregas. Y lo mismo se hace para determinar la capacidad del vehículo,
resolver el problema de la mochila referido en capacidad para recolecciones y luego para
entregas, se toma la mayor capacidad de ambas y esa será la capacidad a usar para el
problema VRP.
31
VRPPD: VRP con entregas y recolecciones mezcladas
Este problema aborda la situación donde las entregas pueden ser entre clientes, es decir
un vehículo recoge producto de un cliente para entregárselo a otro cliente en la ruta. En
los problemas anteriores esta situación no existe, lo que se recolecta de los clientes se
lleva al depósito y de ahí partirá una nueva ruta. O lo que se entrega a los clientes
siempre viene del depósito.
En este problema los clientes pueden tener dos demandas, d1 es la cantidad de producto
que se entrega al cliente y d2 la cantidad que se recolecta de ese cliente.A veces se
simplifica en una, siendo D= d1- d2 para cada cliente. También para cada cliente se
denota un Oi y un Pi, siendo Oi el nodo del cuál viene el producto a entregar al cliente i y
Pi el nodo al cual se le entrega lo recolectado del cliente i. La carga del vehículo en un
determinado punto es la carga inicial del vehículo más las recolecciones menos las
entregas. La solución es encontrar el conjunto de rutas de mínimo costo donde la carga
del vehículo debe ser positiva y no debe exceder en ningún punto la capacidad; para cada
cliente i, el cliente Oi, si es diferente del depósito, debe ser servido por la misma ruta de i
y antes del cliente i; para cada cliente i, el cliente Pi, si es diferente del depósito, debe ser
servido por la misma ruta de i y después del cliente i. (VRP 2007)
32
2.3.3 Métodos de Solución
1. Ramificación y acotamiento (Nemhauser 1988)
a. Relajaciones combinatorias básicas
i. Problema de Asignación (El-Farzi 1992)
ii. Árbol de costo mínimo
iii. Relajación de espacio y estado
b. Relajaciones Lagrangianas
c. Enfoque Aditivo
2. Ramificación y corte
3. Cubrimiento de conjuntos
4. Heurísticas
a. Métodos Constructivos
i. Criterio de ahorros (Clarke 1964)
ii. Criterio inserción
Los incisos a y b pueden utilizar el criterio que mejor se adapte al
problema, de menor costo, más cercano, más lejano o
aleatoriamente.
a. Secuencial (Mole 1976)
b. Paralelo (Potvin 1963) (Christofides 1979)
b. Métodos de dos fases
i. Sectorizar Primero-rutear después (González 2007)
ii. Rutear primero-sectorizar después (Goleen 1984) (Beasley 1983)
c. Métodos de mejora (Búsqueda Local) (Lin 1965) (Renaud 1996)
5. Metaheurísticas
a. Recocido simulado (Bergey 2003)
b. Búsqueda Tabú (Glover 1986) (Taillard 1993) (Vigo 2003)
c. Algoritmos genéticos (Holland 1975)
d. Colonia de hormigas (Gambardella 1996)
e. Redes neuronales
33
Heurísticas: Desarrolladas entre los 60´s y 90´s, realizan una exploración limitada del
espacio de solución, normalmente producen buenos resultados con tiempos de
procesamiento computacional pequeños.
Métodos Constructivos: Gradualmente van creando una solución factible sin dejar de
considerar siempre el costo de la solución, no contienen fase de mejora o refinamiento.
Revisar los trabajos de Laporte (Laporte 1987) y (Laporte 1992) para tener una idea
general de los métodos exactos usados para la solución de este problema.
34
Con lo mencionado en esta sección podemos mencionar una serie de similitudes que hay
entre el problema VRP y el planteamiento de sectorización para este trabajo. Se inicia
desde el punto de vista que la sectorización y el ruteo no son la misma cosa, más si usan
términos, situaciones y métodos similares.
En base a todo esto y a la teoría presentada se observa que entre el VRP y el problema de
sectorización, el tipo de problema que mejor se ajusta a la sectorización es el CVRP. Solo
debe hacerse ciertas consideraciones, la restricción de capacidad es considerada como
distancia y el límite de capacidad lo dicta el mismo peso del árbol de todos los puntos o
clientes. El enfoque del trabajo utiliza la distancia euclidiana entre puntos cuyos arcos
son simétricos y bidireccionales. Lo que debe diferenciarse es que la sectorización no
generará una ruta para los vehículos, aún cuando se estima el recorrido gracias a un árbol
de costo mínimo, y que los arcos no representan una red vial solo las uniones entre
clientes y su distancia euclidiana. La red vial en nuestro caso no es un factor crítico ya
que no es el objetivo primordial el generar rutas.
35
Una similitud más del CVRP con el problema de sectorización abordado es considerar
vehículos del mismo tipo y con igual tamaño de capacidad, además de solo admitir tener
un solo depósito para atender a todos los clientes.
El método de solución que aporta el trabajo es una heurística creada en base a dos
metodologías básicas: barrido y MST. La metodología de barrido es un tipo de heurística
que considera la inserción de puntos siguiendo el criterio del más cercano que en este
caso será también el de mínimo costo, por ser el costo una traducción de distancia. Este
trabajo se limita a ser una heurística sin métodos de mejora, por lo que aquí tenemos una
de las oportunidades para trabajos posteriores.
36
2.4 Sectorización
2.4.1 Fundamentos
La sectorización se define entonces como “la división de una región en zonas más
pequeñas siguiendo ciertos criterios y con un fin específico”. Las características básicas
que cualquier sector debe tener son (Mehrotra 1998):
• vecindad o contigüidad
• compacidad
• equilibrio (poblaciones heterogéneas o cargas equilibradas)
Estas características dictan los criterios para formar los sectores, aunque dependiendo del
problema a resolver pueden generarse criterios particulares o limitantes que ajusten mejor
el modelo del problema. Las zonas formadas son llamadas “distritos o sectores” y cada
uno es independiente y responsable de las actividades generadas dentro de sus límites
establecidos.
37
Los conceptos de sectorización y ruteo aunque parecidos no son lo mismo, bajo la
perspectiva de planeación existe una diferencia fundamental. Mientras la sectorización se
da a un nivel táctico o estratégico, el ruteo se da a nivel operacional (Muyldermans
2003). Si se realiza una buena sectorización y se habla en el contexto de VRP, la
formación de rutas de estos sectores dará muy bueno resultados y se simplificará el
proceso de formación de las mismas. Normalmente la sectorización se realiza después de
que han sido ubicados los centros de distribución, depósitos o almacenes y el problema
entonces se convierte en ¿que clientes debe atender cada depósito, o que conjunto de
puntos debe visitar cada vehículo de reparto?, con esto no estamos indicando la ruta del
vehículo sino un espacio físico con límites o fronteras llamado “sector”.
La sectorización es, en conclusión, “la división de una unidad mayor en entidades más
pequeñas considerando los criterios específicos del problema a resolver, en general lo que
se pretende es: formar nuevas entidades de características similares y lo más compactas
posibles”.
38
menores como los distritos políticos y en algunos casos estas divisiones se convierten en
una nueva restricción, cuando se requiera respetar los límites de estos o ajustar los límites
de los sectores a crear con los de los distritos políticos. Esta sería una restricción
particular del problema. La restricción de heterogenización de la población de cada
sector, se logra equilibrando en base a raza, ideologías y preferencias políticas, para
lograr esto se ponen límites o estándares que hay que cumplir. Por ejemplo, no exceder
un porcentaje de demócratas ni de conservadores, no crear distritos únicos de población
afroamericana, blanca o latina, no formar distritos de cristianos, protestantes, católicos,
mormones, etc…El fin es formar sectores que combinen todas estas posibilidades y que
la mezcla de población lograda evite el “gerrymandering”, que significa que algún sector
tenga preferencia por algún candidato o partido político. De esta manera los candidatos
en todos los distritos tienen la misma probabilidad de ganar ya que ningún grupo político,
de raza o de otras preferencias domina un distrito, es decir la población del distrito
formado permanece heterogénea. Hay que considerar que para lograr esto es probable
que los distritos no cumplan con la restricción de contigüidad o de compacidad, por esto
hay que tener criterios de negociación y ceder en ambos sentidos, ponderar para nuestro
problema que criterio es más importante que el otro y negociar los resultados.
39
La aplicación de sectorización para la formación de territorios de venta fue abordada en
un principio por (Hess 1971) (Zoltners 1980) (Heschel 1977), esta aplicación es la que
más se asemeja al problema estudiado, se tienen las siguientes restricciones:
Para este tipo de problema se considera que el encargado de ventas debe tener especial
cuidado en la sectorización de las regiones para evitar la baja moral de los empleados, el
bajo desempeño y la baja productividad de la fuerza de ventas. Una sectorización
balanceada arroja datos más consistentes y efectivos para evaluar individualmente
(Shanker 1975). Si la sectorización no esta bien realizada los resultados individuales no
son confiables y puede tomarse decisiones equivocadas en cuanto al desempeño de la
gente. Por esto la sectorización debe hacerse con sumo cuidado y a nivel estratégico o
táctico para evitar problemas operacionales e insatisfacción en el personal.
40
vendedores, por ejemplo, si se realiza una sectorización y en uno de los sectores
formados resultará que están todos los clientes de mayor demanda, los agentes de ventas
de los otros sectores y con justa razón estarían molestos porque su mercado es inferior al
de este sector, es por eso que se debe de lograr el equilibrio en base a este tipo de factores
y heterogenizar la población de clientes en cada sector formado evitando así problemas
operacionales y de insatisfacción del personal.
A. Métodos de Asignación
B. Métodos elementales de sectorización
Algoritmo de Barrido (Wren 1972) (Gillet 1974)
Algoritmo de Fisher and Jaikumar (Fisher 1981)
Algoritmo Bramel y Simchi-Levi (Bramel 1995)
C. Método de pétalos o de las margaritas (Balinski 1964)
D. Como problema de diseño de rutas utilizando todos los métodos mencionados
en el apartado anterior
Como se menciono el problema abordado por el trabajo tiene similitud con la formación
de zonas de venta, primeramente porque ambos se refieren en el contexto empresarial,
segundo porque se enfocan en equilibrar sectores en base a carga de trabajo y tercero
porque buscan la solución que ayude a reducir tensiones laborales.
41
Todo lo que se comento sobre insatisfacción acerca de sectores desequilibrados también
aplica para el problema del trabajo, si no se tiene este equilibrio es posible que la segunda
parte del problema el ruteo, se generen rutas dentro de cada sector que excedan el tiempo
de trabajo de un turno y puede existir también el caso donde una ruta este demasiado
sobrada en tiempo. Esto nos implica que empiecen a existir recelos entre los mismos
empleados, que se empiecen a formar malas mañas para aquellos cuyo tiempo les sobra,
se tomen descansos que no deben, usen los vehículos para pasear y otras situaciones. Y
para aquellos que tienen muy cargada la ruta que manejen a velocidades no adecuadas,
que sean descuidados y causen accidentes, que traten mal al cliente, lo apresuren o lo
atiendan de mala gana, incluso que no le den el servicio porque ya se acabo el turno.
Se dice “en teoría una óptima segmentación es aquella en la que se crean unidades
funcionales con igual oportunidad de ser rentables” (Bergey 2003), adecuándolo al
problema, “formar sectores que tengan cargas de trabajo similares y la capacidad de dar
el mismo nivel de servicio al cliente”.
42
2.4.2 Comparación de trabajos publicados sobre el tema
43
Referencia Aplicación del problema (diseño de rutas,
Tipo de Problema Método usado Tipo Método
Bibliográfica zonas o ambos)
Técnica multivariada del
(Cano- Formación de distritos Enfoque Forma distritos en base a las características de
análisis de componentes
Guervos 2003) (cualquiera) subjetivo las viviendas de la población
principales
Forma zonas de reparto, uniendo ubicaciones
(Haugland Formación de zonas de Heurística Multiinicio vs Tabu de clientes y evaluando el costo de transporte
Heurísticas
2007) reparto search entre ellos, la técnica más favorable fue Tabú
Search
Método fisico estadistico (q-
Forma zonas de elección considerando el
Formación de distritos state Potes Model) para Simulación y
(Chou 2006) equilibrio de la población y la contigüidad de
electorales resolver y para optimizar el Heurísticas
sus subunidades en la ciudad de Taipei.
método MonteCarlo o SA.
Forma zonas de reparto, relajando los límites
Formación de zonas de Diagramas Voronoi MW de las subunidades iterativamente hasta lograr
(Galvao 2006) Heurísticas
reparto (multiplicatively-weighted) una mejor utilización de tiempo y capacidad de
los vehículos.
Forma zonas y compara los resultados con un
Formación de distritos software de la Universidad de Leeds (ZDES)
(Bacao 2005) Algoritmos Genéticos Heurísticas
electorales que usa recocido simulado, los GA generan
mejores resultados.
Programación Lineal y Forma zonas en base a criterios particulares, se
Reajuste de distritos para Métodos
(Caro 2004) Sistemas Geográficos de apoya en un software que agrega los factores
asignación a las escuelas exactos
Información (GIS) geográficos al problema.
Programación lineal y métodos Forma zonas de distribución considerando el
(Muyldermans Formación de distritos para de asignación de nodos (uno se recorrido que hará el vehículo saliendo y
actividades de reparto o Heurísticas
2003) basa en un Emin ratio y el otro regresando a un depósito y recorriendo todos
servicio en Cmin ratio) los puntos dentro de la zona.
44
Referencia Aplicación del problema (diseño de rutas,
Tipo de Problema Método usado Tipo Método
Bibliográfica zonas o ambos)
(Chabrier Método
Ruteo de Vehículos Generación de columnas Encuentra la ruta mínima para los vehículos
2006) exacto
(Rousseau Generación de columnas y Método Forma rutas, busca el camino más corto con
2004) Ruteo de Vehículos programación restringida Exacto programación restringida.
45
2.4.3 Método de solución vs trabajos publicados
Equilibrio
La mayoría de los trabajos se enfoca a los problemas de distritos electorales y estos
difieren del trabajo en el énfasis que le dan a la igualdad de población, equilibrar las razas
y las preferencias políticas. El problema del trabajo no incurre en estos objetivos, si bien
quiere equilibrar algo no es la población de clientes sino la carga de trabajo en los
sectores. Los artículos que abordan este problema son: (Mehrotra 1998) (Chou 2006)
(Bacao 2005) (Forman 2003) (Bozkaya 2003). De estos el que usa una teoría de grafos es
(Mehrotra 1998) pero la utiliza inversamente al problema del trabajo, el peso lo coloca en
los nodos mientras que el método de solución ubica el peso en los arcos del grafo.
(Hess 1971) equilibra sectores en base al potencial de ventas para cada sector, (Marianov
2005) (Ricca 2004) en base al tiempo de recorrido dentro de los sectores, (Haugland
2007) en base al costo de transporte entre puntos, (Galvao 2006) en base a la utilización
en capacidad y tiempo del vehículo, (Muyldermans 2003) en base al recorrido entre
puntos y su salida y regreso al deposito, (Blais 2003) en base a carga de trabajo
(pacientes atendidos, distancia recorrida para llegar a ellos, disponibilidad de transporte
publico, etc), (D´Amico 2002) en base al tiempo de respuesta dentro de los sectores.
46
De todos estos los más similares al método de solución son (Marianov 2005) (Ricca
2004) y (Muyldermans 2003), aunque a diferencia de este último el método solo
considera la salida del vehículo desde el depósito más no su regreso.
Compacidad y contigüidad
En cuanto a los criterios de compacidad y contigüidad la mayoría de los trabajos
considera como buena opción ir insertado aquellos puntos que se encuentren más
cercanos al que ya se ha seleccionado y en este caso es el mismo proceso para el método
de solución. Para el método de solución el punto más cercano es aquel que le sigue
tomando como referencia el ángulo de su coordenada polar y la compacidad del sector se
estima con el peso del sector usando la metodología de MST que asegura la ruta mínima
entre puntos. En el caso de (Hess 1971) no se usa distancia sino la ubicación física de
las colonias, si esta al lado de la colonia ya seleccionada se puede elegir, sino no, este
criterio se conoce también como de vecindad. También es utilizado por otros trabajos en
los que se define el problema usando un grafo, aquí la vecindad se restringe cuando un
nodo no tiene un arco que lo una a otro, la unión no se puede hacer porque esos dos
nodos no son vecinos. La otra opción es la de asignar penalizaciones para la uniones
entre nodos no vecinos. (González 2007) utiliza al igual que el método de solución el
algoritmo de barrido para la inserción de puntos, (Ricca 2004) y (Muyldermans 2003)
consideran el punto más cercano como el punto al que se recorre la mínima distancia para
llegar a él. (Mehrotra 1998) considera la distancia del centro del sector a sus fronteras, y
así asegurar su criterio de compacidad.
Si la metodología abordada por (Bergey 2003) se adaptará al problema del trabajo, las
pequeñas unidades serían las colonias y estás se combinarían para formar un sector de
reparto que posteriormente sería asignado a un vehículo. El problema es que no se podría
partir una colonia para poder equilibrar los sectores y por tanto la carga de trabajo no
sería equitativa. Algo importante es que no debe de considerarse el equilibrio en base al
número de clientes atendidos sino en la distancia y tiempo de servicio a cada cliente.
47
De la literatura revisada podemos observar que utilizar la teoría de grafos es una práctica
común, así como la distancia euclidiana para los arcos del grafo. La distancia euclidiana
nos ayuda a convertir fácilmente los tiempos en distancia y así equilibrar en base a un
solo parámetro, tiempo o distancia. Se aprecia también que se prefiere la configuración
de distritos circulares (Galvao 2006) o tendiendo a circular y se rechazan aquellos
sectores alargados y delgados (Mehrotra 1998) (Bacao 2005). Configuración que el
método de solución también considera, ya que si un sector es alargado se parte por la
mitad para hacerlo mas equitativo en sus dos longitudes, el ancho y el largo.
(Marianov 2005) aporta la penalización de uniones de nodos con distancias muy grandes,
esta penalización puede adoptarse si se quiere evitar que un mismo vehículo entregue a
dos clientes, por ejemplo una entrega de productos frágiles y otro de muy pesados, que
pongan en riesgo la integridad del producto.
48
2.5 Método de Barrido
En los casos en que no se den estas condiciones, probablemente se obtendrá una mala
distribución de cargas de trabajo y un bajo aprovechamiento de la capacidad de los
vehículos. No obstante gran parte de los resultados se pueden ajustar de forma manual.
Esta técnica propone establecer un punto de origen en el depósito y desde allí realizar un
barrido para abarcar toda el área geográfica del problema, determinando así cada uno de
los clusters, sectores o zonas.
Los puntos se representan con coordenadas polares (r, θ) y se ordenan de menor a mayor
considerando el parámetro θ. Los puntos van agregándose a un sector en el orden en que
quedan en la lista. Un sector esta completo cuando su capacidad es excedida. En ese
momento se inicia un nuevo sector, considerando solo los puntos que no han sido
integrados anteriormente a un sector. Así sucesivamente hasta que todos los puntos de la
gráfica han sido asignados. Este proceso sigue los siguientes pasos gráficamente
(González 2007):
49
1. Localizar el depósito y todos los clientes en una gráfica.
50
4. Detener la inserción de un cliente en el sector cuando el vehículo haya excedido
su capacidad.
51
2.6 Árbol de Costo Mínimo Total (Minimum Spanning Tree MST)
los arcos que unen los puntos entre ellos. El árbol de costo mínimo total es aquel sub-
grafo formado por los arcos de menor peso que unen todos los puntos del conjunto y que
la suma total de estos pesos es la posibilidad mínima de recorrido entre ellos con la
condición de tocar una sola vez cada punto y no formar un ciclo, generando un sub-grafo
Un grafo puede contener más de un árbol de costo mínimo lo que genera un bosque de
árboles. El peso de cada arco representa la distancia entre puntos, el costo de la ruta, la
preferencia de este arco sobre otros tomando en cuenta criterios particulares designados
por los evaluadores, etc…El problema del árbol de costo mínimo es uno de los problemas
52
computacional de algoritmos. El problema genera soluciones eficientes y prácticas para
Algunas de las aplicaciones más importantes del problema son: diseño de redes
solución de un problema mayor. Las soluciones de este problema son considerados como
algoritmos voraces y se tiene como primer registro al científico Otakar Boruvka en 1926,
cuyo propósito era desarrollar una buena cobertura de la red eléctrica de Bohemia. Los
otros dos métodos más usados y que siguieron y citaron a Boruvka son: Algoritmo Prim y
Algoritmo Kruskal, los tres algoritmos corren en tiempo polinomial y el tipo de problema
Se explican con más detalle los tres algoritmos más usados: Boruvka, Prim y Kruskal.
(MST2 2007)
53
2.6.1 Algoritmo Boruvka
Consta evidencia escrita en dos trabajos del año 1926 escritos por Otakar Boruvka de ser
el pionero en generar un algoritmo efectivo para resolver el problema del árbol de costo
total mínimo. Boruvka fue criticado en su primer trabajo por no describir nítidamente su
algoritmo, más en un trabajo posterior demuestra que su idea es clara, concreta y factible.
• Paso 1: unir cada uno de los puntos del conjunto con su punto más cercano
• Paso 2: Se une cada uno de estos subárboles con otro subárbol, tomando el arco
menor que una a este par, los dos subárboles forman un nuevo subárbol,
reduciendo así el tamaño del bosque, este paso se repite hasta formar un solo
Este algoritmo fue redescubierto por otros autores en tiempos y países distintos: Gustave
Todos estos autores tienen ideas similares al algoritmo Boruvka, pero el algoritmo en si
54
1
Todos los arcos del grafo son ordenados de menor a mayor considerando su peso, se
examinan los arcos en orden creciente, si el arco no genera un ciclo con los subarboles
• Condición 1: Ninguno de los dos nodos del arco evaluado pertenece al bosque final
de subárboles, por lo tanto la rama es insertada, los dos nodos generan un nuevo
• Condición 2: Solo uno de los nodos del arco evaluado esta presente en uno de los
subárboles del bosque final, por lo tanto el arco es insertado en el bosque final.
• Condición 3: Cada uno de los nodos del arco evaluado están presentes en diferentes
• Condición 4: Los dos nodos del arco evaluado están presentes en el mismo subárbol
parte del mundo, pero el algoritmo se le reconoce a Kruskal por haberlo publicado con
primicia.
56
1 2
Se inicia con un grafo cuyos pesos de los Se busca el arco de menor peso y que no
arcos son conocidos. Ningún arco ha sido cierre un ciclo y se selecciona. Mismo
seleccionado todavía. criterio para cada paso.
3 4
Se busca el siguiente arco. Si hay dos arcos Se busca el siguiente arco, en este caso es
con el mismo peso se selecciona uno el arco de igual peso que el paso anterior.
arbitrariamente.
5 6
Se busca el siguiente arco y se selecciona. Se busca el siguiente arco, en este caso hay
dos de mismo peso (7), el arco AF y el DE,
se selecciona el AF ya que el DE forma un
7 ciclo (DFE).
57
2.6.3 Algoritmo Prim/Dijkstra
En este algoritmo los arcos son divididos en 3 grupos:
II. Los arcos de donde se selecciona el siguiente arco para el subárbol final
III. Los arcos restantes (los ya descartados o los que no se consideran todavía).
B. Los nodos restantes (uno y solo uno de los arcos del grupo II llegará a cada uno
de estos nodos).
inserta en el grupo A y los arcos que contienen este nodo en el grupo II. Al comenzar, el
grupo I esta vacío. En seguida se realizan los siguientes dos pasos iterativamente:
• Paso 1: El arco de peso menor del grupo II es retirado del grupo e insertado en el
• Paso 2: Considerar los arcos que unen el nodo recién transferido al grupo A y los
subárbol final.
58
1 2
3 4
5 6
59
7 8
9 10
11 12
13
60
CAPITULO 3
MÉTODO DE SOLUCIÓN
El método de solución usa el MST para calcular la distancia mínima necesaria para unir
todos los puntos pertenecientes a un sector, esta distancia en lo sucesivo será el peso del
sector. Y utiliza la metodología de barrido para dictar el orden en que los puntos son
agregados a los sectores. El criterio de inserción se basa en los parámetros de las
coordenadas polares de los puntos.
Gracias a estas dos metodologías se logra cumplir con los tres criterios básicos de la
sectorización: equilibrio gracias a la metodología MST, contigüidad gracias a la
metodología de barrido y compacidad gracias a la combinación de ambas metodologías.
Dentro del método de solución existen dos tipos de sectores: finales y temporales.
Sector
impar
Sector
temporal
Sector
final
61
Los sectores finales forman la configuración de la solución del problema y representan un
área de trabajo que será asignada posteriormente a un vehículo de reparto. Los sectores
temporales son aquellos sectores que sirven como paso intermedio para llegar a la
configuración final, son solamente para ayuda del método y no representan la solución.
El sector impar no es más que un sector final, se le denomina de esta manera para mayor
claridad en la explicación del método. Solo se forma cuando el número de vehículos es
impar.
Otra diferencia importante entre sectores temporales y finales es su peso. El peso de los
sectores se calcula generando el árbol de costo mínimo de todos los puntos del problema
y la solución de este árbol se divide entre el número de vehículos disponibles para
repartir. Este peso será asignado a los sectores finales, a los temporales se les asigna el
doble del peso de los finales.
Los sectores temporales son formados en la segunda etapa del método de solución para el
problema de vehículos impar y en la primera etapa para el problema de vehículos par. En
las demás etapas los sectores formados serán finales.
Otro término a definir para el método son las capas de la configuración final de los
sectores.
3 2
2
1
1
2 1
62
En la figura 16 se muestran las configuraciones posibles para el problema de vehículos
impar, donde se numeran las capas existentes para cada configuración. Se observa que el
máximo de capas para este tipo de problema es 3.
El algoritmo para un número impar de vehículos es de tres etapas, la primera etapa genera
el sector impar, y las siguientes dos etapas son las mismas que el problema de vehículos
par, solo considerando que los puntos contenidos en el sector impar ya no pueden ser
incluidos en ningún otro sector.
63
Puntos asumidos:
64
3.2 Descripción gráfica del Método de Solución
3.2.1 Problema de Número de Vehículos Impar
66
Se calcula el ancho del sector
temporal. Para cada sector, restando
al ángulo del último punto insertado
el ángulo del primer punto
insertado.
C2 C1
Se calcula la diferencia absoluta
entre los pesos de los sectores, se
transfiere otro punto y se vuelve a
calcular la diferencia, si la
diferencia nueva es menor a la
anterior se continúa transfiriendo
puntos, sino, se para y se evalúa un
nuevo sector temporal.
67
C1 C2
Si el ancho del sector es mayor al
ángulo límite “A”, el sector
temporal se parte en tira.
C1 C2
68
3.2.2 Problema de Número de Vehículos Par
69
Se calcula el ancho de los sectores
temporales y se decide como se va a
partir cada sector temporal.
Nota: Para el caso de sectores pares se sigue el mismo procedimiento que el método para
vehículos impares, solo se omite el paso de crear el sector impar (el barrido concéntrico
al depósito).
70
3.3 Diagrama de Flujo del Método de Solución
NOTACIÓN
71
k=0
Calcular PT (1)
No Sí
“m” es par?
k +1
Calcular I (2)
Calcular I´ (5)
Sí No
I´ <= I k +1
Calcular I´
Sí No
k <= m
Calcular T´ (10)
Sí No
T´ <= T
k +2
Agregar otro punto
Calcular T´
72
No Sí
“m” es par?
k=2 k=1
Sí No
k <= m
DV = 1,000,000
Sectorización Completa
Crear 2 sectores finales (12)
Sí No
Ancho k<Ángulo
(15)
Calcular PK (19)
Calcular DN (21)
Sí No
DN<DV
k+2
73
EXPLICACIÓN CUADRO POR CUADRO
1) Se genera el árbol de costo mínimo (MST) para todos los puntos y el resultado es
el peso del árbol generado más el peso de las paradas de los puntos visitados
2) Se calcula de la siguiente manera: (PT/m) + la tolerancia permitida
3) Crea una lista de puntos auxiliar que crece conforme se insertan puntos, este
sector solo se crea cuando el número de camionetas es impar y generara un sector
circular concéntrico al depósito, este sector será un sector final
4) Agrega dos puntos a la lista auxiliar, el criterio para agregar puntos al sector
impar es: aquellos de menor radio que no estén asignados a ningún sector.
5) Se calcula el MST de los dos puntos introducidos al sector, incluyendo el peso de
las paradas en los puntos
6) Se marcan los puntos recién introducidos al sector como miembros del sector “k”
formado
7) Se calcula de la siguiente manera: [(PT*2)/m] + la tolerancia permitida
8) Crea una lista de puntos auxiliar que crece conforme se insertan puntos, forma
sectores temporales que en un paso posterior se parten en 2 para generar sectores
finales
9) Agrega dos puntos a la lista auxiliar, el criterio para agregar puntos a los sectores
temporales es: aquellos de menor ángulo no asignados a ningún sector
10) Se calcula el MST de los puntos introducidos al sector temporal más el peso de
las paradas de los puntos introducidos
11) Mismo procedimiento que el paso (6)
12) Crea dos listas de puntos auxiliares, una para cada sector final, crecen según se le
agreguen los puntos. Una lista es para el sector k y otra para el sector k+1.
13) A las dos listas creadas se le agrega las coordenadas del depósito, considerándolo
como un punto más, esto con el fin de considerar la distancia saliendo desde el
depósito y que el equilibrio de los sectores sea más exacto
14) Se buscan los puntos del sector que tengan el ángulo máximo y el mínimo, se saca
la diferencia (MAX-MIN) y ese será el ancho del sector
74
15) El ángulo es el ángulo límite introducido para ser la referencia si partir el sector
temporal en capa o en tiras delgadas
16) El criterio para agregar el punto es tomar aquel punto con mayor radio y que sea
miembro del sector k
17) El criterio para agregar el punto es tomar aquel punto con mayor ángulo y que sea
miembro del sector k
18) Se marca el punto recién introducido como miembro del sector k+1
19) PK es el peso del árbol resultado de generar el MST de los puntos que son
miembros del sector k y el peso de las paradas de visitar estos puntos
20) PK+1 es el peso del árbol resultado de generar el MST de los puntos que son
miembros del sector k+1 y el peso de las paradas de visitar estos puntos
21) El DN es el valor absoluto de la diferencia de PK y PK+1
22) La variable DV ahora toma el valor de DN
23) Se marca el punto recién transferido a k+1 como miembro de k, ya que
adicionarlo al sector k+1 no favorece el equilibrio de los árboles
24) Agrega un nuevo punto siguiendo el criterio seleccionado en el punto 16 o 17.
75
3.4 Pseudo código del método de solución
Inicializar contadores
Introducir número de vehículos
Introducir ángulo límite
Limpiar listas
*Funciones
76
FUNCIONES
77
Crear sector temporal
Agregar los dos puntos de menor ángulo no miembros de otro sector
Calcular peso del árbol de estos puntos
Mientras el peso del árbol sea menor al peso límite del sector temporal
Marcar punto como miembro del sector
Agregar punto de menor ángulo no miembro de algún sector
Calcular peso del árbol de los puntos seleccionados como miembros del
sector más este último seleccionado
78
Calcular peso del árbol de la lista 1
Calcular peso del árbol de la lista 2
Calcular DN como la diferencia absoluta del peso del árbol de la lista 1 y
de la 2
79
3.5 Automatización del método de solución
Para facilitar el uso del método de solución se creo un programa para automatizar el
proceso y así permitir que el método pueda ser usado como una herramienta para la
planeación logística de una empresa. Se utilizó C++ para crear el código del programa y
este tiene ciertas consideraciones para su funcionamiento:
La figura 24 presenta el cuadro de diálogo del programa que permite realizar pruebas
para casos particulares y variar los parámetros de decisión como: ángulo límite, tiempo
de parada, velocidad promedio de los vehículos, tolerancias para los sectores temporal y
el impar. Esta aplicación nos permite determinar los valores que mejor se ajustan para el
caso.
80
3.5.1 Ventana de interacción del Programa
Tiempo de 7
1 12 Servicio (min)
3
*
8
9
*
10
5
Velocidad *
Promedio
13
km/hr
11
* Campos Obligatorios
81
3.5.2 Pasos para correr el programa de manera semiautomática
82
3.5.3 Pasos para correr el programa de manera automática
1. Se inserta la ruta del archivo .CSV que contiene las coordenadas de los puntos del
problema en el recuadro (9)
2. Marcar el origen, solo pulsando el botón de MARCAR ORIGEN *
3. Ingresar el tiempo de servicio en el recuadro (3)
4. Ingresar el ángulo (solo el valor y en grados) en el recuadro (4), que será límite
para saber si se parte el sector temporal en capas o tiras *
5. Ingresar el número de vehículos a utilizar o el número de sectores que se quiere
formar , en el recuadro (5) *
6. En el recuadro (13) ingresar la velocidad promedio para realizar la conversión de
tiempo a distancia.
7. Ingresar la tolerancia del sector temporal en el recuadro (8) y del sector impar en
el recuadro (7)
8. Seleccionar la opción de salida de los sectores formados (Puede ser ambos) *
a. Imprimir en archivo: Marcar recuadro de IMPRIMIR ARCHIVO y
colocar en el recuadro (10) la ruta del archivo en el cuál se quiere guardar
la información. El nombre del archivo debe ser nuevo y de tipo CSV.
b. Imprimir en pantalla: Marcar IMPRIMIR EN PANTALLA, la
información aparecerá en el recuadro (12)
9. Si se quiere obtener un archivo con el peso de los sectores, insertar la ruta del
archivo en el recuadro (11). El nombre del archivo debe ser nuevo y de tipo CSV.
10. Pulsar el botón ABRIR CON CALCULO
NOTA: Todos los incisos marcados con (*) para ambos casos, de la forma
semiautomática y automática, son obligatorios, si alguno no se ingresa el programa o no
corre o arrojará resultados erróneos.
83
CAPITULO 4
CASO DE APLICACIÓN
Una empresa de paquetería quiere utilizar una flota de 26 vehículos para dar servicio a
toda la zona metropolitana de Monterrey. Para este problema se considera que todos los
clientes tienen una demanda parecida (entregas de sobres o pequeños paquetes) por lo
que la capacidad física de volumen no se considera para la aplicación. La empresa divide
la carga total de trabajo diario entre sus 26 vehículos generando rutas para cada uno de
ellos. Como ya se sabe entre mayor sea el número de clientes más complicado se torna la
solución del problema de ruteo.
84
Por esta razón la empresa ha elegido modelar el problema de ruteo con el método de las
dos fases: primero sectorizar y después rutear, para simplificar el mismo y generar
soluciones más fácilmente. Como el problema de sectorización se considera un problema
de estrategia o táctica, el proceso no se realiza continuamente sino con una periodicidad
de 6 meses hasta un año.
Para realizar este primer intento se toma como muestra representativa un día de actividad
normal de la empresa, siendo el dato a considerar la dirección del cliente. En este intento
la sectorización se realizaba de la manera más rudimentaria, en un mapa pegado a una
pared, los clientes eran señalados con una tachuela de color. Ya ubicados todos los
clientes del día se agrupaban en 26 sectores según la intuición del planeador y cada grupo
era asignado a un vehículo. Este método además de impreciso es inexacto ya que los
sectores que generan no son equilibrados en cuanto a trabajo porque no consideran la
distancia de recorrido, solo consideran el factor visual.
85
4.2 Situación Actual
Actual Sectorización
Sector Peso Puntos
1 71264.83 59
2 54514.50 62
3 47202.20 64
4 37582.35 56
5 32550.50 58
6 58388.69 69
7 46576.45 64
8 29602.58 51
9 31438.56 58
10 47382.35 64
11 27365.00 57
12 52477.50 70
13 36210.08 52
14 37023.75 64
15 45438.48 68
16 19942.27 47
17 30301.59 61
18 38833.85 63
19 27776.36 51
20 26452.79 60
21 27724.54 56
22 30837.27 64
23 20643.07 48
24 30310.66 52
25 22656.07 56
26 75877.61 63
Media 36346.10 58.78
Desv. Std 14365.04 6.19
86
Figura 27. Configuración Actual de Sectores
87
Depósito
ACTUAL
88
4.3 Definición de Parámetros para el Programa del Usuario Final
Los parámetros seleccionados para correr las soluciones (por ser aquellos que mejor
equilibrio arrojaron) son:
89
Se muestra el ejecutable del programa ya cargado con los valores escogidos para cada
uno de los parámetros antes mencionados. Este ejecutable será el programa para el
usuario final para el caso particular de estudio. De esta manera el usuario solo tiene que
introducir la ruta del archivo de puntos y la ruta del archivo de salida. Además del
número de vehículos que se desea utilizar.
90
4.4 Solución del Problema con 26 vehículos
Sectorización Propuesta
Sector Peso Puntos
1 39899.72 48
2 40429.74 67
3 37977.74 46
4 41929.05 58
5 42663.03 77
6 42311.93 75
7 38229.83 93
8 38693.28 93
9 38172.10 94
10 33940.26 75
11 38790.61 57
12 50069.96 47
13 54196.70 75
14 41089.58 69
15 42158.80 42
16 40532.06 50
17 42368.79 40
18 44121.44 34
19 43232.68 57
20 40065.88 64
21 39895.79 75
22 39191.76 97
23 34970.33 53
24 47703.20 15
25 51162.84 27
26 55375.47 9
Media 41969.76 53.00
Desv. Std 5264.49 23.40
91
Figura 30. Configuración Propuesta para Sectores Par
92
Depósito
26 Vehículos
Figura 31. Configuración Propuesta para Sectores Par sobre mapa de Monterrey
93
4.5 Solución del problema con 25 vehículos
Utiliza los mismos datos y parámetros de la solución de 26 vehículos, el único dato que
varía es el de vehículos, pasa de 26 a 25.
Sectorización Propuesta
Sector Peso Puntos
1 41208.94 106
2 42489.02 50
3 42820.64 55
4 40319.43 47
5 41102.60 78
6 45103.22 76
7 43102.47 91
8 40009.48 81
9 40217.62 112
10 36484.81 79
11 43900.25 67
12 55527.39 55
13 41755.42 52
14 43495.33 69
15 43584.31 47
16 41837.39 40
17 43603.38 21
18 46144.31 47
19 44106.40 65
20 41223.04 87
21 40730.78 81
22 39256.48 75
23 48044.16 15
24 56163.65 21
25 42521.87 20
Media 43193.87 54.70
Desv. Std 4326.81 25.65
94
Figura 32. Configuración Propuesta para Sectores Impar
95
Depósito
25 Vehículos
Figura 33. Configuración Propuesta para Sectores Impar sobre mapa de Monterrey
96
4.6 Observaciones de la Solución
Peso Sector
Sectorización (en distancia mts)
Media Desviación
Actual 36346.10 14365.04
Impar 43193.87 4326.81
Par 41969.76 5264.49
El tiempo necesario para generar cada solución no excede los 15 minutos. Gracias al
programa se pueden realizar más iteraciones fácil y rápidamente, variando los parámetros
e investigar si existen otros que generen una mejor solución que las encontradas en este
trabajo. Gracias al método se logra un mejor equilibrio y por tanto reparto equitativo de
trabajo, así como la consideración de un peso de parada.
De las dos soluciones propuestas y de la configuración actual se pude comentar que hay
similitudes en cuanto a división visual, existen capas de sectores, aunque en la
sectorización actual se observan hasta cuatro capas para el caso de vehículos par, en el
método de solución se tiene como restricción el máximo de 2 capas.
Se comprueba que el método desarrollado por este trabajo es efectivo para la solución del
problema de sectorización. Los resultados generados para el caso de aplicación son
razonables y mejoran la solución actual del problema para esta empresa.
El mayor beneficio del método es que los sectores formados bajo este criterio son más
equilibrados en cuanto a peso de trabajo basados en distancia que los sectores con los que
actualmente se trabaja. Otro beneficio de importancia es la posibilidad de generar
sectorización totalmente nueva en un tiempo muy corto lo que permite aumentar la
frecuencia de la sectorización en la empresa y con esto reflejar con mayor rapidez el
cambio de la demanda y con esto realizar los ajustes necesarios para lograr una mayor
eficiencia.
.
98
RECOMENDACIONES
99
BIBLIOGRAFÍA
BEASLEY, J. Route first – cluster second methods for vehicle routing. Omega 11 (1983)
403–408
CHABRIER ALAIN. Vehicle routing Problem with elementary shortest path based
column generation Computers & Operations Research. New York: Oct 2006. Vol. 33, Iss.
10; p. 2972
CHOU CI, LI SP. Taming the Gerrymander - Statistical physics approach to Political
Districting Problem. Physica A-Statistical Mechanics and its Applications 369 (2): 799-
808 SEP 2006
100
CHRISTOFIDES, N., MINGOZZI, A., TOTH, P. The Vehicle Routing Problem. In:
Combinatorial Optimization. Wiley, Chichester (1979) 315–338
CLARKE, G., WRIGHT, W.: Scheduling of vehicles from a central depot to a number of
delivery points. Operations Research 12 (1964) 568–581
D'AMICO SJ, WANG SJ, BATTA R, RUMP C.M. A simulated annealing approach to
police district design. Computers & Operations Research volume 29 issue(6): 667-684
MAY 2002
DANTZIG, G., RAMSER, J.: The truck dispatching problem. Management Science 6
(1959) 80–91
DAVIS HERBERT W., DRUMM WILLIAM H. Logistics Costs and Service Database-
2002. Annual Conference Proceedings. San Francisco, CA: Council of Logistics
Management, 2002.
FISHER, M., JAIKUMAR, R. A generalized assignment heuristic for the vehicle routing
problem. Networks 11 (1981) 109–124
FORMAN SL, YUE YD. Congressional districting using a TSP-based genetic algorithm.
Lecture Notes in Computer Science 2724: 2072-2083 2003
101
GAMBARDELLA, L.M., DORIGO, M. Solving symmetric and asymmetric TSPs by ant
colonies. In: IEEE Conference on Evolutionary Computation, IEEE Press(1996) 622–627
GLOVER, F. Future paths for integer programming and links to artificial intelligence.
Computers & Operations Research 13 (1986) 533–549
GOLDEN, B., ASSAD, A., LEVY, L., GHEYSENS, F. The fleet size and mix vehicle
routing problem. Computers & Operations Research 11 (1984) 49–66
GRAHAM R. L. AND PAVOL HELL. On the History of the Minimum Spanning Tree
Problem. Annals of the History of Computing, Volume 7, Number 1, January 1985
HESCHEL M.S. Effective sales territory development. [Link] 41(2) (1977) 39-43
HESS S.W. AND [Link]. Experiences with sales districting model: criteria and
implementation. Management Science 18(4) (1971) 41-54
LAPORTE, G., NOBERT, Y. Exact algorithms for the vehicle routing problem. Annals
of Discrete Mathematics 31 (1987) 147–184
LIN, S. Computer solutions of the traveling salesman problem. Bell System Technical
Journal 44 (1965) 2245–2269
LODISH L.M., Vaguely right approach to sales force allocations, Harvard Business Rev.
(January-February, 1974) 119-124
102
MARIANOV V., F. FRESARD. A procedure for the strategic planning of locations,
capacities and districting of jails: application to Chile. Journal of the Operational
Research Society, (2005) 56, 244-251
POTVIN, J.Y., ROUSSEAU, J.M. A parallel route building algorithm for the vehicle
routing and scheduling problem with time windows. European Journal of Operational
Research 66 (1993) 331–340
RENAUD, J., BOCTOR, F., LAPORTE, G. A fast composite heuristic for the symmetric
travelling salesman problem. INFORMS Journal on Computing 8 (1996) 134–143
SHANKER R.J., R.E. TURNER AND A.A. ZOLTNERS. Sales territory design: An
integrated approach, Management Science 22(3) (1975) 309-320
SOLOMON MARIUS. Algorithms for the vehicle Routing and scheduling Problems with
time Windows Constraints. Operation Research 1987, pg 35, 254-265.
TAILLARD, E.D. Parallel iterative search methods for vehicle routing problems.
Networks 23 (1993) 661–673
TOTH PAOLO, VIGO DANIELE. The vehicle routing Problem. SIAM monographs on
discrete mathematics and applications. Society for Industrial and Applied Mathematics,
2002,Philadelphia
103
TOTH, P., VIGO, D. The granular tabu search and its application to the vehicle-routing
problem. INFORMS Journal on Computing 15 (2003) 333–346
WREN, A., HOLLIDAY, A. Computer scheduling of vehicles form one or more depots
to a number of delivery points. Operational Research Quarterly 23 (1972) 333–344
ZOLTNERS A.A. AND [Link]. Integer programming models for sales resource
allocation. Management Science 26(3) (1980) 242-260
REFERENCIAS ELECTRÓNICAS
VRP
[Link]
Última consulta el 20 de Noviembre 2007
MST
[Link]
Ultima consulta el 10 de Octubre 2007
Logística
[Link]
Última consulta el 10 de Septiembre 2007
MST2
[Link]
Última consulta el 20 de Septiembre 2007
104
ANEXO 1: Código del Programa
// CTarea11Dlg dialog
// Dialog Data
//{{AFX_DATA(CTarea11Dlg)
enum { IDD = IDD_TAREA11_DIALOG };
CListBox L_Arbol2;
CListBox L_CPolares;
CListBox L_Tree;
CListBox L_Dist;
CListBox L_Puntos;
CListBox L_SectorPuntos;
CButton C_File;
CButton C_List;
int E_Px;
int E_Py;
CString E_Peso;
int E_PuntoSale;
CString E_CadenaSale;
int E_Camion;
CString E_CadenaOrigen;
double E_TolSectorImpar;
double E_TolSectorTemp;
CString E_InFilePath;
CString E_OutFilePath;
int E_Parada;
int E_AnguloLimite;
int E_ArbolTotal;
// Implementation
double GetLowerRatio(CListaPuntos&,int&);
void FillDistancesList(CListaPuntos&,CListaDistancias&);
void CopyList(CListaPuntos&,CListaPuntos&);
double GetDistanceToSectorDivision(double,double);
int CalculateSectorWideAndWidth(CListaPuntos&,CListaPuntos&,int,int&,int&,int&);
int GetHigherRatioNodeNumber(CListaPuntos&,int&,int&);
private:
int xo,yo;
105
CString GetNodo(int); // Devuelve un nodo
void Clear(); // Elimina todo los nodos de la lista
void SetTreeNodes(int); // Devuelve la info del nodo si pertenece al tree
int GetSize(); // Obtiene el tamaño de la lista
CString GetNodoTree(int); // Devuelve un nodo si forma parte del árbol final
double GetPesoTree(); // Devuelve el peso total del árbol
double GetTreeWeightForIncreasingPoints(); // Devuelve el peso total del árbol sin validar que la lista de puntos se
destruya
private:
CListaPA LPA;
ND *head;
int size;
};
class CListaPA
{
public:
CListaPA();
virtual ~CListaPA();
bool Create(int);
int GetTree(int);
void SetTree(int,int);
void Clear();
private:
NPA *head;
};
class CListaPuntos
{
public:
CListaPuntos();
virtual ~CListaPuntos();
bool Push(int,int,int=0,int=0);
CString GetLastItem();
double GetDistancia(int,int);
int GetSize();
CString GetData(int);
double GetDataForNode(int,int);
bool IsEmpty();
106
CString Pop(int);
double CalcRadio(int,int);
double CalcAngulo(int,int);
void SetDataForNode(NodoPunto*,double,int);
void PopByNum(int);
void SetCurrentNode(int n);
double GetCurrentRatio();
double GetCurrentAngle();
int GetCurrentNumber();
int GetCurrentX();
int GetCurrentY();
int GetCurrentSector();
void SetCurrentSector(int);
void Clear();
void SetCurrentNodeByNum(int);
CString GetDataWithSector(int,CString&);
private:
int nodex;
int nodey;
double noder;
double nodeang;
int nodesector;
int nodenum;
NP *currentnode;
int size;
NP *head;
};
#include "stdafx.h"
#include "Tarea 11.h"
#include "ListaPuntos.h"
#include "Math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
107
}
CListaPuntos::~CListaPuntos()
{
Clear();
delete head;
}
nuevo->sig = head->sig;
head->sig = nuevo;
size++;
if(mynumber==0)
nuevo->num = GetSize();
else
nuevo->num = mynumber;
currentnode=nuevo;
return TRUE;
}
else
{
NP *temp;
temp = head;
if(isOrigin)
{
nuevo->r = 0;
nuevo->ang = 0;
nuevo->sig = temp2->sig;
temp2->sig = nuevo;
size++;
108
return TRUE;
}
while(temp2->sig != NULL)
{
nodenumber++;
if(mynumber==0)
{
temp2=temp2->sig;
while(temp2!=NULL)
{
temp2->num=nodenumber;
temp2=temp2->sig;
nodenumber++;
}
}
else
nuevo->num=mynumber;
return TRUE;
}
else
temp2 = temp2->sig;
}
nuevo->sig = NULL;
temp->sig = nuevo;
nuevo->isOrigin=isOrigin;
size++;
if(mynumber==0)
nuevo->num = GetSize();
else
nuevo->num = mynumber;
currentnode=nuevo;
return TRUE;
}
}
bool CListaPuntos::IsEmpty()
{
if(head->sig == NULL)
return TRUE;
else
return FALSE;
}
void CListaPuntos::Clear()
{
NP *temp;
while(head->sig != NULL)
{
temp = head->sig;
head->sig = temp->sig;
delete temp;
}
size=0;
}
CString CListaPuntos::GetLastItem()
{
NP *temp;
109
CString str;
temp = head;
while(temp->sig != NULL)
temp = temp->sig;
return str;
}
int CListaPuntos::GetSize()
{
return size;
}
CString CListaPuntos::GetData(int n)
{
CString str;
NP *temp = head;
for (int i=0; i<n; i++)
{
temp = temp->sig;
}
[Link]("%-2d - (%-2d, %-2d) - (%-1f, %-1f)",i,temp->x,temp->y, temp->ang, temp->r);
return str;
110
{
NP *temp = head;
for (int i=0; i<n; i++)
temp = temp->sig;
switch(data)
{
case 1:
return temp->x;
case 2:
return temp->y;
case 3:
return temp->r;
case 4:
return temp->ang;
case 5:
return temp->sector;
default:
return 0;
}
}
switch(datatype)
{
case 1:
NodeToChange->x=int(data);
case 2:
NodeToChange->y=int(data);
case 3:
NodeToChange->r=data;
case 4:
NodeToChange->ang=data;
case 5:
NodeToChange->sector=int(data);
}
}
CString CListaPuntos::Pop(int n)
{
if(z==360)
z=0;
return z;
}
void CListaPuntos::SetCurrentNode(int n)
{
NP *temp = head;
111
for (int i=0; i<n; i++)
temp = temp->sig;
if(temp!=NULL)
{
nodex=temp->x;
nodey=temp->y;
noder=temp->r;
nodeang=temp->ang;
nodesector=temp->sector;
nodenum=temp->num;
currentnode=temp;
}
}
double CListaPuntos::GetCurrentRatio()
{
return noder;
}
double CListaPuntos::GetCurrentAngle()
{
return nodeang;
}
int CListaPuntos::GetCurrentNumber()
{
return nodenum;
}
int CListaPuntos::GetCurrentX()
{
return nodex;
}
int CListaPuntos::GetCurrentY()
{
return nodey;
}
int CListaPuntos::GetCurrentSector()
{
return nodesector;
112
}
void CListaPuntos::PopByNum(int n)
{
NP *temp = head;
NP *temp2;
int popped=0;
do
{
if(temp->sig->num==n)
{
temp2 = temp->sig;
temp->sig = temp->sig->sig;
delete temp2;
size--;
popped=1;
}
if(temp->sig!=NULL)
temp = temp->sig;
else
popped=1;
}while(popped==0);
113
{
temp = head->sig;
head->sig = temp->sig;
delete temp;
}
}
int CListaPA::GetTree(int p)
{
NPA *temp=head;
while(temp->sig != NULL)
{
temp = temp->sig;
if(temp->punto == p)
return temp->tree;
}
return 0;
}
void CListaPA::SetTree(int ot, int nt)
{
NPA *temp=head;
while(temp->sig != NULL)
{
temp = temp->sig;
if(temp->tree == ot)
temp->tree = nt;
}
}
if(head->sig == NULL)
{
nuevo->sig = head->sig;
head->sig = nuevo;
return;
}
else
{
ND *temp;
temp = head;
while(temp->sig->d < d)
{
temp = temp->sig;
114
if(temp->sig == NULL)
{
temp->sig = nuevo;
nuevo->sig = NULL;
return;
}
}
nuevo->sig = temp->sig;
temp->sig = nuevo;
}
}
int CListaDistancias::GetSize()
{
return size;
}
}
[Link]("%d --> %d -- %.2f",temp->a,temp->b,temp->d);
return str;
}
}
if(temp->tree)
{
[Link]("%d --> %d -- %.2f",temp->a,temp->b,temp->d);
}
return str;
}
double CListaDistancias::GetPesoTree()
{
double total = 0;
ND *temp;
temp = head;
while(temp->sig != NULL)
{
115
temp = temp->sig;
if(temp->tree)
total += temp->d;
}
return total;
}
ND *aux = head;
while(aux->sig != NULL)
{
aux = aux->sig;
t1 = [Link](aux->a);
t2 = [Link](aux->b);
if(t1 != t2)
{
[Link](t1,t2);
aux->tree = TRUE;
}
}
[Link]();
}
double CListaDistancias::GetTreeWeightForIncreasingPoints()
{
double total = 0;
ND *temp;
temp = head;
while(temp->sig != NULL)
{
temp = temp->sig;
if(temp->tree)
total += temp->d;
}
return total;
}
#include "stdafx.h"
#include "Tarea 11.h"
#include "Tarea 11Dlg.h"
#include "dialog2.h"
#include "Math.h"
#include "FileDialog_ReadOnly.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CListaPuntos LP,LPWork,LPA;
CListaDistancias LD,LDA,LDW;
double f_totTreeW;
116
/////////////////////////////////////////////////////////////////////////////
// CTarea11Dlg dialog
BEGIN_MESSAGE_MAP(CTarea11Dlg, CDialog)
//{{AFX_MSG_MAP(CTarea11Dlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_CALCSECT, OnCalcsect)
ON_BN_CLICKED(IDC_BMARCAO, OnBmarcao)
ON_BN_CLICKED(IDC_OFILE, OnOfile)
ON_BN_CLICKED(IDC_BOCALCULO, OnBocalculo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
117
// CTarea11Dlg message handlers
void CTarea11Dlg::OnButton1()
{
UpdateData(TRUE);
if([Link](E_Px,E_Py) == FALSE)
MessageBox("El punto ya existe","Error", MB_ICONEXCLAMATION);
else
{
L_CPolares.ResetContent();
int n;
n = [Link]();
for(int i=1; i<= n; i++)
L_CPolares.AddString([Link](i));
}
E_Px = E_Py = 0;
// TODO: Add your control notification handler code here
UpdateData(FALSE);
}
void CTarea11Dlg::OnButton2()
{
int pos =0;
int ne = [Link]();
double dis;
L_Dist.ResetContent();
[Link]();
void CTarea11Dlg::OnButton3()
{
L_Tree.ResetContent();
[Link]([Link]());
CString str;
int mar = 0;
UpdateData(TRUE);
f_totTreeW = [Link]() + ([Link]()*E_Parada);
[Link]("%.4f",f_totTreeW);
E_Peso = str;
L_Tree.AddString("Arbol procesado");
UpdateData(FALSE);
// TODO: Add your control notification handler code here
}
void CTarea11Dlg::OnCalcsect()
{
// TODO: Add your control notification handler code here
double f_impairW,f_noderatio,f_thistreeweight,f_atreeweight,f_lastdifference,f_thisdifference,f_tolisector,f_toltempsector;
int b_numimparCamion,i_node,i,i_Sector=0,i_totSector=0,i_newSector=0,b_divideByAngle,i_ns=0;
int
i_nodenumber,i_x,i_y,b_isMaxOptimization,b_isLastSector,i_LastNode,i_pendX,i_pendY,b_IsPointPending,totSectores;
118
CString s_nodoanalizado;
CString SForTempSecFile,s_thisTempW;
int cont_puntos;
int cont_puntos2;
[Link]();
CopyList(LP,LPWork);
SForTempSecFile="Sector,Peso\n";
UpdateData(TRUE);
b_numimparCamion=E_Camion%2;
i_ns=ceil(double(E_Camion)/2);
if(b_numimparCamion)
{
totSectores=(E_Camion-1)/2+1;
}
else
{
totSectores=E_Camion/2;
}
f_impairW=f_totTreeW/E_Camion;
f_tolisector=f_impairW*(1+E_TolSectorImpar/100);
f_toltempsector=f_impairW*2*(1+E_TolSectorTemp/100);
if(b_numimparCamion)
{
//Se marca el primer nodo con el sector 1
i_Sector++;
f_noderatio=GetLowerRatio(LP,i_node);
[Link](i_node);
[Link](i_Sector);
[Link]([Link](),[Link]());
[Link](i_node);
cont_puntos=1;
s_thisTempW.Format("%d,%f\n",i_Sector,f_thistreeweight);
SForTempSecFile+=s_thisTempW;
[Link](i_LastNode);
[Link](i_Sector+1);
while([Link]()>0)
119
{
[Link]();
[Link]();
i_Sector++;
if(b_IsPointPending)
{
[Link](i_pendX,i_pendY);
}
if(totSectores == i_Sector)
b_isLastSector=1;
i=1;
f_thistreeweight=0;
cont_puntos=1;
do
{
[Link](1);
[Link]();
i_LastNode=[Link]();
[Link](i_LastNode);
[Link](i_Sector);
i_pendX=[Link]();
i_pendY=[Link]();
[Link](i_pendX,i_pendY);
[Link]([Link]());
if(i>1)
{
FillDistancesList(LPA,LDA);
[Link]([Link]());
f_thistreeweight=(cont_puntos*E_Parada) + [Link]();
}
i++;
cont_puntos++;
if(b_isLastSector==0)
{
[Link](i_LastNode);
[Link](i_Sector+1);
b_IsPointPending=1;
}
i_totSector=i_Sector;
i_newSector=i_Sector+1;
for(i_Sector;i_Sector<=i_totSector;i_Sector++)
{
[Link]();
[Link]();
[Link]();
[Link]();
b_isMaxOptimization=0;
b_divideByAngle=CalculateSectorWideAndWidth(LP,LPWork,i_Sector,i_x,i_y,i_node);
if([Link]()<3)
{
for(int i=1;i<=[Link]();i++)
{
[Link](i);
[Link]([Link]());
120
if(i%2==1)
[Link](i_Sector);
else
[Link](i_newSector);
}
}
else
{
[Link](xo,yo,0,1);
[Link](i_x,i_y);
[Link](xo,yo,0,1);
[Link](i_node);
[Link](i_newSector);
[Link](i_node);
cont_puntos2=1;
cont_puntos= [Link]();
FillDistancesList(LPA,LDA);
FillDistancesList(LPWork,LDW);
[Link]([Link]());
[Link]([Link]());
f_thistreeweight=(cont_puntos2*E_Parada) + [Link]();
f_atreeweight=(cont_puntos*E_Parada) + [Link]();
f_lastdifference=fabs(f_thistreeweight-f_atreeweight);
if(b_divideByAngle)
{
//Se divide el sector por el angulo
while(b_isMaxOptimization==0&&[Link]()>1)
{
[Link]();
[Link]();
[Link]([Link]());
[Link]([Link](),[Link]());
i_nodenumber=[Link]();
[Link]([Link]());
cont_puntos = [Link]();
cont_puntos2++;
FillDistancesList(LPA,LDA);
FillDistancesList(LPWork,LDW);
[Link]([Link]());
[Link]([Link]());
f_thistreeweight= (cont_puntos2*E_Parada) +
[Link]();
f_atreeweight= (cont_puntos*E_Parada) +
[Link]();
f_thisdifference=fabs(f_thistreeweight-f_atreeweight);
if(f_thisdifference<f_lastdifference)
{
[Link](i_nodenumber);
[Link](i_newSector);
f_lastdifference=f_thisdifference;
}
else
{
b_isMaxOptimization=1;
s_thisTempW.Format("%d,%f\n",i_Sector,f_atreeweight);
SForTempSecFile+=s_thisTempW;
s_thisTempW.Format("%d,%f\n",i_newSector,f_thistreeweight);
SForTempSecFile+=s_thisTempW;
}
}
}
else
{
//Se divide el sector por el radio
while(b_isMaxOptimization==0&&[Link]()>1)
{
[Link]();
[Link]();
121
i_nodenumber=GetHigherRatioNodeNumber(LPWork,i_x,i_y);
[Link](i_nodenumber);
[Link](i_x,i_y);
[Link](i_nodenumber);
cont_puntos = [Link]();
cont_puntos2++;
FillDistancesList(LPA,LDA);
FillDistancesList(LPWork,LDW);
[Link]([Link]());
[Link]([Link]());
f_thistreeweight=(cont_puntos2*E_Parada) +
[Link]();
f_atreeweight= (cont_puntos*E_Parada) +
[Link]();
f_thisdifference=fabs(f_thistreeweight-f_atreeweight);
if(f_thisdifference<f_lastdifference)
{
[Link](i_nodenumber);
[Link](i_newSector);
f_lastdifference=f_thisdifference;
}
else
{
b_isMaxOptimization=1;
s_thisTempW.Format("%d,%f\n",i_Sector,f_atreeweight);
SForTempSecFile+=s_thisTempW;
s_thisTempW.Format("%d,%f\n",i_newSector,f_thistreeweight);
SForTempSecFile+=s_thisTempW;
}
}
}
}
i_newSector++;
}
CString SForFile,SThisRegister,SForPrintList;
SForFile="X,Y,Sector\n";
L_SectorPuntos.ResetContent();
for(i=1;i<=[Link]();i++)
{
SForPrintList=[Link](i,SThisRegister);
if(C_List.GetCheck())
L_SectorPuntos.AddString(SForPrintList);
if(C_File.GetCheck())
SForFile+=SThisRegister;
}
if(C_File.GetCheck())
{
UpdateData(FALSE);
122
{
int i_pointlistsize,i=1;
double f_lowratio=0,f_noderatio;
i_pointlistsize=[Link]();
if(i_pointlistsize>0)
{
[Link](i);
f_lowratio=[Link]();
i_node=[Link]();
i++;
for(i;i<=i_pointlistsize;i++)
{
[Link](i);
f_noderatio=[Link]();
if(f_noderatio<f_lowratio)
{
f_lowratio=f_noderatio;
i_node=[Link]();
}
}
return f_lowratio;
}
}
}
[Link]([Link](),[Link](),[Link]());
123
}
[Link](1);
f_minangle=[Link]();
[Link]([Link]());
f_maxangle=[Link]();
f_sectorangle=f_maxangle-f_minangle;
f_divisionangle=f_minangle+f_sectorangle/2;
width=0;
wide=f_sectorangle;
if(wide>E_AnguloLimite)
{
x=[Link]();
y=[Link]();
b_isWide=1;
mynumber=[Link]();
}
else
{
x=i_xwidth;
y=i_ywidth;
b_isWide=0;
}
return b_isWide;
distancetoret=fabs(sin(myangle)*myratio);
return distancetoret;
}
void CTarea11Dlg::OnBmarcao()
{
UpdateData(TRUE);
xo=E_Px;
yo=E_Py;
E_CadenaOrigen.Format("Deposito: (%d,%d)",xo,yo);
UpdateData(FALSE);
124
{
double f_maxratio=0,f_noderatio;
int nodenumber=0;
x=y=0;
f_noderatio=[Link]();
if(f_noderatio>f_maxratio)
{
f_maxratio=f_noderatio;
nodenumber=[Link]();
x=[Link]();
y=[Link]();
}
}
return nodenumber;
}
void CTarea11Dlg::OnOfile()
{
UpdateData(TRUE);
int prueba;
const char *filename = E_InFilePath;
UpdateData(FALSE);
int i_newx,i_newy,n;
CString myString;
char linea[100], cadena[100];
FILE *Archi;
Archi = fopen(filename,"r");
if (Archi==0)
fprintf(stderr,"Fallo al abrir %s \n",filename);
for(int j=0;;j++)
{
if (feof(Archi)) break;
UpdateData(TRUE);
[Link](i_newx,i_newy);
L_CPolares.ResetContent();
n = [Link]();
UpdateData(FALSE);
}
fclose(Archi);
L_CPolares.AddString("Archivo Procesado");
125
if(E_TotalDivisiones>0)
f_totTreeW=CalculateTreeWeightbyParts() + ([Link]()*E_Parada);
else
{
OnButton2();
OnButton3();
}
void CTarea11Dlg::OnBocalculo()
{
OnOfile ();
OnCalcsect();
}
double CTarea11Dlg::CalculateTreeWeightbyParts()
{
CListaPuntos LPAUX,LPCurrent;
CListaDistancias LDAUX;
int i_ListSize;
double f_treeweight;
CString str;
i_ListSize=[Link]();
i_ListSize=i_ListSize/E_TotalDivisiones;
f_treeweight=0;
[Link]();
[Link]();
[Link]();
CopyList(LP,LPAUX);
while([Link]()>0)
{
[Link]();
[Link]();
GetLastElements(LPAUX,LPCurrent,i_ListSize);
FillDistancesList(LPCurrent,LDAUX);
[Link]([Link]());
f_treeweight=f_treeweight+ [Link]();
}
L_Tree.ResetContent();
UpdateData(TRUE);
[Link]("%.4f",f_treeweight);
E_Peso = str;
L_Tree.AddString("Arbol procesado");
UpdateData(FALSE);
return f_treeweight;
}
126