• No se han encontrado resultados

Solución de problemas de ruteo de vehículos capacitados (CVRP) y con ventanas de tiempo (CVRPTW) utilizando ILOG Dispatcher

N/A
N/A
Protected

Academic year: 2020

Share "Solución de problemas de ruteo de vehículos capacitados (CVRP) y con ventanas de tiempo (CVRPTW) utilizando ILOG Dispatcher"

Copied!
59
0
0

Texto completo

(1)Solución de Problemas de Ruteo de Vehículos Capacitados (CVRP) y con Ventanas de Tiempo (CVRPTW) Utilizando ILOG Dispatcher. Samuel Fernando Ávila Ruiz Código 200021213. Universidad de Los Andes Facultad de Ingeniería Departamento de Ingeniería Industrial Bogotá Junio 2005.

(2) Solución de Problemas de Ruteo de Vehículos Capacitados (CVRP) y con Ventanas de Tiempo (CVRPTW) Utilizando ILOG Dispatcher. Samuel Fernando Ávila Ruiz Código 200021213 Tesis de Grado para optar al título de Ingeniero Industrial. ASESOR DE TESIS Andrés Medaglia, Ph.D.. Universidad de Los Andes Facultad de Ingeniería Departamento de Ingeniería Industrial Bogotá Junio 2005.

(3) II.05(10).4. CONTENIDO Pág. Capítulo 1 .............................................................................................................................5 Introducción.............................................................................................................................5. Capítulo 2 .............................................................................................................................6 VRP ..........................................................................................................................................6 a. Descripción del Problema.................................................................................................6 b. Características generales .................................................................................................6 c. Tipos de Problema............................................................................................................8 i. CVRP (Capacitated VRP): ...............................................................................................9 ii. VRPTW (VRP w ith Time Windows):................................................................................9 iii. Otros problemas:..........................................................................................................9 d. Metodologías de Solución .............................................................................................. 10 i. Heurísticas.................................................................................................................... 10 ii. Metaheurísticas ........................................................................................................... 11. Capítulo 3 ...........................................................................................................................13 ILOG Dispatcher..................................................................................................................... 13 a. ¿Qué es?......................................................................................................................... 13 b. Requerimientos............................................................................................................... 13 c. Código ............................................................................................................................ 13 i. CVRP ............................................................................................................................ 13 ii. CVRPTW ...................................................................................................................... 24 d. Compilación.................................................................................................................... 27 e. Instancias........................................................................................................................ 31 f. Formato archivos............................................................................................................. 31. Capítulo 4 ...........................................................................................................................37.

(4) II.05(10).4. Resultados Experimentales ................................................................................................... 37 a. CVRP............................................................................................................................... 37 b. CVRPTW ......................................................................................................................... 44. Capitulo 5 ...........................................................................................................................51 Conclusiones......................................................................................................................... 51. Capitulo 6 ...........................................................................................................................52 Trabaj os Futuros.................................................................................................................... 52. Bibliografía ........................................................................................................................53. 2.

(5) II.05(10).4. LISTA DE FIGURAS. FIGURA 1: TAXONOMÍA DE PROBLEMAS................................................................................ 8 FIGURA 2: CLASE ROUTINGMODEL...................................................................................... 14 FIGURA 3: CONSTRUCTOR CLASE ROUTINGMODEL........................................................... 15 FIGURA 4: MÉTODO PARA CREAR VARIABLES.................................................................... 16 FIGURA 5: MÉTODO PARA CREAR NODOS. ......................................................................... 17 FIGURA 6: MÉTODO PARA CREAR VEHÍCULOS. .................................................................. 18 FIGURA 7: MÉTODO PARA CREAR LAS VISITAS................................................................... 19 FIGURA 8: CLASE ROUTINGSOLVER.................................................................................... 20 FIGURA 9: CONSTRUCTOR CLASE ROUTINGSOLVER. ........................................................ 21 FIGURA 10: MÉTODO PARA APROBAR LA GENERACIÓN DE LA PRIMERA SOLUCIÓN........ 21 FIGURA 11: MÉTODO PARA MEJORAR LA PRIMERA SOLUCIÓN.......................................... 23 FIGURA 12: MÉTODO PARA IMPRIMIR LA INFORMACIÓN. ................................................... 23 FIGURA 13: MAIN................................................................................................................... 24 FIGURA 14: : VARIABLE DE TIEMPO...................................................................................... 24 FIGURA 15: DESCRIPCIÓN Y ADICIÓN DE VARIABLE DE TIEMPO........................................ 25 FIGURA 16: MÉTODO PARA CREAR VEHÍCULOS (CVRPTW). ............................................... 26 FIGURA 17: MÉTODO PARA CREAR VISITAS (CVRPTW). ..................................................... 27 FIGURA 18: IMAGEN DE IMPRESIÓN DE PRIMERA SOLUCIÓN............................................. 28 FIGURA 19: IMAGEN DE IMPRESIÓN DE LA SOLUCIÓN MEJORADA. ................................... 30 FIGURA 20: FORMATO NODOS. ............................................................................................ 31 FIGURA 21: FORMATO VEHÍCULOS...................................................................................... 32 FIGURA 22: FORMATO VISITAS............................................................................................. 33 FIGURA 23: FORMATO VEHÍCULOS (CVRPTW)..................................................................... 34 FIGURA 24: FORMATO VISITAS (CVRPTW). .......................................................................... 35 FIGURA 25: FORMATO TABLA RESULTADOS CVRP............................................................. 37 FIGURA 26: RESULTADOS AUGERAT ET AL. ........................................................................ 39 FIGURA 27: RESULTADOS FISHER. ...................................................................................... 40 FIGURA 28: RESULTADOS CHRISTOFIDES, MINGOZZI Y TOTH........................................... 41 FIGURA 29: RESULTADOS GILLET Y JOHNSON.................................................................... 42 FIGURA 30: RESULTADOS GOLEEN, WASIL, KELLY Y CHAO. .............................................. 43 FIGURA 31: FORMATO TABLA RESULTADOS CVRPTW........................................................ 44 FIGURA 32: RESULTADOS SOLOMON 25.............................................................................. 46. 3.

(6) II.05(10).4. FIGURA 33: RESULTADOS SOLOMON 50.............................................................................. 48 FIGURA 34: RESULTADOS SOLOMON 100............................................................................ 49 FIGURA 35: RESULTADOS HOMBERGER.............................................................................. 50. 4.

(7) II.05(10).4. Capítulo 1. Introducción Los problemas que se tratan en este trabajo son: el problema de ruteo de vehículos capacitado (CVRP) y el problema de ruteo de vehículos capacitado con ventanas de tiempo (CVRPTW). Estos problemas buscan encontrar las mejores rutas que deben realizar los vehículos para satisfacer la necesidad de todos los clientes teniendo en cuenta las restricciones de capacidad y de ventanas de tiempo. La herramienta comercial de ILOG Dispatcher 4.0 es un programa que nos suministra unas librerías que nos permiten solucionar el problema de ruteo de vehículos. Para poder accederlas se debe tener un conocimiento previo de programación en C++ y sobre el problema. Para conocer la efectividad de la herramienta se corrieron varias instancias de la literatura. Para el CVRP se usaron librerías de Augerat et al., de Fisher, de Christofides, Mingozzi y Toth, de Gillet y Johnson y de Golden, Wasil, Kelly y Chao [21]. Mientras que para el CVRPTW se usaron librerías de Solomon para 25,50 y 100 clientes y de Homberger [21]. El trabajo está organizado de la siguiente manera: En el capítulo 2 hay una breve explicación sobre los problemas que se van a tratar en este documento. En el capítulo 3 hay una explicación completa sobre la herramienta comercial que se usó para resolver las diferentes instancias. El capítulo 4 muestra las soluciones obtenidas con esta herramienta y posteriormente en el siguiente capítulo están las conclusiones sobre éstas.. 5.

(8) II.05(10).4. Capítulo 2. VRP a. Descripción del Problema Este problema busca encontrar las mejores rutas para crear un sistema de distribución de productos de una manera eficiente, reduciendo todo tipo de costos. En general se podría definir el problema de ruteo de vehículos de la siguiente manera: dados unos clientes, un centro de distribución y unos vehículos con capacidad, se deben encontrar las mejores rutas que deben seguir estos vehículos para que satisfagan todas las demandas de los clientes sin sobrepasar la capacidad de cada vehículo. Aparentemente no es un problema difícil, pues parece ser más sencillo de lo que en realidad es. Sin embargo este problema es de complejidad NP, lo que indica que a medida que va siendo mayor el número de clientes, mayor va siendo su dificultad en resolverse [1]. b. Características generales. A continuación se encuentran las principales características del VRP. Vale la pena aclarar que no todas las instancias cumplen con todas las características a mencionar, pues sus mismas restricciones lo impiden; sin embargo, esto permite en algunos casos la creación de otras características nuevas. Es por esta razón que las aquí expuestas son generales y no son las únicas existentes.. 1. Lo más importante es definir cuál va a ser el costo a minimizar. En general existen cuatro tipos de funciones objetivo para el problema de ruteo de vehículos:. 6.

(9) II.05(10).4. a. Minimizar el costo de transporte global, teniendo en cuenta las distancias entre los clientes y el centro de distribución, además de los costos asociados a los vehículos usados.. b. Minimizar el número de vehículos requeridos para el cubrimiento de todos los clientes.. c. Balancear las rutas con tiempo y con carga de los vehículos. d. Minimizar las penalidades por servir a un cliente parcialmente, es decir que al no satisfacer en la totalidad su demanda equivale a una penalidad [1].. 2. Solo existe un Centro de Distribución, del cual se envían todos los productos a todos los clientes. 3. Los clientes solo deben ser visitados una sola vez y por un solo vehículo. Quiere decir que un cliente solo puede estar en una ruta a lo sumo. 4. Todas las rutas empiezan y terminan en el Centro de Distribución. 5. Las demandas de los clientes son fijas y están dadas.. 6. Los vehículos utilizados son iguales: todos tienen la misma capacidad y el mismo costo. 7. Los costos están definidos de la siguiente manera: Ci,j representa lo que cuesta ir del cliente i al cliente j. Si los costos llegan a ser Ci,j = Cj,i se dice que es un.

(10) II.05(10).4. problema Simétrico (SCVRP), mientras que si esto no se cumple se dice que es un problema Asimétrico (ACVRP). Aparte de estas características existen otras como: restricciones de tiempo, restricciones de varios Centros de Distribución, restricciones sobre la recolección de productos en sitios diferentes el Centro de Distribución, etc. Existen muchas variantes a este problema; sin embargo, para fines de esta investigación solo se va a tener en cuenta la restricción de capacidad de los vehículos y las restricciones de tiempo. La distancia entre los clientes va a ser simétrica pues se trabaja con coordenadas y se ven distancias Euclidianas.. c. Tipos de Problema. CVRP. Route Length. DCVRP. Backhauling Time Windows. VRPB. Mixed Serv ice. VRPTW. VRPBTW. VRPPD. VRPPDTW. Figura 1: Taxonomía de Problemas.. En la Figura 1 se muestran los problemas básicos del VRP con sus interconexiones [1]. Como lo muestra el diagrama anterior, el CVRP es el problema más importante de todos pues es a partir de éste que se derivan los. 8.

(11) II.05(10).4. otros tipos de problemas. En un breve resumen se explicará cada uno de los diferentes problemas, sin embargo para un mayor y mejor entendimiento es bueno referirse a otras fuentes de información como [1], [2], [6], [19], [20], [21].. i. CVRP (Capacitated VRP): Este problema consiste en encontrar unas rutas, cada una asignada a un vehículo, con el mínimo costo posible para que satisfaga a todos los clientes. Entre sus restricciones se tiene que cada ruta debe empezar y terminar en el centro de distribución, cada cliente es visitado a lo sumo una vez (es decir que solo va a estar en una sola ruta) y que la suma de las demandas de los clientes no supere la capacidad del vehículo. ii. VRPTW (VRP with Time Windows):. En este problema se buscan las rutas de la misma manera que en el CVRP, pero se le adiciona una restricción más. Esta restricción consiste en que cada cliente tiene una hora en la cual puede ser atendido y tiene además un tiempo de servicio, que es el tiempo que se demora el vehículo en dejar la mercancía y salir hacia el otro cliente.. iii. Otros problemas: VRPB (VRP with Backhauls): En este problema existen dos tipos de clientes: 1. el cliente que sólo demanda producto 2. el cliente que aparte de demandar producto tiene un producto para que sea recogido o devuelto.. 9.

(12) II.05(10).4. Estos últimos clientes deben ser dejados en último lugar en las rutas de los vehículos, como restricción del problema. Esto se hace con el fin de optimizar su capacidad debido a que aparte de repartir, en algunos casos deben recoger productos. Si adicionalmente se le añaden restricciones de ventanas de tiempo se obtiene una modificación a la restricción explicada anteriormente, y de esta manera un nuevo problema, el VRPBTW.. VRPPD (VRP with Pickup and Delivery): Este problema es similar al anterior, pero con la diferencia que los vehículos tienen que recoger producto de un cliente para llevar a otro, mientras que el anterior solo lo recogía o lo devolvía. Para este caso, se tienen otras restricciones adicionales a las restricciones del CVRP, las cuales hablan sobre como deben ser visitados los clientes, pues como esta mencionada anteriormente, algunos productos demandados por unos clientes requieren ser recogidos en otro sitio diferente al centro de distribución y por esto el orden de recorrido es tan importante. d. Metodologías de Solución i. Heurísticas. A lo largo del tiempo se han propuesto varias familias de heurísticas para resolver el VRP, las cuales pueden ser clasificadas en dos categorías principales: heurísticas clásicas y metaheurísticas. Las clásicas desarrolladas mayormente entre 1960 y 1990, y las metaheurísticas en la última década. La gran diferencia entre estos métodos es que mientras las heurísticas clásicas hacen una exploración limitada del espacio y producen resultados de buena calidad, las metaheurísticas enfatizan en una exploración profunda de las regiones más promisorias del espacio de solución y sus resultados presentan una mayor calidad.. 10.

(13) II.05(10).4. Teniendo esto en cuenta, se puede decir que las metaheuristicas no son más que una versión mejorada y más sofisticada de las heurísticas clásicas. Las heurísticas clásicas para el VRP pueden ser ampliamente clasificadas en tres categorías: heurísticas constructivas, heurísticas de dos fases, las cuales a su vez se dividen en dos subcategorías: grupos-primero, rutas-segundo; rutas-primero, grupos-segundo y por ultimo métodos de mejoramiento, los cuales no serán mencionados, pero se puede consultar en Christofides, Mingozzi y Toth [2], Bodin et al. [3], Christofides [4], Golden y Assad [5] y Fisher [6].. ii. Metaheurísticas Son consideradas procedimientos de solución general que exploran el espacio de solución para identificar buenas soluciones e involucrar en algunos casos la construcción estándar de rutas. y las. heurísticas. clásicas. mencionadas. anteriormente. Las metaheurísticas permiten soluciones deterioradas e incluso intermedias en el proceso de búsqueda, lo cual es una de las mayores diferencias con las clásicas. Las mejores metaheurísticas desarrolladas y aplicadas en el VRP identifican mejores óptimos locales que otras heurísticas pero también tienden a consumir más tiempo.. Dentro de este tipo de soluciones. podemos. encontrar seis. categorías:. Enfriamiento Simulado (SA) [24], [25], [26], [27], Enfriamiento Determinístico (DA) [28], [29], Búsqueda Tabú (TS) (Primeros Algoritmos de Búsqueda Tabú [30], [2], [31], Algoritmo de Búsqueda de Osman [26], Ruta Tabú [32], [33], Algoritmo de Taillard [34], Algoritmo de Xu y Kelly [35], Algoritmo de Rego y Roucairol [36], Algoritmo de Barbarosoglu y Ozgur [37], Procedimiento de Rochat y Taillard [38] y Búsqueda Tabú de Toth y Vigo [39]),. Algoritmos Genéticos (GA) (Algoritmo. Genético Simple [40]), Colonia de Hormigas (AS), [41] y Redes Neurales (NN),. 11.

(14) II.05(10).4. [42]. Los tres primeros algoritmos empiezan desde una solución inicial. y se. mueven alrededor del vecindario hasta que una condición de parada se satisfaga. GA examinan una población de soluciones en cada paso, AS son un acercamiento constructivo en el cual se crean varias nuevas soluciones usando información obtenida previamente, y por último, los NN son mecanismos de aprendizaje que ajustan gradualmente las capacidades hasta que se llega a una solución aceptable.. Mas información acerca de este tema puede consultarse en los siguientes autores: Rumelhart y McClelland [7], Wasserman [8], Van Laarhoven y Aarts [9], Golberg [10], Davis [11], Pirlot [12], Reeves [13], Dorigo, Maniezzo y Colorni [14], Osman y Kelly [15], Osman y Laporte [16], Aarts y Lenstra [17], Glover y Laguna [18], Gendreau, Laporte y Potvin [19] y Golden et al. [20].. 12.

(15) II.05(10).4. Capítulo 3 ILOG Dispatcher a. ¿Qué es? ILOG presenta unas librerías en C++ que permiten, con la ayuda de compiladores, resolver problemas de ruteo de vehículos. A través de sus ejemplos, los cuales son guías junto con el manual, se aprende a usar estas librerías y de esta manera a resolver los distintos problemas. b. Requerimientos Es importante tener un breve conocimiento de programación en C++ para poder entender el código proporcionado en el manual y de esta manera poder solucionar los problemas. De la misma forma es importante tener un previo conocimiento sobre cómo funciona y qué busca un VRP. c. Código Los códigos para solucionar los problemas se obtuvieron del manual, pues aparte de ser programación en C++, ILOG también tiene su propio lenguaje para entender y utilizar las diferentes variables. Para poder entender el código, como se había dicho anteriormente, es. indispensable un previo conocimiento de. programación en C++. A continuación está el modelo que se usó para solucionar el CVRP y se dirá posteriormente que cambios se hicieron para solucionar el CVRPTW.. i. CVRP Primero se encuentra la declaración del modelo donde se nombran las variables que se van a usar. Como se puede ver, ILOG usa dos variables llamadas _env y _mdl (línea 2 y 3), las cuales representan la instancia y el modelo,.

(16) II.05(10).4. respectivamente. También es importante resaltar cómo se llaman las librerías de ILOG. Antes de nombrar las variables se escribe el tipo de variable que es como se hace en cualquier lenguaje de programación, pero con la diferencia que antes del tipo de variable se escriben las letras Ilo las cuales identifican las variables como variables de ILOG. En las líneas 5, 6, 7 y 8 se declaran los métodos privados que se van a implementar para crear las variables, los nodos, los vehículos y las visitas. En los métodos públicos encontramos el constructor, el destructor y un método que devuelve la instancia. Estos métodos están en las líneas 10, 11 y 12 respectivamente.. 1.. Class RoutingModel {. 2.. IloEnv _env;. 3.. IloModel _mdl;. 4.. IloDimension1 _weight;. 5.. void addDimensions();. 6.. void createIloNodes(const char* nodeFileName);. 7.. void createVehicles(const char* vehicleFileName);. 8.. void createVisits(const char* visitsFileName);. 9.. public:. 10.. RoutingModel(IloEnv env, int argc, char* argv[]);. 11.. ~RoutingModel() {}. 12.. IloEnv getEnv() const {. 13.. return _env;. 14.. }. 15.. IloModel getModel() const {. 16.. return _mdl;. 17.. }. 18.. };. Figura 2: Clase RoutingModel. Una vez se han declarado las variables y los métodos, sigue la implementación de éstos. En primera instancia se crea la clase RoutingModel en la línea 1, la cual va a contener los métodos previamente descritos. Para crear la información de los. 14.

(17) II.05(10).4. nodos, los vehículos y las visitas, la información es adquirida desde unos archivos de extensión .csv los cuales tiene un formato especial (ver siguiente sección). Se requieren tres archivos: uno para los nodos, otro para los vehículos y un último para las visitas. La línea 2 llama al método addDimensions, el cual es el encargado de pasarle al modelo las variables que se deben tener en cuenta para resolverlo. Posteriormente en las líneas 5,11 y 17 lee los archivos y llama a cada uno de sus métodos en las líneas 8, 14 y 20 respectivamente para la creación de los nodos, los vehículos y las visitas.. 1. RoutingModel::RoutingModel( IloEnv env, int argc, char* argv[]):_env(env), _mdl(env) { 2. addDimensions(); 3. char * nodeFileName; 4. if(argc < 2) 5. nodeFileName=(char*)“../../../examples/data/vrp20/vrp20nodes.csv”; 6. else 7. nodeFileName = argv[1]; 8. createIloNodes(nodeFileName); 9. char * vehiclesFileName; 10.if(argc < 3) 11.vehiclesFileName=(char*)“../../../examples/data/vrp20/vrp20vehicles .csv”; 12.else 13.vehiclesFileName = argv[2]; 14.createVehicles(vehiclesFileName); 15.char * visitsFileName; 16.if(argc < 4) 17.visitsFileName=(char*)“../../../examples/data/vrp20/vrp20visits.csv ”; 18.else 19.visitsFileName = argv[3]; 20.createVisits(visitsFileName); 21.} Figura 3: Constructor clase RoutingModel. 15.

(18) II.05(10).4. A continuación están implementados los métodos para adicionar las variables al modelo. Primero se adicionarán las variables de capacidad y de distancias, posteriormente se generarán los nodos, luego los vehículos y por último las visitas. ILOG trabaja con dos tipos de variables: Dimension1 y Dimension2 las cuales se diferencian en la forma en que se utilizan para el programa. Una variable tipo Dimension1 es aquella intrínseca a un objeto, como la capacidad a un vehículo, mientras que una variable tipo Dimension2 es extrínseca el objeto, como la distancia o el tiempo. En las líneas 3 y 5 se declara cada variable diciendo de qué tipo es y en las líneas 4 y 6 se le añaden al modelo. La variable distancia tiene una tercera característica cuando es declarada en la línea 5: IloEuclidean. Esto lo que hace es indicarle a ILOG de que manera va a buscar la distancia. Para efectos de este trabajo se trabajó con esta característica pues los resultados en la literatura dicen usar este tipo de distancia, pero ILOG también presenta otras maneras de medir la distancia entre nodos [22]. 1. Void 2. RoutingModel::addDimensions() { 3. _weight =IloDimension1 (_env, “weight”); 4. _mdl.add(_weight); 5. _distance =IloDimension2 (_env, IloEuclidean, “distance”); 6. _mdl.add(_distance); 7. } Figura 4: Método para crear variables. El siguiente método es para crear los nodos. ILOG presenta un lector de archivos con extensión .csv y también permite usar un iterador de líneas, para saber cuando se acaba el archivo, el cual se llama it como se ve en la línea 4. En la siguiente línea se empieza a iterar y hasta que no haya más líneas se van creando los nodos que el programa lee desde el archivo. El método de la línea 9 está. 16.

(19) II.05(10).4. predeterminado por ILOG para añadir los nodos al modelo. La línea 11 libera la memoria del computador cerrando el lector de archivos. 1. Void 2. RoutingModel::createIloNodes(const char* nodeFileName) { 3. IloCsvReader csvNodeReader(_env, nodeFileName); 4. IloCsvReader::LineIterator it(csvNodeReader); 5. while(it.ok()) { 6. IloCsvLine line = *it; 7. char * name = line.getStringByHeader(“name”); 8. IloNode node(_env, line.getFloatByHeader(“x”), line.getFloatByHeader(“y”), 0, name); 9. node.setKey(name); 10.++it;} 11.csvNodeReader.end(); 12.} Figura 5: Método para crear nodos.. El método para crear los vehículos funciona de manera similar al método anterior, pero adicionalmente se le introduce la capacidad a los vehículos (línea 17), se les dice de donde salen y a donde deben llegar (línea 15) y se pone el costo (línea 16) al vehículo con una relación directamente proporcional a la distancia recorrida. Para efectos de esta investigación se implementó un valor de 1 el cual significa que el costo es igual a la distancia. En este método también se implementan el lector de archivos y el iterador de líneas previamente expuestos. En las líneas 12 y 14 se le dice al vehículo en donde empieza y en donde termina, para efectos de este trabajo el vehículo empieza y termina en el único centro de distribución. En la línea 13 se le adiciona la variable de capacidad de tipo CumulVar que empieza desde 0 cada vez que pasa por donde salió el vehículo y se va acumulando hasta llegar a su capacidad máxima. En la línea 18 se adiciona el vehículo al modelo.. 17.

(20) II.05(10).4. 1. Void RoutingModel::createVehicles(const char* vehicleFileName) { 2. IloCsvReader csvVehicleReader(_env, vehicleFileName); 3. IloCsvReader::LineIterator it(csvVehicleReader); 4. while(it.ok()) { 5. IloCsvLine line = *it; 6. char * namefirst = line.getStringByHeader(“first”); 7. char * namelast = line.getStringByHeader(“last”); 8. char * name = line.getStringByHeader(“name”); 9. IloNum capacity = line.getFloatByHeader(“capacity”); 10.IloNode node1 = IloNode::Find(_env, namefirst); 11.IloNode node2 = IloNode::Find(_env, namelast); 12.IloVisit first(node1, “depot”); 13._mdl.add(first.getCumulVar(_weight) == 0); 14.IloVisit last(node2, “depot”); 15.IloVehicle vehicle(first, last, name); 16.vehicle.setCost(_distance, 1.0); 17.vehicle.setCapacity(_weight, capacity); 18._mdl.add(vehicle); 19.++it; } 20.csvVehicleReader.end(); 21.} Figura 6: Método para crear vehículos.. Este siguiente método crea las visitas y funciona de manera muy similar a los dos métodos anteriores con la diferencia que a cada visita se le adiciona su demanda, como se ve en la línea 12. En la línea 13 se adiciona la visita al vehículo. Para un mejor entendimiento del problema, por visitas se entiende clientes, es decir que la visita1 es igual al cliente1. Las visitas manejan variables de tipo TransitVar (línea 12) las cuales trabajan junto con las variables de tipo CumulVar, para que cuando pase el vehículo se le reste la demanda a su capacidad total restante y si es mayor que cero se permita el paso del vehículo por ese cliente.. 1. Void. 18.

(21) II.05(10).4. 2. RoutingModel::createVisits(const char* visitsFileName) { 3. IloCsvReader csvVisitReader(_env, visitsFileName); 4. IloCsvReader::LineIterator it(csvVisitReader); 5. while(it.ok()){ 6. IloCsvLine line = *it; 7. char * visitName = line.getStringByHeader(“name”); 8. char * nodeName = line.getStringByHeader(“node”); 9. IloNum quantity = line.getFloatByHeader(“quantity”); 10.IloNode node = IloNode::Find(_env, nodeName); 11.IloVisit visit(node, visitName); 12._mdl.add(visit.getTransitVar(_weight) == quantity); 13._mdl.add(visit); 14.++it; } 15.csvVisitReader.end(); 16.} Figura 7: Método para crear las visitas.. Hasta aquí llega la declaración del modelo con la implementación de sus métodos. Ahora continúa la declaración de la clase que soluciona el problema. De nuevo, en primera instancia se encuentra la declaración de las variables que se usarán y de los métodos a implementar. Es importante resaltar cómo se usan variables de tipo IloGoal, las cuales se utilizan para guardar en ellas las soluciones que va encontrando el programa. Esta parte del programa es igual para el CVRPTW pues esta clase se encarga de solucionar el problema con la información que se introdujo en la clase anterior. En la siguiente sección se mostrará qué cambios se deben hacer para introducir la información con restricciones de tiempo.. En la primera línea se declara la clase RoutingSolver y en las siguientes líneas las variables que se usarán dentro de la clase. Después de la línea 10 se declaran los métodos a implementar.. 1. Class RoutingSolver {. 19.

(22) II.05(10).4. 2. IloEnv _env; 3. IloModel _mdl; 4. IloSolver _solver; 5. IloDispatcher _dispatcher; 6. IloRoutingSolution _solution; 7. IloGoal _instantiateCost; 8. IloGoal _restoreSolution; 9. IloGoal _goal; 10.public: 11.RoutingSolver(RoutingModel mdl); 12.~RoutingSolver() {} 13.IloBool findFirstSolution(); 14.void improveWithNhood(); 15.void printInformation(const char* =0) const; 16.}; Figura 8: Clase RoutingSolver. Primero se implementa el constructor. En este método se le indica al programa con qué heurística se debe generar la solución inicial como se puede ver en la línea 9. ILOG ofrece seis diferentes heurísticas para generar la solución inicial. Estas son: 1. Dispatcher (Enumeración) 2. Savings (Ahorro) 3. NearestDepot (Cercano al centro de distribución) 4. NearestAddition (Vecino más cercano) 5. Sweep (Barrido) 6. Insertion (Inserción) Durante el análisis del programa se cambió la forma de generar la solución inicial para ver su repercusión cuando se mejora la solución. En las líneas 2 a 6 se ve como se hace la asignación de los valores a las variables. En las líneas 7,8 y 9. 20.

(23) II.05(10).4. inicializa el costo del problema, se va guardando la mejor solución encontrada y se genera la solución inicial [22].. 1. RoutingSolver::RoutingSolver(RoutingModel mdl): 2. _env (mdl.getEnv()), 3. _mdl (mdl.getModel()), 4. _solver (mdl.getModel()), 5. _dispatcher (_solver), 6. _solution (mdl.getModel()){ 7. _instantiateCost = IloDichotomize(_env, _dispatcher.getCostVar(), IloFalse); 8. _restoreSolution = IloRestoreSolution(_env, _solution); 9. _goal = IloSavingsGenerate(_env) && _instantiateCost; 10.} Figura 9: Constructor clase RoutingSolver.. El siguiente método se preocupa por saber si se generó o no la primera solución de manera correcta. Si el programa no logra encontrar una solución factible con la heurística (línea 3) devuelve que no existe un plan de ruteo factible y por lo tanto no soluciona el problema, pues no existe una solución la cual se pueda mejorar.. 1. IloBool 2. RoutingSolver::findFirstSolution() { 3. if (!_solver.solve(_goal)) { 4. _solver.error() << “Infeasible Routing Plan” << endl; 5. return IloFalse; 6. } 7. _solution.store(_solver); 8. return IloTrue; 9. } Figura 10: Método para aprobar la generación de la primera solución.. 21.

(24) II.05(10).4. El método para mejorar la solución genera vecindades o neighb orhoods. En el código se nombran los cinco métodos que contiene ILOG (líneas de 3 a 7), los cuales son: 1. IloTwoOpt 2. IloOrOpt 3. IloRelocate 4. IloCross 5. IloExchange De esta manera, cuando el programa no encuentre una mejora con el primer método, busca con el segundo. Si tampoco consigue mejorar la solución con este método, sigue con el tercero y así sucesivamente. Vale la pena aclarar que si el usuario quiere, puede buscar solo con un método, pero para este trabajo se usaron todos estos como lo muestra el código.. ILOG también permite usar otras heurísticas y metaheurísticas [22] para mejorar la solución. Estas heurísticas miran los vecindades anteriormente creados y a través de ellos aceptan o no la solución (linea 9). En la línea 10 se repite hasta que ya no existe una mejora a la solución y se pasa ese valor a su variable respectiva (línea 12). 1. Void 2. RoutingSolver::improveWithNhood() { 3. IloNHood nhood = IloTwoOpt(_env) 4. + IloOrOpt(_env) 5. + IloRelocate(_env) 6. + IloCross(_env) 7. + IloExchange(_env); 8. _solver.out() << “Improving solution” << endl; 9. IloGoal improve = IloSingleMove(_env, _solution, nhood, IloImprove(_env), _instantiateCost); 10.while (_solver.solve(improve)) { 11.}. 22.

(25) II.05(10).4. 12._solver.solve(_restoreSolution); 13.} Figura 11: Método para mejorar la primera solución.. El siguiente método es para imprimir la solución y ya viene implementado por ILOG. Dentro de éste se pueden encontrar, entre otras cosas: 1. Las rutas. 2. El numero de vehículos que se usan con la capacidad utilizada. 3. El costo de las rutas. 4. La primera solución y la mejorada. 5. El numero de nodos. 6. El numero de restricciones del problema. 7. La memoria usada por el computador. 8. El tiempo de corrida del programa. Para ver una imagen sobre como imprime y que imprime referirse a la sección de compilación de este mismo capítulo.. 1. Void 2. RoutingSolver::printInformation(const char* heading) const { 3. if(heading) 4. _solver.out()<<heading<<endl; 5. _solver.printInformation(); 6. _dispatcher.printInformation(); 7. _solver.out() << “===============” << endl 8. << “Cost : “ << _dispatcher.getTotalCost() << endl 9. << “Number of vehicles used : “ 10.<< _dispatcher.getNumberOfVehiclesUsed() << endl 11.<< “Solution : “ << endl 12.<< _dispatcher << endl; 13.} Figura 12: Método para imprimir la información.. 23.

(26) II.05(10).4. El siguiente método es el main. Dentro de éste se establece cómo debe correr el programa, es decir, se la da el orden de los métodos para que corra adecuadamente. En la línea 8 se puede hacer una modificación al método para usar alguna otra heurística o metaheurística con el fin de mejorar la solución inicial.. 1. Int main(int argc, char * argv[]) { 2. IloEnv env; 3. try { 4. RoutingModel mdl(env, argc, argv); 5. RoutingSolver solver(mdl); 6. if (solver.findFirstSolution()) { 7. solver.printInformation(“***First Solution***”); 8. solver.improveWithNhood(); 9. solver.printInformation(“***Improved Solution***”);} 10.} 11.catch(IloException& ex) { 12.cerr << “Error: “ << ex << endl; 13.} 14.env.end(); 15.return 0; 16.} Figura 13: Main.. ii. CVRPTW Para este problema solo se adicionan unas líneas al anterior en donde se le introducen las variables de tiempo. A continuación se muestran las líneas adicionales. •. Cuando se esta declarando el modelo inicial se le adiciona la siguiente línea para crear la variable de tiempo:. IloDimension2 _time; Figura 14: : Variable de tiempo.. 24.

(27) II.05(10).4. •. En el método de addDimensions() se adiciona la siguiente línea que le dice que adicione el tiempo y de que tipo es:. _time. =IloDimension2 (_env, IloEuclidean, “time”);. _mdl.add(_time); Figura 15: Descripción y adición de variable de tiempo.. •. El método de crear los vehículos queda del siguiente modo, pues se debe tener en cuenta cuando pueden pasar a realizar las visitas. Este método es muy similar al implementado para el CVRP con la diferencia que se adicionan líneas de código para tener en cuenta las ventanas de tiempo. Estas líneas son: la 15 y 17 las cuales miran que el vehículo llegue a hacer la visita en el tiempo permitido por los clientes. Estas restricciones se le adicionan al modelo.. 1. void 2. RoutingModel::createVehicles(const char* vehicleFileName) { 3. IloCsvReader csvVehicleReader(_env, vehicleFileName); 4. IloCsvReader::LineIterator. it(csvVehicleReader);. 5. while(it.ok()) { 6. IloCsvLine line = *it; 7. char * namefirst = line.getStringByHeader(“first”); 8. char * namelast = line.getStringByHeader(“last”); 9. char * name = line.getStringByHeader(“name”); 10.. IloNum capacity = line.getFloatByHeader(“capacity”);. 11.. IloNode node1 = IloNode::Find(_env, namefirst);. 12.. IloNode node2 = IloNode::Find(_env, namelast);. 13.. IloVisit first(node1, “depot”);. 14.. _mdl.add(first.getCumulVar(_weight) == 0);. 15.. _mdl.add(first.getCumulVar(_time)>=line.getFloatByHeader(“ope. n”)); 16.. IloVisit last(node2, “depot”);. 25.

(28) II.05(10).4. 17.. _mdl.add(last.getCumulVar(_time)<=line.getFloatByHeader(“clos. e”)); 18.. IloVehicle vehicle(first, last, name);. 19.. vehicle.setCost(_distance, 1.0);. 20.. vehicle.setCapacity(_weight, capacity);. 21.. _mdl.add(vehicle);. 22.. ++it;. 23.. }. 24.. csvVehicleReader.end();. 25.. }. Figura 16: Método para crear vehículos (CVRPTW).. •. Para el siguiente método nos damos cuenta que se le adicionan varias. líneas que recopilan la información de las restricciones de tiempo. Estas líneas son: la 9, 10,11 (las cuales son las encargadas de darle valor a las variables), 14 y 16 (cuadran el intervalo tiempo en el cual se puede hacer la visita y el tiempo que se demoran haciéndola). De resto el método es igual que para el problema de CVRP. El método de crear las visitas, totalmente implementado, queda del siguiente modo:. 1. void RoutingModel::createVisits(const char* visitsFileName) { 2. IloCsvReader csvVisitReader(_env, visitsFileName); 3. IloCsvReader::LineIterator. it(csvVisitReader);. 4. while(it.ok()){ 5. IloCsvLine line = *it; 6. char * visitName =. line.getStringByHeader(“name”);. 7. char * nodeName = line.getStringByHeader(“node”); 8. IloNum quantity = line.getFloatByHeader(“quantity”); 9. IloNum minTime. = line.getFloatByHeader(“minTime”);. 10.. IloNum maxTime. = line.getFloatByHeader(“maxTime”);. 11.. IloNum dropTime = line.getFloatByHeader(“dropTime”);. 12.. IloNode node = IloNode::Find(_env, nodeName);. 13.. IloVisit visit(node, visitName);. 14.. _mdl.add(visit.getDelayVar(_time) == dropTime);. 26.

(29) II.05(10).4. 15.. _mdl.add(visit.getTransitVar(_weight) == quantity);. 16.. _mdl.add(minTime <= visit.getCumulVar(_time) <= maxTime);. 17.. _mdl.add(visit);. 18.. ++it;. 19.. }. 20.. csvVisitReader.end();. 21.. }. Figura 17: Método para crear visitas (CVRPTW).. Con estos cambios se completa el programa para solucionar el CVRPTW. Vale la pena aclarar que los archivos de los cuales se adquiere la información también tienen un formato especial (Ver siguientes secciones). d. Compilación ILOG permite usar varios compiladores para solucionar los problemas. Sin embargo para este trabajo se usó Microsoft Visual C++ 6.0. ILOG trae ejemplos que compilan, sin embargo también enseña como hacerlo de manera independiente. Una vez se compila el programa, este corre en una ventana de Command Prompt y es ahí mismo donde imprime los resultados. A continuación están expuestos algunos de los resultados obtenidos:. En la primera imagen se puede ver una primera solución al problema planteado por Augerat, et al [21] Este problema consta de una dimensión de 32, lo cual significa que contiene 32 nodos incluyendo el centro de distribución o “depot” de donde salen y a donde llegan los camiones cuya capacidad es de 100. También para solucionar este problema se utilizaron 5 camiones. Lo que presentan las gráficas son dos diferentes soluciones, la primera es una solución inicial que se puede generar a través de diferentes heurísticas predeterminadas o incluso por una heurística programada por el usuario; mientras que la segunda siempre va a ser una solución mejorada usando búsqueda local u. 27.

(30) II.05(10).4. otras heurísticas también predeterminadas por el programa o por el usuario. Para el análisis sobre el comportamiento y la efecti vidad del programa se intentarán todas las posibles combinaciones de heurísticas para generar una solución inicial dejando pre-establecida la heurística de mejoramiento de la solución.. Figura 18: Imagen de impresión de primera solución.. 28.

(31) II.05(10).4. Con este programa se busca encontrar una buena solución, es decir que comparada con la solución encontrada por los autores del problema, se obtenga una muy cercana o incluso la misma, y en algún caso excepcional, una solución mejorada. De igual manera, cualquiera que sea la solución encontrada, se hará un análisis estadístico para mostrar la eficiencia de las librerías de ILOG. En la primera imagen se ve la primera solución encontrada con la heurística de la generación de ahorros (Savings). En esta primera solución se puede ver el costo total de los recorridos, el número de vehículos utilizados, las rutas de cada vehículo, las capacidades usadas por cada vehículo y las distancias recorridas por cada vehículo. También indica cuáles fueron las visitas que no pudieron realizarse, aunque para este ejemplo todas fueron realizadas. •. Costo: En la línea que dice “Cost” aparece un numero (907.109) el cual representa el costo de realizar las rutas expuestas posteriormente.. •. Número de vehículos usados: En la siguiente línea a la de los costos aparece “Number of vehicles used”, lo cual dice cuantos vehículos fueron necesitados para satisfacer las demandas de todos los clientes.. •. Visitas no realizadas: Dos líneas después de la línea de los vehículos usados, puede verse como todas las visitas fueron realizadas, lo que nos indica que todos los clientes fueron visitados.. •. Rutas: Las rutas están descritas para cada uno de los vehículos usados en el problema. En la primera solución está la ruta del vehículo 1:. Depot – Nodo 29 – Nodo 15 – Nodo 22 – Nodo 9 – Nodo 8 – Nodo 11 – Nodo 4 – Nodo 28 – Nodo 18 – Depot.. 29.

(32) II.05(10).4. Vale la pena aclarar que en la solución no dice nodo sino visita y su número correspondiente. Esto en realidad indica el nodo, pues así se definen las visitas en ILOG.. Figura 19: Imagen de impresión de la solución mejorada.. 30.

(33) II.05(10).4. La manera en que imprime es la misma, pero cambian los valores de los costos, las rutas y las capacidades usadas, mejorando el costo. e. Instancias. Las instancias que se usaron fueron descargadas de Internet [21]. Para el CVRP se usaron librerías de Augerat et al., de Fisher, de Christofides, Mingozzi y Toth, de Gillet y Johnson y de Golden, Wasil, Kelly y Chao [21]. Mientras que para el CVRPTW se usaron librerías de Solomon para 25,50 y 100 clientes y de Homberger [21].. f. Formato archivos El formato de los archivos de los cuales ILOG saca la información es diferente para cada tipo de problema. Aunque la diferencia radica en que unos llevan más información que los otros, debido a sus respectivas características. Es importante anotar que los archivos deben ser de extensión csv (coma separated value).. i. CVRP Nodos.csv: FIELD|NAMES name,x,y FIELD|KEYS 1,0,0 depot,82,76 nodo1,96,44 nodo2,50,5 nodo3,49,8 nodo4,13,7 nodo5,29,89 Figura 20: Formato Nodos.. 31.

(34) II.05(10).4. “FIELD|NAMES” se compone de: name que corresponde al nodo x que corresponde a la primera columna de valores que representan la coordenada x de la ubicación del nodo. y que corresponde a la segunda columna de valores que representan la coordenada y de la ubicación del nodo.. “FIELD|KEYS” se compone de: 1 que corresponde a la primera columna (nodos) 0 que corresponde a la columna de coordenandas x 0 que corresponde a la columna de coordenadas y. Estas dos líneas iniciales deben ir para mostrarle a ILOG como están ordenados los archivos Vehículos.csv: FIELD|NAMES name,first,last,capacity FIELD|KEYS 1,0,0,0 vehicle1,depot,depot,100 vehicle2,depot,depot,100 vehicle3,depot,depot,100 vehicle4,depot,depot,100 vehicle5,depot,depot,100 Figura 21: Formato vehículos.. “FIELD|NAMES” está compuesta por: name que corresponde a los vehículos. first que corresponde al lugar de partida del vehículo. last que corresponde al lugar de llegada del vehículo.. 32.

(35) II.05(10).4. capacity que corresponde a la capacidad de cada vehículo.. “FIELD|KEYS“está compuesta por: 1 que corresponde a la columna de los vehículos 0 que corresponde a la columna del lugar de origen 0 que corresponde a la columna del lugar de llegada 0 que corresponde a la columna de la capacidad de cada vehículo Estas dos líneas iniciales deben ir para mostrarle a ILOG como están ordenados los archivos Visitas.csv: FIELD|NAMES name,node,quantity FIELD|KEYS 1,0,0 visit1,nodo1,19 visit2,nodo2,21 visit3,nodo3,6 visit4,nodo4,19 visit5,nodo5,7 Figura 22: Formato visitas.. “FIELD|NAMES” se compone de: name que corresponde a la visita/cliente. node que corresponde al nodo que se asigna la visita/cliente. quantity que corresponde a la demanda de cada visita/cliente.. “FIELD|KEYS” se compone de: 1 que corresponde a la columna de las visitas 0 que corresponde a la columna de los nodos. 33.

(36) II.05(10).4. 0 que corresponde a la columna de las demandas Estas dos líneas iniciales deben ir para mostrarle a ILOG como están ordenados los archivos ii. CVRPTW Nodos.csv: El archivo es igual al archivo del problema tipo CVRP.. Vehículos.csv: FIELD|NAMES name,first,last,capacity,open,close FIELD|KEYS 1,0,0,0,0,0 vehicle1,depot,depot,200, 0,1236 vehicle2,depot,depot,200,0,1236 vehicle3,depot,depot,200, 0,,1236 vehicle4,depot,depot,200, 0,1236 vehicle5,depot,depot,200, 0,1236 Figura 23: Formato vehículos (CVRPTW).. “FIELD|NAMES” esta compuesta por: name que corresponde a los vehículos. first que corresponde al lugar de partida del vehículo. last que corresponde al lugar de llegada del vehículo. capacity que corresponde a la capacidad de cada vehículo. open corresponde a la hora de apertura del lugar de partida del vehículo. close corresponde a la hora de cierre del lugar de llegada del vehículo.. “FIELD|KEYS” esta compuesta por: 1 que corresponde a la columna de los vehículos. 0 que corresponde a la columna del lugar de origen.. 34.

(37) II.05(10).4. 0 que corresponde a la columna del lugar de llegada. 0 que corresponde a la columna de la capacidad de cada vehículo. 0 que corresponde a la columna de la hora de apertura. 0 que corresponde a la columna de la hora de cierre.. Estas dos líneas iniciales deben ir para mostrarle a ILOG como están ordenados los archivos. Visitas.csv: FIELD|NAMES name,node,quantity,minTime,maxTime,dropTime FIELD|KEYS 1,0, 0,0,0,0 visit1,nodo1,10,0,1127,90 visit2,nodo2,30,0,1125,90 visit3,nodo3,10 ,0,1129,90 visit4,nodo4,10 ,727,782,90 visit5,nodo5,10,0,1130,90 Figura 24: Formato visitas (CVRPTW).. “FIELD|NAMES” se compone de: name que corresponde a la visita/cliente. node que corresponde al nodo que se asigna la visita/cliente quantity que corresponde a la demanda del cliente. minTime que corresponde a la hora mínima a la que puede llegar el producto. maxTime que corresponde a la hora máxima a la que puede llegar el producto. dropTime que corresponde al tiempo necesario para realizar la visita.. “FIELD|KEYS” se compone de: 1 que corresponde a la columna de las visitas. 0 que corresponde a la columna de los nodos.. 35.

(38) II.05(10).4. 0 que corresponde a la columna de las demandas. 0 que corresponde a la columna de la hora mínima. 0 que corresponde a la columna de la hora máxima. 0 que corresponde a la columna del tiempo necesario.. Estas dos líneas iniciales deben ir para mostrarle a ILOG como están ordenados los archivos. 36.

(39) II.05(10).4. Capítulo 4 Resultados Experimentales a. CVRP Los resultados obtenidos se presentan en tablas. Las tablas para este tipo de problema se leen de la siguiente manera: Col 2. Col 1. Col 3. Col 4. Solución Inicial Enumeración. Tiempo. Col 5. Col 6. Col 7. Col 8. M ejor Solución. %. Solución Mejorada %. First Accept. Tiempo. Figura 25: Formato tabla resultados CVRP.. •. La columna uno lleva el nombre de la instancia.. •. La columna dos muestra el valor de la solución inicial que se obtiene con el programa.. •. La columna tres muestra cuanto tiempo (en segundos) se requiere para obtener la solución.. •. La cuarta y octava columna muestra el error porcentual que saca cada una de las soluciones con respecto a la séptima columna, que nos muestra la mejor solución obtenida, hasta el momento en la literatura [21].. •. La quinta y sexta columna muestran la solución mejorada al problema y el tiempo que el programa se demora en encontrarla.. A continuación se muestran los resultados obtenidos para las librerías de Augerat et al [21]..

(40) II.05(10).4. Solución Inicial. A-n32-k5 A-n33-k5 A-n44-k6 A-n54-k7 A-n64-k9 A-n80-k10. % 32,97% N/A N/A N/A N/A N/A. Solución Mejorada First Tiempo Accept 816,416 0 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A. Mejor Solución 784 661 937 1167 1401 1763. % 15,70% 14,59% 17,38% 10,47% 16,13% 10,97%. Solución Mejorada First Tiempo Accept 813,006 0 696,003 0 1028,29 0 1231,12 0,015 1567,1 0 1869,09 0. Mejor Solución 784 661 937 1167 1401 1763. % 3,70% 5,30% 9,74% 5,49% 11,86% 6,02%. % 87,38% 44,05% 70,99% 50,35% 57,43% 76,59%. Solución Mejorada First Tiempo Accept 850,907 0 662,264 0 1037,81 0 1297,35 0 1661,06 0,016 1921,36 0,016. Mejor Solución 784 661 937 1167 1401 1763. % 8,53% 0,19% 10,76% 11,17% 18,56% 8,98%. Solución Inicial Solución Mejorada First Vecino Cercano al Tiempo Tiempo Centro de Distribución Accept % 0,094 115,17% 960,084 0 1686,92 1310,65 0,063 98,28% 707,282 0 2056,67 0,093 119,50% 1065,13 0 2757,04 0,047 136,25% 1400,4 0 3128,56 0,062 123,31% 1716,76 0 4172,14 0,094 136,65% 2108,07 0,015. Mejor Solución 784 661 937 1167 1401 1763. % 22,46% 7,00% 13,67% 20,00% 22,54% 19,57%. Mejor Solución 784 661 937 1167 1401 1763. % 0,39% 1,98% 15,57% 15,60% 12,54% 21,47%. Enumeración. Tiempo. 1042,48 N/A N/A N/A N/A N/A. 0,047 N/A N/A N/A N/A N/A. Solución Inicial. A-n32-k5 A-n33-k5 A-n44-k6 A-n54-k7 A-n64-k9 A-n80-k10. Ahorro. Tiempo. 907,109 757,468 1099,88 1289,18 1627,03 1956,41. 0,047 0,047 0,187 0,109 0,14 0,203. Solución Inicial. A-n32-k5 A-n33-k5 A-n44-k6 A-n54-k7 A-n64-k9 A-n80-k10. A-n32-k5 A-n33-k5 A-n44-k6 A-n54-k7 A-n64-k9 A-n80-k10. Barrido. Tiempo. 1469,09 952,145 1602,15 1754,57 2205,53 3113,21. 0,062 0,062 0,047 0,062 0,125 0,093. Solución Inicial. A-n32-k5 A-n33-k5 A-n44-k6 A-n54-k7 A-n64-k9 A-n80-k10. Vecino más cercano. Tiempo. 1146,4 978,146 1328,69 1495,54 1942,18 2400,07. 0,031 0,031 0,047 0,047 0,062 0,094. % 46,22% 47,98% 41,80% 28,15% 38,63% 36,14%. Solución Mejorada First Tiempo Accept 787,082 0 674,117 0 1082,92 0 1349,01 0,016 1576,72 0 2141,59 0. % 4,13%.

(41) II.05(10).4. Solución Inicial. A-n32-k5 A-n33-k5 A-n44-k6 A-n54-k7 A-n64-k9 A-n80-k10. Inserción. Tiempo. 1275,47 1197,04 1613,92 1907,72 2327,13 3153,54. 0,11 0,125 0,156 0,234 0,328 0,531. % 62,69% 81,10% 72,24% 63,47% 66,10% 78,87%. Solución Mejorada First Tiempo Accept 1044,7 0 731,633 0 1049,77 0 1235,01 0 1623,9 0,016 1957,44 0. Mejor Solución 784 661 937 1167 1401 1763. % 33,25% 10,69% 12,04% 5,83% 15,91% 11,03%. Figura 26: Resultados Augerat et al.. A continuación se muestran los resultados obtenidos para las librerías de Fisher [21].. Solución Inicial. F-n45-k4 F-n72-k4 F-n135-k7. Enumeración. Tiempo. N/A 324,459 N/A. N/A 0,094 N/A. Solución Inicial Ahorro F-n45-k4 F-n72-k4 F-n135-k7. 1003,09 1426. Solución Inicial Barrido F-n45-k4 F-n72-k4 F-n135-k7. 1280,07 445,295 2748,22. % N/A 36,90% N/A. Solución Mejorada First Tiempo Accept N/A N/A 249,863 0,015 N/A N/A. Solución Mejorada First Tiempo Tiempo Accept 0,062 38,55% 807,883 0 Plan de ruteo no factible 0,515 22,72% 1330,24 0,015. Solución Mejorada First Tiempo Tiempo % Accept 0,031 76,81% 747,895 0 0,094 87,89% 279,078 0 0,203 136,51% 1281,15 0,015. Mejor Solución 724 237 1162. % N/A 5,43% N/A. Mejor Solución 724. % 11,59%. 1162. 14,48%. Mejor Solución 724 237 1162. % 3,30% 17,75% 10,25%. 39.

(42) II.05(10).4. F-n45-k4 F-n72-k4 F-n135-k7. Solución Inicial Solución Mejorada Vecino Cercano al First Tiempo Tiempo Centro de Distribución Accept % 0,031 159,06% 922,914 0,016 1875,58 1132,63 0,094 377,90% 288,113 0 3002,68 0,172 158,41% 1338,62 0,016. Mejor Solución 724 237 1162. % 27,47% 21,57% 15,20%. % 70,38% 61,14% 79,30%. Solución Mejorada First Tiempo Accept 726,605 0 279,385 0 1421,09 0,016. Mejor Solución 724 237 1162. % 0,36% 17,88% 22,30%. % 29,02% 54,53% 44,10%. Solución Mejorada First Tiempo Accept 754,723 0 255,963 0,015 1298,2 0,016. Mejor Solución 724 237 1162. % 4,24% 8,00% 11,72%. Solución Inicial. F-n45-k4 F-n72-k4 F-n135-k7. Vecino más cercano. Tiempo. 1233,57 381,897 2083,41. 0,125 0,062 0,172. Solución Inicial. F-n45-k4 F-n72-k4 F-n135-k7. Inserción. Tiempo. 934,078 366,225 1674,44. 0,234 0,344 1,078. Figura 27: Resultados Fisher.. A continuación se muestran los resultados obtenidos para las librerías de Christofides, Mingozzi y Toth [21]. So lu ción Inicial. M-n101-k10 M-n121-k7 M-n151-k12 M-n200-k16 M-n200-k17. Enu meración. Tiem po. 973,167 N/A N/A N/A N/A. 0,375 N/A N/A N/A N/A. % 18,68%. So lu ción Inicial. M-n101-k10 M-n121-k7 M-n151-k12 M-n200-k16 M-n200-k17. Ah orro. Tiem po. 939,993 1291,33 1299,39 1708 1708. 0,343 0,375 0,719 1,218 1,218. % 14,63% 24,89% 23,40% 24,40%. So lu ción Inicial. M-n101-k10 M-n121-k7 M-n151-k12 M-n200-k16 M-n200-k17. Barr ido. Tiem po. 1294,9 3348,49 2259,01 2920,3 2920,3. 0,125 0,203 0,344 0,438 0,438. % 57,91% 223,84% 114,53% 112,69%. So lució n Mejorada Fir st T iem po Accept 866,9 0 N/A N/A N/A N/A N/A N/A N/A N/A. Mejo r Solución 820 1034 1053 N /A 1373. So lució n Mejorada Fir st T iem po Accept 835,826 0 1172,77 0 1232,37 0,016 1564,16 0,032 1564,16 0,031. Mejo r Solución 820 1034 1053 N /A 1373. So lució n Mejorada Fir st T iem po Accept 1044,89 0 1341,24 0,015 1151,53 0,016 1532,85 0,032 1532,85 0,031. Mejo r Solución 820 1034 1053 N /A 1373. % 5,72% N/A N/A N/A N/A. % 1,93% 13,42% 17,03% 13,92%. % 27,43% 29,71% 9,36% 11,64%. 40.

(43) II.05(10).4. M-n101-k10 M-n121-k7 M-n151-k12 M-n200-k16 M-n200-k17. Solución Inicial Solución Mejorada Vecino Ce rcano al Centro First Tiempo Tiempo % de Distribución Accept 0,125 312,91% 1101,67 0,016 3385,87 0,172 218,58% 1439,53 0,016 3294,07 2259,01 0,25 114,53% 1151,53 0,032 0,421 2059,18 0,015 6461,41 0,422 370,61% 2059,18 0,031 6461,41. Solución Inicial Vecino más cercano M-n101-k10 M-n121-k7 M-n151-k12 M-n200-k16 M-n200-k17. 1186,7 1486,86 2259,01 1899,5. Tiempo. % 0,125 44,72% 0,141 43,80% 0,25 114,53% Plan de ruteo 0,406 38,35%. Solución Inicial Inserción M-n101-k10 M-n121-k7 M-n151-k12 M-n200-k16 M-n200-k17. 1124,79 1148,89 2506,12 3344,82. Tiempo. % 0,672 37,17% 0,875 11,11% 1,437 138,00% Plan de ruteo 2,656 143,61%. Solución Mejorada First Tiempo Accept 887,795 0,016 1207,62 0,015 1151,53 0,016 no factibl e 1415,38 0,015. Solución Mejorada First Tiempo Accept 992,747 0,015 1053,67 0,016 1094,15 0,015 no factibl e 1482,99 0,016. Mejor Solución 820 1034 1053 N/A 1373. % 34,35% 39,22% 9,36% 49,98%. Mejor Solución 820 1034 1053. % 8,27% 16,79% 9,36%. 1373. 3,09%. Mejor Solución 820 1034 1053. % 21,07% 1,90% 3,91%. 1373. 8,01%. Figura 28: Resultados Christofides, Mingozzi y Toth. A continuación se muestran los resultados obtenidos para las librerías de Gillet y Johnson [21]. Solución Inicial. G-N262-K25. Barrido. T iem po. 12549,3. 0,859. Solución Inicial Vecino Cercano al Centro de T iem po Distribución G-N262-K25 22528,5 0,844. % 105,09%. Solución Mejorada First Tiempo Accept 6623,08 0,031. Mejor Solución 6119. % 8,24%. % 268,17%. Solución Mejorada First Tiempo Accept 7095,56 0,031. Mejor Solución 6119. % 15,96%. 41.

(44) II.05(10).4. Solución Inicial. G-N262-K25. Vecino más cer cano. T iem po. 9003,57. 0,797. % 47,14%. Solución Mejorada First Tiempo Accept 6702,17 0,047. Mejor Solución 6119. % 9,53%. % 132,38%. Solución Mejorada First Tiempo Accept 6366,23 0,046. Mejor Solución 6119. % 4,04%. % 18,04%. Solución Mejorada First Tiempo Accept 5957,41 0,031. Mejor Solución 6119. % -2,64%. Solución Inicial. G-N262-K25. Inser ción. T iem po. 14219,1. 4,812. Solución Inicial. G-N262-K25. Ahorro. T iem po. 7223,15. 2,185. Figura 29: Resultados Gillet y Johnson.. A continuación se muestran los resultados obtenidos para las librerías de Golden, Wasil, Kelly y Chao [21].. 42.

(45) II.05(10).4. Solución Inicial. G-Kelly-240 G-Kelly-360 G-Kelly-400 G-Kelly-480. Ahorro. Tiempo. 28892 24962,9 27269,5 18622,7. 1,609 3,453 4,391 7,703. Solución Mejorada % 411,68% 125,96% 134,09% 1028,01%. Solución Inicial. G-Kelly-240 G-Kelly-360 G-Kelly-400 G-Kelly-480. Barrido. Tiempo. 76610,8 98579,3 120260 39832,7. 0,625 1,14 1,422 2,656. G-Kelly-240 G-Kelly-360 G-Kelly-400 G-Kelly-480. Solución Inicial Vecino Tiempo Cercano al 153652 0,657 190602 1,156 227494 1,422 73529,2 2,937. G-Kelly-240 G-Kelly-360 G-Kelly-400 G-Kelly-480. Solución Inicial Vecino más Tiempo cercano 30226,7 0,5 28683,2 0,906 30397,8 1,109 20183,8 2,562. G-Kelly-240 G-Kelly-360 G-Kelly-400 G-Kelly-480. Tiempo. 47987,7 52204,6 59236,2 20479,4. 5,375 11,609 12,625 17,827. Tiempo. 27059,1 24287,9 26856,4 18060,2. 0,047 0,063 0,078 0,094. Mejor Solución 5646,46 11047,69 11649,06 1650,94. % 379,22% 119,85% 130,55% 993,93%. Mejor Solución 5646,46 11047,69 11649,06 1650,94. % 378,67% 131,63% 146,12% 1029,25%. Mejor Solución 5646,46 11047,69 11649,06 1650,94. % 454,97% 189,25% 166,20% 1045,00%. Mejor Solución 5646,46 11047,69 11649,06 1650,94. % 411,78% 133,77% 133,25% 1015,40%. Mejor Solución 5646,46 11047,69 11649,06 1650,94. % 407,40% 158,90% 153,85% 1053,50%. Solución Mejorada % 1256,79% 792,31% 932,36% 2312,73%. First Accept. Tiempo. 27028 25590,3 28670,7 18643,3. 0,047 0,062 0,062 0,109. Solución Mejorada % 2621,21% 1625,27% 1852,90% 4353,78%. First Accept. Tiempo. 31335,9 31955,7 31010,3 18903,2. 0,047 0,063 0,078 0,094. Solución Mejorada % 435,32% 159,63% 160,95% 1122,56%. Solución Inicial Inserción. First Accept. First Accept. Tiempo. 28897,4 25825,9 27171,9 18414,6. 0,047 0,063 0,063 0,078. Solución Mejorada % 749,87% 372,54% 408,51% 1140,47%. First Accept. Tiempo. 28650,1 28602,8 29571,7 19043,6. 0,047 0,062 0,078 0,094. Figura 30: Resultados Goleen, Wasil, Kelly y Chao.. 43.

(46) II.05(10).4. b. CVRPTW Los resultados obtenidos se presentan en tablas. Las tablas para este tipo de problema se leen de la siguiente manera: Col1. Col2. Col3. Col4. Col5. Col6. Solución Inicial In serción. T iemp o. Vehículo s Usad os. %. Col7. Col8. Col9 Col10 Col11 Col12. Solución Mejo rada Bú squ eda Tiempo # Carro s Loca l. Vehículos Usad os. %. # Car ros. Col13 Mejo r So lu ció n. Vehículos Mejo r So lu ció n. Figura 31: Formato tabla resultados CVRPTW.. Leyendo de izquierda a derecha: •. La columna uno lleva el nombre de la instancia.. •. La columna dos muestra el valor de la solución inicial que se obtiene con el programa.. •. La columna tres muestra cuanto tiempo (en segundos) se requiere para obtener la solución.. •. La columna cuatro muestra el número de vehículos que se usaron para obtener la solución inicial.. •. La quinta columna muestra el error porcentual de las soluciones obtenidas con la primera solución, con respecto a la mejor solución obtenida según la literatura [21]. De igual forma funciona la columna 10 para la solución mejorada.. •. La sexta columna muestra la diferencia de carros que se usan para obtener la solución inicial, con respecto a los carros de la mejor solución obtenida según la literatura [21]. De igual forma funciona la columna 11 para la solución mejorada.. •. Las columnas 7,8 y 9 muestran lo mismo que las columnas 2,3 y 4 pero para la solución mejorada.. 44.

(47) II.05(10).4. •. Las columnas 12 y 13 muestran la mejor solución y el número de vehículos que se usaron para hallarla [21] respectivamente.. A continuación se muestran los resultados obtenidos para las librerías de Solomon de 25 clientes [21]. Solución Inicial. C-103 C-108 C-204 R-102 R-108 R-202 R-210 RC-104 RC-202 RC-207. Enumeración. Tiempo. 314,101 341,008 504,564 971,977 636,893 708,373 654,602 535,481 629,198 547,315. 0,047 0,047 0,062 0,047 0,047 0,031 0,046 0,047 0,046 0,047. Vehículos Usados 7 7 7 16 9 10 9 6 7 6. Solución Mejorada Búsqueda Vehículos Tiempo % # Carros Local Usados % # Carros 65,06% 4 190,738 0,016 3 0,23% 0 78,26% 4 191,814 0,015 3 0,27% 0 136,77% 6 265,81 0,016 3 24,73% 2 77,66% 9 566,805 0,015 8 3,60% 1 60,31% 5 421,572 0,015 4 6,11% 0 72,56% 6 412,192 0,016 4 0,41% 0 61,79% 6 427,543 0,016 3 5,67% 0 74,65% 3 321,123 0,016 3 4,74% 0 86,15% 4 393,531 0,015 4 16,43% 1 83,48% 3 299,498 0,016 3 0,40% 0. Mejor Vehículos Mejor Solución Solución 3 190,3 3 191,3 1 213,1 547,1 7 397,3 4 4 410,5 3 404,6 3 306,6 3 338 3 298,3. Vehículos Usados 4 4 3 7 4 4 3 4 4 2. % 40,85% 36,23% 35,40% 26,43% 27,39% 36,69% 30,58% 20,65% 93,83% 50,36%. Solución Mejorada Vehículos Búsqueda Tiempo Usados % # Carros # Carros Local 1 191,951 0,016 3 0,87% 0 1 191,814 0 3 0,27% 0 2 276,353 0,016 3 29,68% 2 0 548,95 0,016 7 0,34% 0 0 428,151 0,031 4 7,77% 0 0 442,808 0 3 7,87% -1 0 436,735 0,015 3 7,94% 0 1 362,364 0,015 4 18,19% 1 1 339,574 0 3 0,47% 0 -1 312,384 0 2 4,72% -1. Mejor Vehículos Mejor Solución Solución 190,3 3 3 191,3 1 213,1 7 547,1 4 397,3 4 410,5 3 404,6 3 306,6 3 338 3 298,3. Vehículos Usados 8 8 4 8 5 4 3 5 4 4. Solución Mejorada Vehículos Búsqueda Tiempo Usados % # Carros % # Carros Local 161,64% 5 258,811 0,016 4 36,00% 1 151,60% 5 191,814 0,015 3 0,27% 0 93,24% 3 294,085 0 3 38,00% 2 43,48% 1 548,95 0,015 7 0,34% 0 38,13% 1 443,179 0,016 4 11,55% 0 49,95% 0 426,395 0,015 3 3,87% -1 43,75% 0 441,525 0 3 9,13% 0 90,30% 2 312,267 0,016 3 1,85% 0 74,32% 1 398,079 0,016 4 17,77% 1 118,79% 1 298,95 0 3 0,22% 0. Mejor Vehículos Mejor Solución Solución 190,3 3 3 191,3 213,1 1 547,1 7 397,3 4 4 410,5 3 404,6 3 306,6 3 338 3 298,3. Solución Inicial. C-103 C-108 C-204 R-102 R-108 R-202 R-210 RC-104 RC-202 RC-207. Ahorro. Tiempo. 268,03 260,602 288,544 691,713 506,121 561,102 528,316 369,901 655,153 448,537. 0,047 0,047 0,063 0,063 0,094 0,062 0,062 0,062 0,046 0,062. Solución Inicial. C-103 C-108 C-204 R-102 R-108 R-202 R-210 RC-104 RC-202 RC-207. Barrido. Tiempo. 497,909 481,315 411,785 784,952 548,793 615,528 581,604 583,446 589,185 652,665. 0,063 0,126 0,047 0,078 0,141 0,123 0,046 0,077 0,047 0,062. 45.

(48) II.05(10).4. C-103 C-108 C-204 R-102 R-108 R-202 R-210 RC-104 RC-202 RC-207. Solución Inicial Vecino cercano al centro de distribución 453,319 400,272 590,687 1097,81 987,367 954,015 1051,38 890,62 1111,77 1178,94. Tiempo 0,047 0,063 0,047 0,062 0,047 0,062 0,047 0,062 0,062 0,062. Vehículos Usados 6 5 6 13 9 7 6 7 5 4. Solución Mejorada Búsqueda Vehículos Tiempo % # Carros Local Usados 138,21% 3 194,541 0 3 109,24% 2 191,814 0,016 3 3 177,19% 5 265,81 0,016 100,66% 6 564,304 0,016 7 148,52% 5 429,221 0,016 4 3 132,40% 3 437,517 0,016 159,86% 3 421,682 0,016 3 190,48% 4 366,742 0 4 228,93% 2 339,574 0,015 3 295,22% 1 309,116 0,015 2. Vehículos Usados 5 5 6 14 7 7 5 5 5 4. Solución Mejorada Búsqueda Vehículos Tiempo % # Carros Local Usados 99,82% 2 194,541 0 3 3 84,86% 2 191,814 0,016 156,71% 5 272,876 0,015 3 75,69% 7 562,699 0,015 7 5 59,01% 3 439,625 0,032 73,66% 3 448,514 0,016 3 71,20% 2 428,729 0,015 3 311,139 0,015 3 91,41% 2 98,89% 2 338,824 0,031 3 75,60% 1 299,498 0,015 3. Vehículos Usados 3 3 3 8 5 3 2 4 3 2. Solución Mejorada Búsqueda Vehículos Tiempo % # Carros Local Usados 29,62% 0 193,027 0 3 191,814 0 3 3,63% 0 60,73% 2 288,895 0 3 7 37,98% 1 548,95 0,016 64,12% 1 422,091 0,015 4 27,51% -1 433,71 0,016 3 2 40,04% -1 454,611 0,016 41,06% 1 363,815 0,015 4 12,75% 0 339,574 0,016 3 2 11,82% -1 329,528 0,016. Solución Inicial Vecino más cercano Tiempo C-103 C-108 C-204 R-102 R-108 R-202 R-210 RC-104 RC-202 RC-207. 380,256 353,632 547,039 961,185 631,742 712,874 692,672 586,869 672,233 523,818. 0,047 0,047 0,141 0,047 0,11 0,047 0,062 0,062 0,046 0,047. Solución Inicial. C-103 C-108 C-204 R-102 R-108 R-202 R-210 RC-104 RC-202 RC-207. In serción. Tiempo. 246,667 198,24 342,51 754,867 652,05 523,448 566,612 432,501 381,083 333,564. 0,266 0,25 0,329 0,314 0,275 0,247 0,249 0,25 0,265 0,265. % 2,23% 0,27% 24,73% 3,14% 8,03% 6,58% 4,22% 19,62% 0,47% 3,63%. Mejor Vehículos Mejor # Carros Solu ción Solució n 0 3 190,3 0 3 191,3 213,1 2 1 0 7 547,1 0 4 397,3 410,5 -1 4 0 3 404,6 1 3 306,6 0 3 338 -1 3 298,3. % 2,23% 0,27% 28,05% 2,85% 10,65% 9,26% 5,96% 1,48% 0,24% 0,40%. Mejor Vehículos Mejor # Carros Solu ción Solució n 0 3 190,3 0 3 191,3 2 1 213,1 0 7 547,1 1 4 397,3 -1 4 410,5 404,6 0 3 0 3 306,6 0 3 338 0 3 298,3. % 1,43% 0,27% 35,57% 0,34% 6,24% 5,65% 12,36% 18,66% 0,47% 10,47%. Mejor Vehículos Mejor # Carros Solu ción Solució n 0 3 190,3 0 3 191,3 2 1 213,1 0 7 547,1 0 4 397,3 -1 4 410,5 -1 3 404,6 1 3 306,6 0 3 338 -1 3 298,3. Figura 32: Resultados Solomon 25.. 46.

(49) II.05(10).4. A continuación se muestran los resultados obtenidos para las librerías de Solomon de 50 clientes [21].. Solu ció n In icia l. C-105 C-109 C-202 C-205 C-206. Enumeración. Tiempo. 640,207 670,365 998,252 733,229 794,785. 0,078 0,062 0,109 0,063 0,063. Vehículo s Usados 12 10 14 10 10. % # Carros 76,6 6% 7 84,9 8% 5 177,1 4% 11 103,7 9% 7 120,9 0% 7. Solució n Mejorada Búsqueda Vehículo s Tiempo Local Usados 363,247 0,015 5 422,749 0,016 6 373,232 0,016 3 420,852 0,016 4 388,574 0,016 3. Mejo r Vehículo s Mejor % # Carros Solució n Solu ció n 0,2 3% 0 362,4 5 16,6 5% 1 362,4 5 3,6 2% 0 360,2 3 16,9 7% 1 359,8 3 359, 8 8,0 0% 0 3. % # Carros 42,1 7% 1 19,4 9% 1 37,4 7% 0 16,3 8% 0 17,9 3% 0. Solució n Mejorada Búsqueda Vehículo s Tiempo Local Usados 363,247 0,016 5 363,247 0,016 5 361,797 0,031 3 361,413 0,016 3 361,413 0,032 3. % 0,2 3% 0,2 3% 0,4 4% 0,4 5% 0,4 5%. Mejo r Vehículo s Mejor # Carros Solució n Solu ció n 0 362,4 5 362, 4 0 5 0 360,2 3 0 359,8 3 0 359,8 3. % # Carros 235,2 4% 8 139,9 2% 3 246,4 2% 9 184,1 8% 6 131,9 4% 3. Solució n Mejorada Búsqueda Vehículo s Tiempo Local Usados 398,783 0,016 5 489,756 0,016 6 439,871 0,016 4 361,413 0,016 3 388,574 0,016 3. Mejo r Vehículo s Mejor % # Carros Solució n Solu ció n 10,0 4% 0 362,4 5 35,1 4% 1 362,4 5 360, 2 22,1 2% 1 3 0,4 5% 0 359,8 3 8,0 0% 0 359,8 3. % # Carros 300,0 5% 7 224,6 7% 3 365,3 3% 9 281,3 2% 6 212,0 1% 4. Solució n Mejorada Búsqueda Vehículo s Tiempo Local Usados 363,247 0,016 5 433,547 0,032 6 423,379 0,032 4 361,413 0,016 3 361,413 0,016 3. % 0,2 3% 19,6 3% 17,5 4% 0,4 5% 0,4 5%. Solu ció n In icia l. C-105 C-109 C-202 C-205 C-206. Ahorro. Tiempo. 515,229 433,037 495,155 418,737 424,308. 0,093 0,094 0,094 0,109 0,094. Vehículo s Usados 6 6 3 3 3. Solu ció n In icia l. C-105 C-109 C-202 C-205 C-206. C-105 C-109 C-202 C-205 C-206. Barri do. Tiempo. 1214,9 869,462 1247,8 1 1022,4 8 834,514. 0,093 0,093 0,093 0,1 4 0,078. Vehículo s Usados 13 8 12 9 6. Solu ció n In icia l Vehículo s Vecino cercano al centro Tiempo Usados de distri bución 1449,7 9 0,109 12 1176,6 2 0,078 8 1676,1 1 0,093 12 1372 0,171 9 1122,6 0,094 7. Mejo r Vehículo s Mejor Soluci ó n Solu ció n # Carros 5 0 362,4 5 1 362,4 3 1 360,2 359, 8 0 3 0 359,8 3. 47.

(50) II.05(10).4. SoluciónInic al. C-105 C-109 C-20 C-205 C-206. Soul cói nMe joar da Vehículos Bús queda Vehículos Mejor Vehículos Meoj r Tiempo Vecinomás cercano Tiempo Usados % # Car os Local Usados % # Ca ros Solución Soulc ión 14 9,79 0, 93 12 30 ,0 5% 7 36 ,247 0, 16 5 0,2 3% 0 362,4 5 821,317 0, 78 9 12 6, 3% 4 36 ,247 0, 15 5 0,2 3% 0 362,4 5 1 42,8 0, 78 10 21 7,2 9% 7 387,23 0, 16 3 7,5 0% 0 360,2 3 8 1,501 0,156 9 14 5,0 % 6 361,413 0, 31 3 0,4 5% 0 359,8 3 7 69,0 4 0, 78 7 1 3,7 4% 4 415,98 0, 16 4 15,62% 1 359,8 3. SoluciónInic al Inserción C-105 C-109 C-20 C-205 C-206. 36 ,247 4 1,925 53 ,639 4 23,7 3 489,62. Soul cói nMe joar da Vehículos Bús queda Vehículos Mejor Vehículos Meoj r Tiempo Tiempo Usados % # Car os Local Usados % # Ca ros Solución Soulc ión 0,592 5 0 ,23 % 0 36 ,247 0, 15 5 0,2 3% 0 362,4 5 0,592 5 21,94% 0 389,63 0, 15 5 7,5 2% 0 362,4 5 0,592 3 48,15% 0 41 ,905 0, 15 3 14,35% 0 360,2 3 0,576 3 17, 7% 0 361,413 0, 15 3 0,4 5% 0 359,8 3 0,592 3 36,08% 0 361,413 0, 31 3 0,4 5% 0 359,8 3. Figura 33: Resultados Solomon 50.. 48.

Referencias

Documento similar