0.01 0.25 150 20148.206.53.84/tesiuami/204214001.pdf · No suponen una resolución real del TSP y...

83
1 20 150 0.25 0.01

Transcript of 0.01 0.25 150 20148.206.53.84/tesiuami/204214001.pdf · No suponen una resolución real del TSP y...

1

201500.250.01

2

Índice.

Tutorial de Optimización Basado en el Agente Viajero………………………………………..4

Parte I Introducción……………………………………………………………………………………………...4

Problema del viajero……………………………………………………………………………………………….4

Situación actual respecto de su resolución……………………………………………………………….4

Casuística……………………………………………………………………………………………………………….5

Convergencia del Problema……………………………………………………………………………………..5

Aplicaciones……………………………………………………………………………………………………………6

Aspectos generales……………………………………………………………………………………………….6

Resumen………………………………………………………………………………………………………………...6

Etapas del Proyecto…………………………………………………………………………………………………7

Objetivos del Proyecto…………………………………………………………………………………………….7

Parte II Planteamiento de la Solución…………………………………………………………………..7

3

Metodología……………………………………………………………………………………………………………7

Contenido del Tutorial Vía Web……………………………………………………………………………….8

Problema del Agente Viajero: Introducción, Descripción y Solución............................8

Introducción…………………………………………………………………………………………………………...8

Descripción…………………………………………………………………………………………………………….9

Solución al Problema del Agente Viajero………………………………………………………………...10

Solución improcedente………………………………………………………………………………………….11

Explicación del Algoritmo por Etapas…………………………………………………………………….11

Matriz de Adyacencia…………………………………………………………………………………………….12

Herramientas utilizadas……………………………………………………………………………………..17

Navegador mozilla firefox y Explorer……………………………………………………………………..17

Xampp………………………………………………………………………………………………………………….18

Php………………………………………………………………………………………………………………………19

Manual técnico……………………………………………………………………………………………………20

4

Estructura de un Codigo en php……………………………………………………………………………..20

Estructura de un Tutorial Via Web…………………………………………………………………………20

Principal.html……………………………………………………………………………………………………….21

Solución Improcedente.html………………………………………………………………………………….29

Etapa1.html…………………………………………………………………………………………………………..31

Etapa2.html…………………………………………………………………………………………………………..33

Implementación del código de nuestro Algoritmo……………………………………………..42

Torneo.php…………………………………………………………………………………………………………...42

Genetico.php…………………………………………………………………………………………………………59

Manual de usuario………………………………………………………………………………………………...61

Conclusiones…………………………………………………………………………………………………………72

Referencias…………………………………………………………………………………………………………...73

5

TUTORIAL DE OPTIMIZACIÓN BASADO EN EL AGENTE VIAJERO

Parte I. INTRODUCCION:

Problema del viajante

Si un viajante parte de la ciudad A y las distancias a todas las demás ciudades son conocidas, ¿cuál es la ruta óptima que debe elegir para visitar todas las ciudades y volver a la ciudad de partida?

El problema del viajante es un ejemplo que muestra y analiza la problemática que subyace tras algunos tipos de problemas matemáticos que a priori parecen tener una solución relativamente fácil, y en la práctica presentan un gran problema.La respuesta al problema es conocida, es decir se conoce la forma de resolverlo, pero sólo en teoría, en la práctica la solución no es aplicable debido al tiempo que computacionalmente se precisa para obtener su resultado (Para una mayor profundidad en el tema ver el artículo NP-completos).El problema del viajante (también conocido como problema del viajante de comercio o por sus siglas en inglés TSP: Travelling

6

Salesman Problem), es uno de los problemas más famosos (y quizás el mejor estudiado) en el campo de la optimización combinatoria computacional. A pesar de la aparente sencillez de su planteamiento, el TSP es uno de los más complejos de resolver y existen demostraciones que equiparan la complejidad de su solución a la de otros problemas aparentemente mucho más complejos que han retado a los matemáticos desde hace siglos.

Situación actual respecto de su resolución

Desde el punto de vista práctico, el problema no está resuelto y desde el punto de vista teórico, las técnicas empleadas son sólo aproximaciones. No suponen una resolución real del TSP y sólo ofrecen soluciones aproximadas suficientemente aceptables.Los algoritmos clásicos no son capaces de resolver el problema general, debido a la explosión combinatoria de las posibles soluciones. Por ello, a su solución se han aplicado distintas técnicas computacionales: heurísticas evolutivas, redes de Hopfield, etc.CasuísticaHay algoritmos que se basan en una configuración concreta del problema. Por ejemplo, algunos algoritmos de ramificación y consolidación se pueden utilizar para resolver problemas de entre 40 a 60 ciudades.

Otros han mejorado a éstos con técnicas reminiscentes de la programación lineal que permiten resolver el TSP para valores de N entre 120 y 200 ciudades.

En el año 2001 se utilizó una red de 110 ordenadores para resolver el TSP para las 15 112 poblaciones de Alemania y utilizando el equivalente computacional a 22,5 años de un PC.

En mayo del 2004 se aplicaron algunas de estas técnicas para la resolución del problema aplicado a las 24 978 poblaciones suecas en un ciclo de unos 72 500 km (probándose además que no se podía encontrar un ciclo más corto).

Los algoritmos genéticos, basados en heurísticas no encuentran soluciones exactas, pero permiten encontrar aproximaciones suficientemente buenas (un 97% de optimización) y se pueden aplicar a conjuntos de ciudades muy grandes (redes con millones de nodos) con tiempos de ejecución razonables en un superordenador (semanas o meses).

Convergencia del problema

Una formulación equivalente en términos de la teoría de grafos es la de encontrar en un grafo completamente conexo y con arcos ponderados el ciclo hamiltoniano de menor coste. En esta formulación cada vértice del

7

grafo representa una ciudad, cada arco representa una carretera y el peso asociado a cada arco representa la longitud de la carretera.El TSP está entre los problemas denominados NP-completos, esto es, los problemas que no se pueden resolver en tiempo polinomial en función del tamaño de la entrada (en este caso el número N de ciudades que el viajante debe recorrer). Sin embargo, algunos casos concretos del problema sí han sido resueltos hasta su optimización, lo que le convierte en un excelente banco de pruebas para algoritmos de optimización que pertenezcan a la misma familia (lo que en jerga matemática se denominan problemas isomorfos).

Aplicaciones

El problema tiene considerables aplicaciones prácticas, aparte de las más evidentes en áreas de logística de transporte, que cualquier negocio de reparto, pequeño o grande, conoce. Por ejemplo, en robótica, permite resolver problemas de fabricación para minimizar el número de desplazamientos al realizar una serie de perforaciones en una plancha o en un circuito impreso. También puede ser utilizado en control y operativa optimizada de semáforos, etc.ASPECTOS GENERALES.RESUMEN:

1.- Se desea desarrollar un tutorial vía web, con un ejemplo para la descripción de la aplicación de Optimización en la solución de problemas. Tal es el caso del Agente Viajero.

El objetivo de este proyecto es mostrar al usuario paso por paso el funcionamiento de la aplicación de la optimización en un problema específico para que sea una forma agradable de comprender la teoría.

Se mostrará paso a paso la aplicación de Optimización en el problema del agente viajero donde el usuario avanzará a su ritmo el avance de la solución del problema seleccionado, una vez entendida la teoría se espera que el usuario pueda aplicarla en otros ejemplos propuestos.

El paquete tendrá una parte teórica y otra práctica.

2.- Situación actual del tema al que se relaciona el proyecto.

Existe software para aplicar varias líneas de Inteligencia Artificial, algunos son muy complejos, otros no funcionan adecuadamente sin embargo los objetivos de este proyecto son:

1. Que el alumno de proyecto terminal entienda el funcionamiento y la aplicación de la teoría de optimización.

8

2. Que el alumno diseñe un tutorial vía web y programe un algoritmo de forma sencilla para que los usuarios puedan aprender rápidamente la teoría.

3. Si los usuarios saben bien cómo funciona la optimización aplicada a un problema específico ellos pueden usar herramientas como el MATLAB donde indiquen adecuadamente los parámetros y puedan solucionar problemas más complejos.

ETAPAS DEL PROYECTO:

1. Estudiar la teoría para redactar la que va a contener el material didáctico.

2. Entender el funcionamiento de la optimización para poder definir el algoritmo en el diseño del tutorial.

3. Diseñar el paquete computacional, pantallas para el usuario, cómo se mostraran los resultados, etc.

4. Definir el software con que se va a programar.

5. Seleccionar el problema para su aplicación que en este caso ya se tiene y es el problema del agente viajero.

6. Documentar el proyecto por medio de una bitácora para tener el material necesario para el desarrollo del reporte final.

7. Hacer el manual de usuario y técnico del paquete computacional.

OBJETIVOS DEL PROYECTO:

1. Desarrollar un paquete computacional que cumpla con las expectativas, para que pueda servir como material didáctico para los alumnos de las UEAS de inteligencia artificial de la licenciatura en computación

2. Objetivos específicos: a continuación se darán los objetivos que más nos interesan en la realización de este proyecto:

1. Que el alumno entienda el funcionamiento de optimización, para que a si se lleve con éxito la realización del tutorial.

2. Que el alumno diseñe un tutorial vía web y programe un ejemplo (agente viajero) de forma sencilla para que los usuarios puedan aprender rápidamente la teoría y a su vez el programa funcione correctamente, para que pueda servir como material de apoyo a los alumnos.

9

3. Que el programa sirva como herramienta para los usuarios y posteriormente los usuarios puedan resolver problemas como este o más complejos sin ningún problema y les ayude en sus materias.

PLANTEAMIENTO DE LA SOLUCIÓN.

METODOLOGIA:

Esta se hizo por etapas las cuales son las siguientes:

La primera etapa fue hacer una investigación extensa hacia los problemas de optimización, entenderla a fondo, y aplicarla en algún ejemplo, en este caso la aplicación de la teoría fue para el Problema del Agente Viajero que corresponde a este proyecto de investigación.

Posteriormente para la segunda etapa se instalo un servidor independiente de plataforma, para poder alojar ahí nuestra página web del tutorial del Agente Viajero.

Para la tercera etapa se hizo la construcción de la página web, (código en html), la cual se dividió en tres partes:

1.- Introducción al Problema del Agente Viajero.

2-.- Descripción del Problema.

3.- Solución al Problema.

En la cuarta etapa se construyo el programa (hecho en PHP) del agente viajero.

En la quinta y última etapa, ya una vez teniendo la pagina web completa y el programa, se hicieron las ligas para la parte de la solución del problema ya que ahí se hicieron cuatro ligas las cuales describen una solución improcedente al agente viajero, la otra explica la primera parte del programa y posteriormente la tercera explica la ultima parte del programa y para finalizar la última liga se hizo para ver la corrida del programa.

CONTENIDO DEL TUTORIAL VIA WEB:

PROBLEMA DEL AGENTE VIAJERO: INTRODUCCION, DESCRIPCIÓN Y SOLUCIÓN.

Introducción:

El Problema del Agente Viajero (PAV), es un ejemplo que muestra y analiza la problemática que subyace tras algunos tipos de problemas matemáticos que a priori parecen tener una solución relativamente fácil, y en la práctica presentan un gran problema. La respuesta al problema

10

es conocida, es decir se conoce la forma de resolverlo, pero sólo en teoría, en la práctica la solución no es aplicable debido al tiempo que computacionalmente se precisa para obtener su resultado (problema de tipo NP-hard). El problema del agente viajero (también conocido como el problema del viajante de comercio o por sus siglas en inglés: TSP = TRAVELING SALESMAN PROBLEM) es uno de los problemas más famosos (y quizás el mejor estudiado) en el campo de la optimización combinatoria computacional. A pesar de la aparente sencillez de su planteamiento, el PAV es uno de los más complejos de resolver y existen demostraciones que equiparan la complejidad de su solución a la de otros problemas aparentemente mucho más complejos que han retado a los matemáticos desde hace siglos.

El enunciado del Problema del Agente Viajero, contrasta con la enorme dificultad de su resolución en la práctica al crecer el número de ciudades. Este problema en su expresión general, es tenido como arquetipo de la complejidad y se considera que el tiempo necesario para hallar una solución con garantía de óptimo absoluto crece exponencialmente con el número de elementos que intervienen.

Descripción:El Problema del Agente Viajero (PAV) es sencillo de comprender, el viajero debe realizar un recorrido en el cual debe visitar todas las ciudades de su territorio solo una vez y regresar a la ciudad considerada como punto de partida. Típicamente, las reglas son que ninguna ciudad es visitada más de una vez. En cada una de las ciudades existe una distancia que las separa de las demás la cual es conocida, la meta es encontrar el recorrido más corto es decir, aquel que involucre la menor distancia. A cada uno de los recorridos que puede realizar el viajero se le denomina viaje. Comprobar cada uno de los posibles viajes para n ciudades, tendría un costo de n! sumas. Por ejemplo si cada viaje tuviera 30 ciudades en total serian 2.65x1032 sumas. Considerando una media de billón de sumas por segundo, esto corresponde a 8,000,000,000,000,000 años. El solo hecho de añadir una ciudad más causaría que el número de sumas se incrementara por un factor de 31. Lógicamente, esto es una solución prácticamente imposible. En este Proyecto se trabajara con 5 ciudades, para que la solución no sea tan costosa y se acerque a lo más óptimo, además el PAV será resuelto con Algoritmos Genéticos.Los Algoritmos Genéticos, se utilizan con bastante éxito en la resolución de Problemas de Optimización en los cuales el espacio de búsqueda es enorme. Uno de estos Problemas es el Problema del Agente Viajero que es uno de los más ampliamente estudiados, dentro de la Optimización Combinatoria Los estudios del Problema del Agente Viajero a través de los Algoritmos Genéticos proveen de ricas experiencias y muestran las bases de los problemas de optimización combinatoria. Estrictamente hablando, los

11

mayores esfuerzos que se han realizado han sido para lograr lo siguiente: 1.- Ofrecer una apropiada representación codificada del recorrido. 2.- Conseguir operadores genéticos aplicables para mantener las subcadenas obtenidas y eliminar la ilegabilidad de las mismas. 3.- Prevenir la convergencia prematura. El principal problema en la aplicación de Algoritmos Genéticos para muchos es que el operador de cruce y el operador de mutación presentan un gran potencial para crear recorridos que no son factibles. Un Algoritmo Genético en comparación con otros métodos puede encontrar una solución en mucho menos tiempo, aunque probablemente no sea la mejor solución, se podrá encontrar una buena solución. Hay dos pasos para resolver este problema utilizando Algoritmos Genéticos: * El primero paso es crear un grupo de viajes, aleatoriamente, al que se le llama nuestra población inicial. Estos viajes serán almacenados como una secuencia de números. * El segundo paso es encontrar los dos mejores en la población y combinarlos para crear dos nuevos viajes, hijos que se espera que sean mejores.

Solución al Problema del Agente ViajeroLa solución del Problema del Agente Viajero que se propone es básicamente para 5 ciudades, con el objetivo de encontrar el recorrido con la ruta más corta. Entonces como ya se dijo el modelo del PAV será resuelto para 5 ciudades usando la Técnica de Algoritmos Genéticos. ESTA PROPUESTA CONSISTE EN CODIFICAR UNA SOLUCIÓN DE LA SIGUIENTE FORMA: Para una grafica con 5 ciudades, siendo S una posible solución:S = (0,1,2,3,4), S' = 000 001 010 011 100Para este problema definimos nuestra FUNCION DE APTITUD, no es más que nuestra función objetivo de nuestro problema, el Algoritmo Genético, únicamente maximiza, pero la minimización puede realizarse fácilmente, utilizando el reciproco de la función maximizante (debe cuidarse por supuesto, que el reciproco de la función no genere una división por cero). Una característica que debe tener esta función es que tiene que ser capaz de castigar a las malas soluciones y de premiar a las buenas de tal forma que sean estas últimas las que se propaguen con mayor rapidez:

* Donde: x: Es el costo asociado a una solución o recorrido* El costo de ir a una ciudad que sea ella misma se castiga.

12

* El costo de ir a una ciudad que no exista se castiga. Donde R: Es la suma de las repeticiones de cada ciudad en una solución.Ejemplos: * S = (1,1,0,2,2) R = 2 * S = (3,9,2,3,1) R = 1

Solución improcedente:

Para una grafica con n ciudades el número de bits de un cromosoma (bitsC) está dado por: * bitsC = nbits *n Donde: nbits: es el número de bits necesarios para representar n y se calcula así: * nBits = piso (log2(n)) + 1 Por ejemplo: * Para 5 ciudades los cromosomas ocupan 15 bits * Para 8 ciudades los cromosomas ocupan 32 bits * Para 16 ciudades los cromosomas ocupan 64 bits * Para 33 ciudades los cromosomas ocupan 198 bits

EXPLICACIÓN DEL ALGORTIMO POR ETAPASPrimera etapa: En la primera Etapa de este algoritmo podemos ver nuestra tabla principal, la cual esta previamente llena, pero podemos meter otros valores y así poder visualizar una solución al PAV, el usuario está libre de meter cualquier valor, enviarlo y visualizar una solución. Pero para alcanzar valores más óptimos se recomienda meter los valores que están como ejemplo = ej. Que está a un lado de la tabla. Grafica con 5 ciudades (0-1-2-3-4)

Numero de generaciones ej. 20Tamaño de la Población ej. 150Probabilidad de cruza ej. 0.25Probabilidad de mutación ej. 0.01Donde:

• Número de generaciones: Total de individuos que forman parte de la población

• Tamaño de la población: Son las posibles soluciones del problema, pueden representarse como un conjunto de parámetros conocidos como genes, los cuales agrupados forman una cadena o ristra(es un conjunto de elementos de un mismo origen) de valores referida como cromosomas.

• Probabilidad de cruza: Es el encargado de transportar la información genética de población a población entre generaciones a través de los individuos, buscando mejorar en promedio la

13

calidad de la población conservando las mejores características de cada individuo.

• Probabilidad de mutación: El operador genético de mutación puede ser aplicado a todos o algunos miembros de la población y consiste en la alteración aleatoria de algún gen componente del cromosoma.

Segunda etapa:Después de que los datos son enviados por el usuario, nos manda a la solución y en la segunda parte lo que nos muestra es lo siguiente: Nuestra Matriz de Adyacencia: La matriz que se utilizo es una matriz de 5x5, esto porque la solución es para 5 ciudades y su diagonal principal está conformada por números grandes, en este caso pusimos el numero 500 y el resto se lleno con números aleatorios menores a la diagonal principal.Matriz de adyacencia

0 1 2 3 4 5

0 500 5 6 9 8

1 7 500 4 8 9

2 5 6 500 7 8

3 9 5 6 500 5

4 6 3 4 5 500

Ya una vez mostrada la matriz de adyacencia, se muestra la solución de todas las Generaciones, en este ejemplo podemos ver la solución de la Generación 1, como se muestra a continuación:GENERACION 1Promedio aptitud: 0.33 Óptimo actual:

Individuo recorrido costo Aptitud

001110011010100 1-6-3-2-4- 2035 0.4914004914

PROMEDIO APTITUD: es toda la aptitud promediada de la generación 1 OPTIMO ACTUAL: es el mejor recorrido que nos muestra de toda la generación 1, ósea el recorrido óptimo También se puede ver toda la tabla de la Generación 1, la cual el tamaño de la población es de 150 donde se ve al individuo, recorrido, costo y aptitud.

• Individuo: este es representado por 15 bits = 101011011100000. Debido a que los cromosomas para 5 ciudades ocupan 15 bits

• recorrido : es el recorrido mostrado por el individuo • costo : es el costo total del recorrido del individuo • aptitud : aptitud promediada de cada individuo

14

Renglon Individuo recorrido costo aptitud

1 101011011100000 5-3-3-4-0- 2529 0.000789247917767

2 111111011100110 7-7-3-4-6- 4041 0.000493939120028

3 010111110101101 2-7-6-5-5- 5045 0.000395640829342

4 111010111010110 7-2-7-2-6- 5045 0.000198018037463

5 111111000101100 7-7-0-5-4- 5045 0.000395640829342

6 100000100000011 4-0-4-0-3- 34 0.0293823823236

7 010000110101100 2-0-6-5-4- 3036 0.329380764163

8 110101111011110 6-5-7-3-6- 5045 0.000395640829342

9 111010101010101 7-2-5-2-5- 5045 0.000198018037463

10 101001111000000 5-1-7-0-0- 4536 0.000440037033517

11 101111101011001 5-7-5-3-1- 4041 0.000493939120028

12 110111010101100 6-7-2-5-4- 5045 0.1982160555

13 011100111001101 3-4-7-1-5- 4041 0.247463499134

14 011001001111000 3-1-1-7-0- 2532 0.000788312789902

15 011001110100101 3-1-6-4-5- 4041 0.247463499134

16 101110111100110 5-6-7-4-6- 5045 0.000395640829342

17 000000101000010 0-0-5-0-2- 2529 0.000395018188612

18 001010010000100 1-2-2-0-4- 520 0.00383847689237

19 011110110100001 3-6-6-4-1- 3038 0.000657013819629

20 000001000001111 0-1-0-1-7- 2035 0.000490909581819

21 001101000111110 1-5-0-7-6- 5045 0.1982160555

22 101011100111110 5-3-4-7-6- 4041 0.247463499134

23 000101100101101 0-5-4-5-5- 5045 0.000198018037463

24 101000110001111 5-0-6-1-7- 5045 0.1982160555

25 110110111001100 6-6-7-1-4- 4045 0.000493450675904

26 101111010000000 5-7-2-0-0- 3532 0.000565121173282

27 100011111011010 4-3-7-3-2- 2037 0.000979876280821

28 111101100110010 7-5-4-6-2- 5045 0.1982160555

29 011100011111101 3-4-3-7-5- 3037 0.000657230156086

30 110001101101101 6-1-5-5-5- 5045 0.000198018037463

31 000010110001010 0-2-6-1-2- 2033 0.000981804222347

32 010100100100000 2-4-4-4-0- 1020 0.000979412744119

33 001010110001011 1-2-6-1-3- 2035 0.000980839304193

34 110010001001010 6-2-1-1-2- 2528 0.000395174445807

35 100001101111110 4-1-5-7-6- 4039 0.247586036148

15

36 010010111000110 2-2-7-0-6- 4536 0.000440037033517

37 011010011011100 3-2-3-3-4- 523 0.00191013575335

38 100010011100100 4-2-3-4-4- 1016 0.000983268699804

39 100001110100010 4-1-6-4-2- 2033 0.000981804222347

40 011000100110000 3-0-4-6-0- 2044 0.000976520540133

41 011011111101110 3-3-7-5-6- 4536 0.000440037033517

42 111101011010011 7-5-3-2-3- 3040 0.000656581573695

43 101101110010010 5-5-6-2-2- 4536 0.000220238315476

44 011011000000000 3-3-0-0-0- 1518 0.000438881764375

45 100101011111001 4-5-3-7-1- 4045 0.247218788628

46 100011110011011 4-3-6-3-3- 2528 0.000395174445807

47 010110101111101 2-6-5-7-5- 5045 0.000395640829342

48 111111001110110 7-7-1-6-6- 5045 0.000198018037463

49 111101000001110 7-5-0-1-6- 4041 0.247463499134

50 110101100111000 6-5-4-7-0- 5045 0.1982160555

51 100000110011111 4-0-6-3-7- 4042 0.247402276101

52 000010011011101 0-2-3-3-5- 2531 0.000788624252877

53 111101101110000 7-5-5-6-0- 5045 0.000395640829342

54 001000100111001 1-0-4-7-1- 2533 0.000788001572851

55 111011101010000 7-3-5-2-0- 4041 0.247463499134

56 010011010111111 2-3-2-7-7- 3040 0.000328618749671

57 000010101010000 0-2-5-2-0- 2529 0.000395018188612

58 111100110001110 7-4-6-1-6- 5045 0.000395640829342

59 001110000110001 1-6-0-6-1- 4536 0.000220238315476

60 100110010111001 4-6-2-7-1- 4045 0.247218788628

61 110101101110111 6-5-5-6-7- 5045 0.000198018037463

62 111000110001010 7-0-6-1-2- 4040 0.247524752475

63 101001000111011 5-1-0-7-3- 4043 0.247341083354

64 111001101001010 7-1-5-1-2- 4040 0.000494061382186

65 100110000011101 4-6-0-3-5- 4045 0.247218788628

66 001110100011110 1-6-4-3-6- 4041 0.000493939120028

67 011011001111111 3-3-1-7-7- 3532 0.000282842864949

68 110111110100010 6-7-6-4-2- 4040 0.000494061382186

69 000000000010110 0-0-0-2-6- 3024 0.000330357473215

70 101001010101111 5-1-2-5-7- 4040 0.000494061382186

71 101111001100100 5-7-1-4-4- 3536 0.000564481895937

16

72 110101011110101 6-5-3-6-5- 5045 0.000198018037463

73 000101001000011 0-5-1-0-3- 2043 0.000976998523755

74 101110101101100 5-6-5-5-4- 5045 0.000198018037463

75 010110011110001 2-6-3-6-1- 4040 0.000494061382186

76 010101011100110 2-5-3-4-6- 4041 0.247463499134

77 111100000111100 7-4-0-7-4- 4042 0.00024715512098

78 101100100011010 5-4-4-3-2- 2529 0.000789247917767

79 111110101010010 7-6-5-2-2- 4536 0.000440037033517

80 000101100101100 0-5-4-5-4- 4042 0.00024715512098

81 100000111001010 4-0-7-1-2- 2036 0.49115913556

82 101011110101110 5-3-6-5-6- 5045 0.000198018037463

83 101001010100001 5-1-2-4-1- 2033 0.000981804222347

84 000001000001111 0-1-0-1-7- 2035 0.000490909581819

85 110011110111111 6-3-6-7-7- 5045 0.000198018037463

86 001110011010100 1-6-3-2-4- 2035 0.4914004914

87 110000111001011 6-0-7-1-3- 4044 0.24727992087

88 100010001100011 4-2-1-4-3- 29 0.0688278615183

89 101000010000011 5-0-2-0-3- 2038 0.000979395477935

90 011110001110011 3-6-1-6-3- 4536 0.000220238315476

91 010110101111101 2-6-5-7-5- 5045 0.000395640829342

92 110110001111010 6-6-1-7-2- 5045 0.000395640829342

93 000000000000111 0-0-0-0-7- 3518 0.000189375360523

94 101001010101111 5-1-2-5-7- 4040 0.000494061382186

95 111000000110001 7-0-0-6-1- 4536 0.000440037033517

96 011011111100010 3-3-7-4-2- 2529 0.000789247917767

97 011001001111000 3-1-1-7-0- 2532 0.000788312789902

98 110110111001100 6-6-7-1-4- 4045 0.000493450675904

99 110010001001011 6-2-1-1-3- 2532 0.000788312789902

100 111011101010000 7-3-5-2-0- 4041 0.247463499134

101 110100111101101 6-4-7-5-5- 5045 0.000395640829342

102 100010011100100 4-2-3-4-4- 1016 0.000983268699804

103 100010101010000 4-2-5-2-0- 2035 0.000980839304193

104 110101111011110 6-5-7-3-6- 5045 0.000395640829342

105 111100110001110 7-4-6-1-6- 5045 0.000395640829342

106 101100101110100 5-4-5-6-4- 5045 0.000198018037463

107 100011111011010 4-3-7-3-2- 2037 0.000979876280821

17

108 100110100000110 4-6-4-0-6- 4042 0.00024715512098

109 010111010101100 2-7-2-5-4- 4040 0.000494061382186

110 110000111101110 6-0-7-5-6- 5045 0.000395640829342

111 011100001000000 3-4-1-0-0- 524 0.00380917554205

112 001110100011101 1-6-4-3-5- 4041 0.247463499134

113 111101011010011 7-5-3-2-3- 3040 0.000656581573695

114 110011011111000 6-3-3-7-0- 4536 0.000440037033517

115 110001101101010 6-1-5-5-2- 5045 0.000395640829342

116 010010010110110 2-2-2-6-6- 4027 0.000165438916891

117 101001111000000 5-1-7-0-0- 4536 0.000440037033517

118 000000101000001 0-0-5-0-1- 2530 0.000394862054941

119 111111100111011 7-7-4-7-3- 5045 0.000198018037463

120 111111000101100 7-7-0-5-4- 5045 0.000395640829342

121 001001010001010 1-1-2-1-2- 520 0.00128119715062

122 011010010000111 3-2-2-0-7- 2529 0.000789247917767

123 010010111000110 2-2-7-0-6- 4536 0.000440037033517

124 100011110001110 4-3-6-1-6- 4041 0.000493939120028

125 011001111000011 3-1-7-0-3- 2532 0.000788312789902

126 111101100110101 7-5-4-6-5- 5045 0.000395640829342

127 000010011011101 0-2-3-3-5- 2531 0.000788624252877

128 001100100111001 1-4-4-7-1- 3027 0.000330030062438

129 010111110101101 2-7-6-5-5- 5045 0.000395640829342

130 101011010011101 5-3-2-3-5- 3040 0.000328618749671

131 101011100110100 5-3-4-6-4- 4041 0.000493939120028

132 000000001111111 0-0-1-7-7- 3532 0.000282842864949

133 111010110111110 7-2-6-7-6- 5045 0.000198018037463

134 100010011011100 4-2-3-3-4- 1016 0.000983268699804

135 011001110001000 3-1-6-1-0- 2039 0.000978915146656

136 110101100111000 6-5-4-7-0- 5045 0.1982160555

137 000110010101010 0-6-2-5-2- 4041 0.000493939120028

138 001010110001010 1-2-6-1-2- 2032 0.000491634349902

139 011000010000101 3-0-2-0-5- 2038 0.000979395477935

140 101000011101011 5-0-3-5-3- 4045 0.000246971816811

141 111001101001001 7-1-5-1-1- 4536 0.000220238315476

142 100101101010011 4-5-5-2-3- 3039 0.000656797625545

143 101111101011010 5-7-5-3-2- 4042 0.000493816918365

18

144 100110101110001 4-6-5-6-1- 4045 0.000493450675904

145 101000000010111 5-0-0-2-7- 3533 0.000564961218237

146 100110000011110 4-6-0-3-6- 4045 0.000493450675904

147 000101001000011 0-5-1-0-3- 2043 0.000976998523755

148 010000101101100 2-0-5-5-4- 3036 0.000657446635057

149 011000100110000 3-0-4-6-0- 2044 0.000976520540133

150 100001110100010 4-1-6-4-2- 2033 0.000981804222347

Optimo global: Aquí se hace referencia al mejor de todos los recorridos de todas las generaciones que se calculan.Optimo global:

Individuo recorrido costo Aptitud

100001000010011 4-1-0-2-3- 28 35.7142857143

HERRAMIENTAS UTILIZADAS:• Navegador Mozilla firefox, Y Explorer.

Un navegador o navegador web (del inglés, web browser) es un programa que permite ver la información que contiene una página web (ya se encuentre ésta alojada en un servidor dentro de la World Wide Web o en un servidor local).

El navegador interpreta el código, HTML generalmente, en el que está escrita la página web y lo presenta en pantalla permitiendo al usuario interactuar con su contenido y navegar hacia otros lugares de la red mediante enlaces o hipervínculos.

La funcionalidad básica de un navegador web es permitir la visualización de documentos de texto, posiblemente con recursos multimedia incrustados. Los documentos pueden estar ubicados en la computadora en donde está el usuario, pero también pueden estar en cualquier otro dispositivo que esté conectado a la computadora del usuario o a través de Internet, y que tenga los recursos necesarios para la transmisión de los documentos (un software servidor web).

Tales documentos, comúnmente denominados páginas web, poseen hipervínculos que enlazan una porción de texto o una imagen a otro documento, normalmente relacionado con el texto o la imagen.

Las versiones de Internet Explorer 5, Mozilla 5.0 ofrecen diferentes grados de soporte del estándar XML.

19

En el caso de Mozilla 5.0, el soporte es bastante completo y permite -además- abrir documentos de formato XSL que evalúa e interpreta sintácticamente para garantizar que no hay errores de composición e indicando esta circunstancia si se produce (incluye parser y depurador), lo que le convierte en una herramienta de trabajo en sí misma para el desarrollo con XML.

Lo mismo sucede con Explorer, por lo cual podemos decir que existe un grado de conformidad con el estándar.

• XAMPP

XAMPP es un servidor independiente de plataforma, software libre, que consiste principalmente en la base de datos MySQL, el servidor web Apache y los intérpretes para lenguajes de script: PHP y Perl. El nombre proviene del acrónimo de X (para cualquiera de los diferentes sistemas operativos), Apache, MySQL, PHP, Perl.

El programa está liberado bajo la licencia GNU y actúa como un servidor web libre, fácil de usar y capaz de interpretar páginas dinámicas. Actualmente XAMPP está disponible para Microsoft Windows, GNU/Linux, Solaris y MacOS X. Oficialmente, los diseñadores de XAMPP sólo pretendían su uso como una herramienta de desarrollo, para permitir a los diseñadores de sitios webs y programadores testear su trabajo en sus propios ordenadores sin ningún acceso a Internet. En la práctica, sin embargo, XAMPP es utilizado actualmente como servidor de sitios Web, ya que, con algunas modificaciones, es generalmente lo suficientemente seguro para serlo. Con el paquete se incluye una herramienta especial para proteger fácilmente las partes más importantes.

• PHPPHP es un lenguaje de programación interpretado, diseñado originalmente para la creación de páginas web dinámicas. Se usa principalmente para la interpretación del lado del servidor (server-side scripting) pero actualmente puede ser utilizado desde una interfaz de línea de comandos o en la creación de otros tipos de programas incluyendo aplicaciones con interfaz gráfica usando las bibliotecas Qt o GTK+.PHP es un acrónimo recursivo que significa PHP Hypertext Pre-processor (inicialmente PHP Tools, o, Personal Home Page Tools). Fue creado originalmente por Rasmus Lerdorf en 1994; sin embargo la implementación principal de PHP es producida ahora por The PHP Group y sirve como el estándar de facto para PHP al no haber una

20

especificación formal. Publicado bajo la PHP License, la Free Software Foundation considera esta licencia como software libre.Puede ser desplegado en la mayoría de los servidores web y en casi todos los sistemas operativos y plataformas sin costo alguno. El lenguaje PHP se encuentra instalado en más de 20 millones de sitios web y en un millón de servidores, el número de sitios en PHP ha compartido algo de su preponderante sitio con otros nuevos lenguajes no tan poderosos desde agosto de 2005. Este mismo sitio web de Wikipedia está desarrollado en PHP. Es también el módulo Apache más popular entre las computadoras que utilizan Apache como servidor web.El gran parecido que posee PHP con los lenguajes más comunes de programación estructurada, como C y Perl, permiten a la mayoría de los programadores crear aplicaciones complejas con una curva de aprendizaje muy corta. También les permite involucrarse con aplicaciones de contenido dinámico sin tener que aprender todo un nuevo grupo de funciones.Aunque todo en su diseño está orientado a facilitar la creación de sitios webs, es posible crear aplicaciones con una interfaz gráfica para el usuario, utilizando la extensión PHP-Qt o PHP-GTK. También puede ser usado desde la línea de órdenes, de la misma manera como Perl o Python pueden hacerlo; a esta versión de PHP se la llama PHP-CLI (Command Line Interface).Cuando el cliente hace una petición al servidor para que le envíe una página web, el servidor ejecuta el intérprete de PHP. Éste procesa el script solicitado que generará el contenido de manera dinámica (por ejemplo obteniendo información de una base de datos). El resultado es enviado por el intérprete al servidor, quien a su vez se lo envía al cliente. Mediante extensiones es también posible la generación de archivos PDF, Flash, así como imágenes en diferentes formatos.Permite la conexión a diferentes tipos de servidores de bases de datos tales como MySQL, PostgreSQL, Oracle, ODBC, DB2, Microsoft SQL Server, Firebird y SQLite.XAMPP es un servidor independiente de plataforma, software libre, que consiste principalmente en la base de datos MySQL, el servidor Web Apache y los intérpretes para lenguajes de script: PHP y Perl. El nombre proviene del acrónimo de X (para cualquiera de los diferentes sistemas operativos), Apache, MySQL, PHP, Perl. El programa está liberado bajo la licencia GNU y actúa como un servidor Web libre, fácil de usar y capaz de interpretar páginas dinámicas. Actualmente XAMPP está disponible para Microsoft Windows, GNU/Linux, Solaris, y MacOS X.PHP también tiene la capacidad de ser ejecutado en la mayoría de los sistemas operativos, tales como Unix (y de ese tipo, como Linux o Mac OS X) y Microsoft Windows, y puede interactuar con los servidores de web más populares ya que existe en versión CGI, módulo para Apache, e ISAPI.PHP es una alternativa a las tecnologías de Microsoft ASP y ASP.NET (que utiliza C# y Visual Basic .NET como lenguajes), a ColdFusion de la

21

empresa Adobe, a JSP/Java y a CGI/Perl. Aunque su creación y desarrollo se da en el ámbito de los sistemas libres, bajo la licencia GNU, existe además un entorno de desarrollo integrado comercial llamado Zend Studio. CodeGear (la división de lenguajes de programación de Borland) ha sacado al mercado un entorno de desarrollo integrado para PHP, denominado 'Delphi for PHP. También existen al menos un par de módulos para Eclipse, uno de los entornos más populares.[

]MANUAL TECNICO.Estructura de un código en PHP.PHP es un lenguaje de script incrustado dentro del HTML. La mayor parte de su sintaxis ha sido tomada de C, Java y Perl con algunas características especificas de sí mismo. La meta del lenguaje es permitir rápidamente a los desarrolladores la generación dinámica de páginas.ESTRUCTURA DEL TUTORIAL VIA WEB.Este está conformado por varios códigos html y PHP y es lo que conforma nuestra página web para el problema del agente viajero, a continuación se describe cada código de nuestro tutorial.

Principal.htmlEste es el código de nuestra plantilla principal. La primera parte de este código pertenece al los títulos de la página principal y a la tabla donde están contenidos el nombre del alumno, licenciatura a la que pertenece y el correo electrónico.

22

En esta parte del código es donde va el titulo de nuestro problema así como, la parte de la introducción, descripción y solución al problema del agente viajero.

23

<html> <head> <meta http-equiv="Content-Type" content="text/html">

<title>Tutorial Via Web del Problema del Agente Viajero</title></head><body> <h1 align="left">Tutorial Via Web del Problema del Agente Viajero </h1>

<table border="1" width="100%"> <tr>

<td> <font face="Arial" size="2">

<b>Alumno: </b>RICARDO CARREÓN MACIAS <br> <b>Email: </b>

<a title="Enviar Mensaje" href="[email protected]">[email protected]</a>

</font>

</td><td align="left"> <b>Licenciatura en Computacion</b>

</td></tr>

</table> <table border="1" width="100%"> <!-- tablas -->

</table> <br> <font face="Arial" size="3">

24

<marquee> <h1><font color="000080">PROBLEMA DEL AGENTE

VIAJERO</font></h1> </marquee>

<h2><font color="000080">Introduccion, Descripcion y Solucion al PAV</font></h2>

<hr>

<h3><font coLOR="000080">Introducción:</font></h3>

<p align="justify"><FONT COLOR="black"> El Problema del Agente Viajero (PAV), es un ejemplo que muestra y analiza la problemática que subyace tras algunos tipos de problemas matemáticos que a priori parecen tener una solución relativamente

<p align="justify"><FONT COLOR="black"> El Problema del Agente Viajero (PAV), es un ejemplo que muestra y analiza la problemática que subyace tras algunos tipos de problemas matemáticos que a priori parecen tener una solución relativamente fácil, y en la práctica presentan un gran problema. La respuesta al problema es conocida, es decir se conoce la forma de resolverlo, pero sólo en teoría, en la práctica la solución no es aplicable debido al tiempo que computacionalmente se precisa para obtener su resultado (problema de tipo NP-hard). El problema del agente viajero (también conocido como el problema del viajante de comercio o por sus siglas en inglés: TSP = TRAVELING SALESMAN PROBLEM) es uno de los problemas más famosos (y quizás el mejor estudiado) en el campo de la optimización combinatoria computacional. A pesar de la aparente sencillez de su planteamiento, el PAV es uno de los más complejos de resolver y existen demostraciones que equiparan la complejidad de su solución a la de otros problemas aparentemente mucho más complejos que han retado a los matemáticos desde hace siglos.</p><p align="justify">El enunciado del Problema del Agente Viajero, contrasta con la enorme dificultad de su resolución en la práctica al crecer el número de ciudades. Este problema en su expresión general, es tenido como arquitepo de la complejidad y se considera que el tiempo necesario para hallar una solución con garantía de óptimo absoluto crece exponencialmente con el número de elementos que intervienen.<hr><h3><font coLOR="000080">Descripcion:</font></h3><p align="justify">El Problema del Agente Viajero (PAV) es sencillo de comprender, el viajero debe realizar un recorrido enel cual debe visitar todas las ciudades de su territorio solo una vez y regresar a la ciudad consideradacomo punto de partida. Típicamente, las reglas son que ninguna ciudad es visitada más de una vez.<p align="justify">En cada una de las ciudades existe una distancia que las separa de las demás la cual es conocida, la meta es encontrar el recorrido más corto es decir, aquel que involucre la menor distancia. </p>

25

<p align="justify">A cada uno de los recorridos que puede realizar el viajero se le denomina viaje. Comprobar cada uno de los posibles viajes para n ciudades, tendría un costo de n! sumas. Por ejemplo si cada viaje tuviera 30 ciudades en total serián2.65x10<sup>32</sup> sumas. Considerando una media de billón de sumas por segundo, esto corresponde a 8,000,000,000,000,000 años. El solo hecho de añadir una ciudad más causaria que el número de sumas se incrementara por un factor de 31. Lógicamente, esto es una solución prácticamente imposible. En este Proyecto se trabajara con 5 ciudades, para que la solución no sea tan costosa y se acerque a lo más óptimo, ademas el PAV sera resuelto con Algoritmos Genéticos.</p>

<p align="justify">

Los Algoritmos Genéticos, se utilizan con bastante éxito en la resolución de Problemas de Optimización en los cuales elespacio de busqueda es enorme. Uno de estos Poblemas es el Problema del Agente Viajero que es uno de los más ampliamenteestudiados, dentro de la Optimización Combiantoria <p>

<p align="justify">

Los estudios del Problema del Agente Viajero a través de los Algoritmos Genéticos proveen de ricas experiencias y muestran las bases de los problemas de optimización combinatoria. Estrictamente hablando, los mayores esfuerzos que se han realizado han sido para lograr lo siguiente:

<p>

1.- Ofrecer una apropiada representación codificada del recorrido.

<p>

<p>

2.- Conseguir operadores genéticos aplicables para mantener las subcadenas obtenidas y eliminar la ilegabilidad de las mismas.

<p>

<p>

3.- Prevenir la convergencia prematura.

<p>

presentan un gran potencial para crear recorridos que no son factibles.

<p align="justify">

Un Algoritmo Genético en comparación con otros métodos puede encontrar una solución en mucho menos tiempo, aunque probablemente no

sea la mejor solución, se podrá encontrar una buena solución. Hay dos pasos para

26

<p align="justify">

El principal problema en la aplicación de Algoritmos Genéticos para muchos es que el operador de cruce y el operador de mutación presentan un gran potencial para crear recorridos que no son factibles.

<p align="justify">

Un Algoritmo Genético en comparación con otros métodos puede encontrar una solución en mucho menos tiempo, aunque probablemente no sea la mejor solución, se podrá encontrar una buena solución. Hay dos pasos para resolver este problema utilizando Algoritmos Genéticos:

<p>

<LI>El primero paso es crear un grupo de viajes, aleatoriamente, al que se

le llama nuestra población inicial. Estos viajes serán almacenados como una secuencia de números.

</LI>

<p>

<LI> El segundo paso es encontrar los dos mejores en la población y combinarlos para crear dos nuevos viajes, hijos que se espera que sean mejores.

</LI>

<p>

<hr>

<h3><FONT COLOR="000080">Solución al Problema del Agente Viajero</font></h3>

<p align="justify">

La solución del Problema del Agente Viajero que se propone es básicamente para 5 ciudades, con el objetivo de encontrar el recorrido con la ruta más corta. Entonces como ya se dijo el modelo del PAV sera resuelto para 5 ciudades usando la Técnica deAlgoritmos Genéticos.

<p>

<p>

27

<p>

ESTA PROPUESTA CONSISTE EN CODIFICAR UNA SOLUCIÓN DE LA SIGUIENTE FORMA:<p>

<p>

Para una grafica con 5 ciudades, siendo S una posible solución:</p>

<p>S = (0,1,2,3,4), S' = 000 001 010 011 100</p>

<p align="justify">

Para este problema definimos nuestra FUNCION DE APTITUD, no es más que nuestra función objetivo de nuestro problema, el Algoritmo Génetico, únicamente maximiza, pero la minimización puede realizarse fácilmente, utilizando el reciproco de la función maximizante (debe cuidarse por supuesto, que el reciproco de la función no genere una división por cero). Una característica que debe tener esta función es que tiene que ser capaz de castigar a las malas soluciones y de premiar a las buenas de tal forma que sean estas últimas las que se propaguen con mayor rapidez:

<div>

<div align="center"><img src="funciondeaptitud.gif">

</div>

<p>

Donde:

<p>x: Es el costo asociado a una solución o recorrido</p>

<LI>El costo de ir a una ciudad que sea ella misma se castiga.

<LI>El costo de ir a una ciudad que no exista se castiga.</LI>

<p>Donde R: Es la suma de las repeticiones de cada ciudad en una solución.</p>

<p>

Ejemplos:

<LI>S = (1,1,0,2,2) R = 2

<LI>S = (3,9,2,3,1) R = 1

</p>

Esta parte del código se hizo para las ligas que tiene nuestra página principal y en las cuales podemos accesar, para ver el programa correr, así como para poder ver las soluciones del algoritmo.

28

<font face="Arial" size="3">

<h4>SOLUCION IMPROCEDENTE AL PAV</h4>

</font>

<font face="Arial" size="3">

<ul>

<b>Ejemplo de la solución improcedente</b> <!-- temas -->

<br>

<ul>ver

<a title="Haz clic para ver la Informacion" href="solucionimprocedente.html"> <!-- link del temario -->

Ejemplo

</a>

<br>

<p>

<font face="Arial" size="3">

<h4>EXPLICACIÓN DEL ALGORTIMO POR ETAPAS</h4>

</font>

<font face="Arial" size="3">

<ul>

<b>Primera Etapa</b> <!-- temas -->

<br>

<ul>ver

<a title="Haz clic para ver la Informacion" href="etapa1.html"> <!-- link del temario -->

Etapa

</a>

<br>

</p>

<p>

29

Etapa

</a>

<br>

</p>

<p>

<font face="Arial" size="3">

<h4>EXPLICACIÓN DEL ALGORITMO POR ETAPAS</h4>

</font>

<font face="Arial" size="3">

<ul>

<b>Segunda Etapa</b> <!-- temas -->

<br>

<ul>ver

<a title="Haz clic para ver la Informacion" href="etapa2.html"> <!-- link del temario -->

Etapa

</a>

<br>

</p>

<hr>

<font face="Arial" size="3">

<h4>EN ESTE LINK PODEMOS VER LA CORRIDA DEL PAV</h4>

</font>

<font face="Arial" size="3">

<ul>

<b> Algoritmo PAV</b> <!-- temas -->

<br>

<ul>Da click a la

<a title="Haz clic para ver la Informacion" href="genetico.php"> <!-- link del temario -->

corrida del Algoritmo PAV

</a>

<br>

Solucionimprocedente.html

30

<ul>Da click a la

<a title="Haz clic para ver la Informacion" href="genetico.php">

corrida del Algoritmo PAV

</a>

<br>

</body>

</html>

En este modulo se puede ver el código, el cual pertenece a una solución improcedente del Problema del Agente Viajero.

31

<html>

<head>

<meta http-equiv="Content-Type" content="text/html">

<title>Solución improcedente</title>

</head>

<head>

<h3>

<p>

Para una grafica con n ciudades el numero de bits de un cromosoma (bitsC) esta dado por:

<LI> bitsC = nbits *n</LI>

</p>

<p>

Donde:

</p>

<p> nbits: es el número de bits necesarios para representar n y se calcula así: </p>

<LI> nBits = piso (log2(n)) + 1 </LI>Donde:

</p>

<p> nbits: es el número de bits necesarios para representar n y se calcula así: </p>

<LI> nBits = piso (log2(n)) + 1 </LI>

<p>

Por ejemplo:

</p>

<LI> Para 5 ciudades los cromosomas ocupan 15 bits</LI>

<LI> Para 8 ciudades los cromosomas ocupan 32 bits</LI>

<LI> Para 16 ciudades los cromosomas ocupan 64 bits</LI>

<LI> Para 33 ciudades los cromosomas ocupan 198 bits</LI>

</h3>

<p>

<a href="principal.html"> REGRESAR</a>

</p>

</html>

Etapa1.html

32

Esta parte del código corresponde a la descripción de la etapa 1 de nuestro algoritmo, donde contiene la tabla principal donde se meten los parámetros de nuestro algoritmo genético y la liga está en la página

principal de nuestra pag. Web.

33

<html>

<head>

<meta http-equiv="Content-Type" content="text/html">

<title>Etapa1</title>

</head>

<head>

<h3>

<p align="justify">

En la primera Etapa de este algoritmo podemos ver nuestra tabla principal, la cual esta previamente llena, pero podemos meter otros valores y asi poder visualizar una solución al PAV, el usuario esta libre de meter cualquier valor, enviarlo y visualizar una solución. Pero para alcanzar valores mas óptimos se recomienda meter los valores que estan como ejemplo = ej. que esta a un lado de la tabla.

</p>

</h3>

<form method="post" action="torneo.php">

<h3>Grafica con 5 ciudades (0-1-2-3-4)</h3>

Numero de generaciones <input type="text" name="generaciones" value="20"> ej. 20<br>

Tamaño de la Poblacion <input type="text" name="tam_poblacion" value="150"> ej. 150<br>

Probabilidad de cruza <input type="text" name="prob_cruza" value="0.25">ej. 0.25<br>

Probabilidad de mutacion <input type="text" name="probMutacion" value="0.01">ej. 0.01<br>

</form>

34

<h3>

<p>Donde:</p>

<p>

<Li> Numero de generaciones: Total de individuos que forman parte de la poblacion </Li></p>

<Li> Tamaño de la poblacion: Son las posibles soluciones del problema, pueden representarse como un conjunto de parametros conocidos como genes, los cuales agrupados forman una cadena o ristra(es un conjunto de elementos de un mismo origen) de valores referida como cromosomas.

</Li>

</p>

<p>

<Li> Probabilidad de cruza: Es el encargado de transportar la información genetica de población a población entre generaciones a traves de los individuos, buscando mejorar en promedio

la calidad de la población conservando las mejores caracteristicas de cada individuo.</Li>

</p>

<Li> Probabilidad de mutación: El operador genetico de mutación puede ser aplicado a todos o algunos miembros de la población y consiste en la

alteración aleatoria de algun gen componente del cromosoma. </Li>

</h3>

<a href="principal.html"> REGRESAR</a>

</html>

Etapa2.html

35

Este código corresponde al modulo de la etapa 2 de la solución de nuestro algoritmo, en donde se encuentra las tablas de las generaciones y su optimo de cada generación, el cual está en una de las

ligas de nuestra pantalla principal.

36

<html>

<head>

<meta http-equiv="Content-Type" content="text/html">

<title>Etapa2</title>

</head>

<head>

<h3>

<p>

Despues de que los datos son enviados por el usuario, nos manda a la solución y en la segunda parte lo que nos muestra es lo siguiente:

</p>

<p> Nuestra Matriz de Adyacencia: La matriz que se utilizo es una matriz de 5x5, esto porque la solución es para 5 ciudades y su diagonal principal esta conformada

por numeros grandes, en este caso pusimos el numero 500 y el resto se lleno con numeros aleatorios menores a la diagonal principal.</p>

<h3>Matriz de adyacencia</h3>

<table border="1">

<tbody><tr bgcolor="gray">

<td>

0 </td>

<td>

1 </td>

<td>

2 </td>

<td>

3 </td>

<td>

<td>

5 </td>

</tr>

<tr>

<td bgcolor="gray"> 0 </td>

<td>

500

37

4 </td>

<td>

5 </td>

</tr>

<tr>

<td bgcolor="gray"> 0 </td>

<td>

500

</td>

<td>

5

</td>

<td>

6

</td>

<td>

9

</td>

<td>

8

</td>

</tr>

<tr>

<td bgcolor="gray"> 1 </td>

<td>

7

</td>

<td>

500

</td>

<td>

4

</td>

<td>

8

</td>

<td>

9

</td>

</tr>

38

<td>

4

</td>

<td>

8

</td>

<td>

9

</td>

</tr>

<tr>

<td bgcolor="gray"> 2 </td>

<td>

5

</td>

<td>

6

</td>

<td>

500

</td>

<td>

7

</td>

<td>

8

</td>

</tr>

<tr>

<td bgcolor="gray"> 3 </td>

<td>

9

</td>

<td>

5

</td>

<td>

6

</td>

39

<td bgcolor="gray"> 3 </td>

<td>

9

</td>

<td>

5

</td>

<td>

6

</td>

<td>

500

</td>

<td>

5

</td>

</tr>

<tr>

<td bgcolor="gray"> 4 </td>

<td>

6

</td>

<td>

3

</td>

<td>

4

</td>

<td>

5

</td>

<td>

500 </td>

</tr>

</tbody></table>

40

<td>

5

</td>

<td>

500 </td>

</tr>

</tbody></table>

41

<h3>

<p> Ya una vez mostrada la matriz de adyacencia, se muestra la solución de todas las Generaciones, en este ejemplo podemos ver la solución de la Generación 1, como se muestra a continuación:</p>

<h3>GENERACION 1</h3>

Promedio aptitud: 0.33

<br>

Optimo actual:

<table border="1"><tbody><tr>

</tr><tr>

<td>Individuo</td>

<td>recorrido</td>

<td>costo</td>

<td>aptitud</td>

</tr> <tr><td>001110011010100</td>

<td>

1-6-3-2-4-

</td>

<td>2035</td>

<td>0.4914004914</td>

</tr></tbody></table>

<td>2035</td>

<td>0.4914004914</td>

</tr></tbody></table>

<h3>

<p>PROMEDIO APTITUD : es toda la aptitud promediada de la generacion 1

</p>

</p>

<p> OPTIMO ACTUAL : es el mejor recorrido que nos muestra de toda la generación 1, osea el recorrido optimo

</p>

</h3>

<br>

<h3>

<p> Tambien se puede ver toda la tabla de la Generación 1, la cual el tamaño de la población es de 150 donde se ve al individuo, recorrido,

costo y aptitud.

</p>

<LI> Individuo : este es representado por 15 bits = 101011011100000. Debido a que los cromososmas para 5 ciudades ocupan 15 bits</LI>

<LI> recorrido : es el recorrido mostrado por el individuo</LI>

<LI> costo : es el costo total del recorrido del individuo</LI>

<LI> aptitud : aptitud promediada de cada individuo</LI>

</br>

<table border="1">

<tbody><tr>

<td>Renglon</td>

<td>Individuo</td>

<td>recorrido</td>

<td>costo</td>

<td>aptitud</td>

</tr>

42

<tr>

<td>1</td>

<td>101011011100000</td>

<td>

5-3-3-4-0- </td>

<td>

2529

</td>

<td>0.000789247917767</td>

</tr>

<tr>

<td>2</td>

<td>111111011100110</td>

<td>

7-7-3-4-6- </td>

<td>

4041

</td>

<td>0.000493939120028</td>

</tr>

<tr>

<td>3</td>

<td>010111110101101</td>

<td>

2-7-6-5-5- </td>

</td>

<td>0.000395640829342</td>

43

<td>

5045

</td>

<td>0.000395640829342</td>

</tr>

<tr>

<td>4</td>

<td>111010111010110</td>

<td>

7-2-7-2-6- </td>

<td>

5045

</td>

<td>0.000198018037463</td>

</tr>

<tr>

<td>5</td>

<td>111111000101100</td>

<td>

7-7-0-5-4-

</td>

44

<p> Optimo global: Aqui se hace referencia al mejor de todos los recorridos de todas las generaciones que se calculan.</p>

<h3>Optimo global:</h3>

<table border="1"><tbody><tr>

</tr><tr>

<td>Individuo</td>

<td>recorrido</td>

<td>costo</td>

<td>aptitud</td>

</tr>

<tr><td>100001000010011</td>

<td>

4-1-0-2-3-

</td>

<td>28</td>

<td>35.7142857143</td>

</tr></tbody></table>

<a href="principal.html"> REGRESAR</a>

<br>

</html>

Implementación del Código de nuestro algoritmo.

Este código fue implementado en el lenguaje de alto nivel llamado PHP, el cual el código será presentado a continuación con sus respectivos comentarios.

Torneo.PHP

Este es el código base de nuestro programa ya que aquí definimos la programación de nuestro algoritmo genético entre otras cosas como: matriz de adyacencia, nuestra población, probabilidad de cruza, la aptitud, mutación, etc. El código es el siguiente:

<?php

// en esta parte de código definimos nuestra probabilidad de mutación.

$probMutacion = 0.01;

//Esta código define el porcentaje para el criterio de parada en el intervalo [1,100]

$porcentaje = 99;

45

$generaciones = 20;

//Este código define el tamaño de la población

$tam_poblacion = 150;

//castigo por no existir arista

$castigo_no_arista = 100;

//castigo por repetir ciudades

$castigo_repetir = 300;

//penalizacion de infinito

$pena_infinito = 1000;

//bonificacion para no obtener valores demasiado pequeños

$bonus = 1000;

//Esta parte de código define la probabilidad de cruza

$probCruza = 0.25;

//esta parte del código es donde se hace la recepcion de datos que el usuario define

$probMutacion = $_POST['probMutacion'];

$generaciones = $_POST['generaciones'];

$tam_poblacion = $_POST['tam_poblacion'];

$probCruza = $_POST['prob_cruza'];

// esta parte del código define las ciudades

$limCiudades[0] = 2; //2 ciudades 1 bit

$limCiudades[1] = 4; //4 ciudades 2 bits

$limCiudades[2] = 8; //8 ciudades 3 btis

$limCiudades[3] = 16; //16 ciudades 4 bits

$limCiudades[4] = 32; //...

46

$limCiudades[5] = 64;

$limCiudades[6] = 128;

//obtención de datos de la matriz de adyacencia que está guardada en un archivo

$datos = file('matriz.html');

//definicion de infinito

$infinito = $datos[1];

for( $i=0;$i<sizeof($datos);$i++ ){

if ( $datos[$i] > $infinito) $infinito = $datos[$i];

}

$infinito += $pena_infinito;

//tamaño de la matriz de adyacencia

$n = sqrt(sizeof($datos));

//construccion de la matriz de adyacencia

$k=0;

for( $i=0;$i<$n;$i++ ){

for( $j=0;$j<$n;$j++ ){

$matrizAdy[$i][$j] = $datos[$k];

$k++;

}

}

$numBits = floor( log($n,2) ) + 1;

//longitud de los cromosomas

$len_cromosoma = $n * $numBits;

//generacion de la poblacion inicial

for ($i=0; $i<$tam_poblacion;$i++){

47

$cromosoma = '';

for ($j=0;$j<$len_cromosoma;$j++){

$cromosoma .= rand(0,1);

}

$poblacion[$i] = $cromosoma;

}

//calcula la aptitud para cada individuo de la población

function calculaAptitud( $poblacion, $numBits, $n, $matriAdy, $infinito, $castigo_no_arista, $castigo_repetir, $bonus){

for ($i=0; $i<sizeof($poblacion);$i++){

$vector = binarioADecimal($poblacion[$i], $numBits, $n);

$costo = costoRecorrido($vector, $matriAdy, $infinito);

//penalizacion

$cadena ='';

for ( $j=0;$j<sizeof($vector);$j++){

$cadena .= $vector[$j];

}

$num_repes=0;

$r=0;

$elem_repetidos = array();

for ( $j=0;$j<sizeof($vector);$j++){

$elem = $vector[$j];

if ( in_array($elem, $elem_repetidos) == false ){

$repeticiones = 0;

$repes = substr_count( $cadena, $elem ) - 1;

if ($repes > 0){

$num_repes += $repes;

48

$elem_repetidos[$r] = $elem;

$r++;

}

}

}

$penalizacion = ( 500 * $num_repes + 1);

$aptitud[$i] = (1/($costo*$penalizacion))*$bonus;

}

return $aptitud;

}

//convierte un cromosoma a un vector de recorrido

function binarioADecimal( $cadenaBits, $numBits, $n ){

$k=0;

for ($i=0;$i<$n;$i++){

$bits[$i] = strrev(substr( $cadenaBits, $k, $numBits ));

$k += $numBits;

}

for ($i=0;$i<sizeof($bits);$i++){

$suma=0;

for ( $j=0;$j< $numBits; $j++){

$caracter = substr( $bits[$i], $j, 1 );

$suma += pow(2,$j)*($caracter);

}49

$vector[$i] = $suma;

}

return $vector;

}

//calcula el costo CERRADO, COMPLETO de un recorrido como vector

function costoRecorrido( $vector, $matrizAdy, $infinito){

$costo = 0;

for ( $i=0;$i<sizeof($vector)-1; $i++ ){

if ( $vector[$i] > (sizeof($matrizAdy)-1) or $vector[$i+1] > (sizeof($matrizAdy)-1)){

$costo += $infinito;

}else{

$costo += $matrizAdy[ $vector[$i] ][ $vector[$i+1] ];

}

}

//cerramos el recorrido

if ( $vector[ sizeof($vector)-1 ] > (sizeof($matrizAdy)-1) or $vector[0] > (sizeof($matrizAdy)-1)){

$costo += $infinito;

}else{

$costo += $matrizAdy[$vector[ sizeof($vector)-1 ]][$vector[0]];

}

return $costo;

}

function ruleta( $poblacion, $aptitud ){

50

// esta parte del código define la aptitud promedio

$aptitudPromedio = array_sum($aptitud);

//cálculo de las probabilidades de seleccion

for ($i=0;$i<sizeof($poblacion); $i++){

$probSeleccion[$i] = $aptitud[$i] / $aptitudPromedio;

}

//cálculo de las probabilidades acumuladas

for ($i=0;$i<sizeof($poblacion); $i++){

$sum += $probSeleccion[$i];

$acumulada[$i] = $sum;

}

$aleatorios = generaAleatorios( sizeof($poblacion) );

//seleccion de cromosomas

for ($i=0;$i<sizeof($poblacion); $i++){

$elem = $aleatorios[$i];

for ( $k=0; $k<sizeof($poblacion); $k++){

if ( $acumulada[$k] > $elem ){

$seleccionado = $k;

$k = sizeof($poblacion);

}

}

$nuevaPob[$i] = $poblacion[$seleccionado];51

}

return $nuevaPob;

}

//esta parte del código define nuestra selección que es por torneo y definimos la función

function torneo ( $poblacion, $aptitud ){

$q=0;

for ( $j=0; $j < 2; $j++ ){

//se reordenan al azar los individuos de la población

$aleatorios = generaAleatorios(sizeof($poblacion));

for ( $k=0; $k<sizeof($poblacion); $k++ ){

$min = $aleatorios[0];

$pos = 0;

for ( $i=0;$i<sizeof($poblacion);$i++ ){

if ( $aleatorios[$i] < $min ){

$min = $aleatorios[$i];

$pos = $i;

}

}

$poblacionOrdenada[$k] = $poblacion[$pos];

$aptitudOrdenada[$k] = $aptitud[$pos];

$aleatorios[$pos] = 1;

}

52

//se enfrentan por parejas

for ( $i=0; $i<sizeof($poblacion);$i +=2){

if ( $aptitudOrdenada[$i] >= $aptitudOrdenada[$i+1]){

$nuevaPoblacion[$q] = $poblacionOrdenada[$i];

}else{

$nuevaPoblacion[$q] = $poblacionOrdenada[$i+1];

}

$q++;

}

}

return $nuevaPoblacion;

}

// Esta parte del código define la función de cruza

function cruza( $poblacion, $probCruza, $len_cromosoma){

//contar los menores a $probCruza (son los que se selccionan para cruza)

do{

$num=0;

$paraCruzar = array();

$aleatorios = generaAleatorios( sizeof($poblacion) );

for ($i=0;$i<sizeof($poblacion); $i++){

if ( $aleatorios[$i] < $probCruza ) {

$paraCruzar[$num] = $poblacion[$i];

$nuevaPos[$num] = $i;

$num++;

53

}

}

}while( bcmod($num, 2) != 0 or $num == 0);

for ( $i=0;$i<sizeof($paraCruzar)/2;$i++ ){

$puntoCruza[$i] = rand(1, $len_cromosoma - 1 );

}

//$paraCruzar contiene las parejas que deben ser cruzadas

// x1.y1 x2.y2

$m=0;

for ( $k=0; $k<sizeof($paraCruzar); $k += 2 ){

$x1 = substr($paraCruzar[$k], 0, $puntoCruza[$m]);

$y1 = substr($paraCruzar[$k], $puntoCruza[$m], $len_cromosoma - $puntoCruza[$m]);

$x2 = substr($paraCruzar[$k+1], 0, $puntoCruza[$m]);

$y2 = substr($paraCruzar[$k+1], $puntoCruza[$m], $len_cromosoma - $puntoCruza[$m]);

$nuevosCromos[$k] = $x1.$y2;

$nuevosCromos[$k+1] = $x2.$y1;

$m++;

}

for ( $k=0; $k<sizeof($nuevosCromos); $k++ ){

$poblacion[$nuevaPos[$k]] = $nuevosCromos[$k];

}

54

return $poblacion;

}

// esta modulo genera los números aleatorios y lo definimos como una función

function generaAleatorios( $cantidad ){

$longitud = 6;

for ( $k=0;$k<$cantidad;$k++ ){

$numero = '';

for ( $i=0;$i<$longitud;$i++ ){

$numero .= rand(0,9);

}

$aleatorios[$k] = '0.'.$numero;

}

return $aleatorios;

}

//este código funciona para nuestro criterio de parada del algoritmo

function criterioParada($aptitud, $porcentaje){

$n = sizeof($aptitud);

for ($i=0;$i<$n;$i++){

$repes = 0;

$elem = $aptitud[$i];

55

for ($j=0;$j<$n;$j++){

if ( $elem == $aptitud[$j] ){

$repes++;

}

}

if ( ($repes * 100)/$n >=$porcentaje){

return true;

}

//revisamos la cantidades de repes

}

return false;

}

// esta parte de código define la función de mutación

function mutacion( $poblacion, $probMutacion, $len_cromosoma ){

for ( $j=0;$j< sizeof($poblacion); $j++ ){

//convertir la cadena en arreglo

$vector = str_split($poblacion[$j]);

for ( $i=0;$i< $len_cromosoma; $i++ ){

$random = generaAleatorios(1);

if ( $random[0] < $probMutacion ) {

if ( $vector[$i] == '0' ){56

$vector[$i] = '1';

}else{

$vector[$i] = '0';

}

}

}

$individuo = '';

for ( $i=0;$i< $len_cromosoma; $i++ ){

$individuo .= $vector[$i];

}

$nuevaPoblacion[$j] = $individuo;

}

return $nuevaPoblacion;

}

//Esta parte de código es para el desplegado de la solución y de la matriz de adyacencia

<h3>

Solucion:

</h3>

<h3>Matriz de adyacencia</h3>

<table border="1">

<tr bgcolor="gray" >

<?for ($p=0;$p<=$n;$p++){?>

<td>

<?echo $p?>

</td>

57

<?}?>

</tr>

<?

//desplegado de la matriz?>

<?for ($i=0;$i<$n;$i++){?>

<tr>

<td bgcolor="gray"> <?echo $i?> </td>

<?for ($j=0;$j<$n;$j++){?>

<td>

<?echo $matrizAdy[$i][$j]?>

</td>

<?}?>

</tr>

<?}?>

</table>

<?for ( $t=0; $t<$generaciones; $t++) {?>

<?

$poblacion = torneo($poblacion, $aptitud);

$poblacion = cruza($poblacion, $probCruza, $len_cromosoma);

$poblacion = mutacion($poblacion, $promutacion, $len_cromosoma);

$aptitud = calculaAptitud($poblacion, $numBits, $n, $matrizAdy, $infinito, $castigo_no_arista, $castigo_repetir,$bonus);

?>

<h3>GENERACION <?echo $t+1?></h3>

Promedio aptitud: <?echo substr(array_sum($aptitud) / $generaciones, 0, 4)?>

<?

58

$maxAptitud = $aptitud[0];

$icosto = 0;

for ($m=0;$m<sizeof($poblacion);$m++){

if ( $aptitud[$m] > $maxAptitud ){

$maxAptitud = $aptitud[$m];

$icosto = $m;

}

}

$optimos[$t] = $poblacion[$icosto];

?>

// este código es para ver el optimo de cada generación

<br>

Optimo actual:

<table border="1"><tr>

<tr>

<td>Individuo</td>

<td>recorrido</td>

<td>costo</td>

<td>aptitud</td>

</tr>

<td><?echo $poblacion[$icosto]?></td>

<td>

<?

$recorrido = binarioADecimal($poblacion[$icosto], $numBits, $n);

for ($j=0;$j<sizeof($recorrido);$j++){59

echo $recorrido[$j].'-';

}

?>

</td>

<td><?echo costoRecorrido(binarioADecimal($poblacion[$icosto], $numBits, $n), $matrizAdy, $infinito)?></td>

<td><?echo $aptitud[$icosto]?></td>

</tr></table>

<br>

<table border="1">

<tr>

<td>Renglon</td>

<td>Individuo</td>

<td>recorrido</td>

<td>costo</td>

<td>aptitud</td>

</tr>

<?for ($i=0;$i<$tam_poblacion;$i++){?>

<tr>

<td><?echo $i +1 ?></td>

<td><?echo $poblacion[$i]?></td>

<td>

<?

$recorrido = binarioADecimal($poblacion[$i], $numBits, $n);

for ($j=0;$j<sizeof($recorrido);$j++){

echo $recorrido[$j].'-';

60

}

?>

</td>

<td>

<?

$recorrido = binarioADecimal($poblacion[$i], $numBits, $n);

echo costoRecorrido($recorrido, $matrizAdy, $infinito);

?>

</td>

<td><?echo $aptitud[$i]?></td>

</tr>

<?}?>

</table>

<a href="genetico.php"> REGRESAR</a>

<br>

<?}?>

//este modulo calcula la aptitud

<?

$aptitud = calculaAptitud($optimos, $numBits, $n, $matrizAdy, $infinito, $castigo_no_arista, $castigo_repetir,$bonus);

$maxAptitud = $aptitud[0];

$icosto = 0;

for ($g=0;$g<sizeof($optimos);$g++){

if ( $aptitud[$g] > $maxAptitud ){

61

$icosto = $g;

$maxAptitud = $aptitud[$g];

}

}

?>

//este código calcula el recorrido óptimo de todas las generaciones

<h3>Optimo global:</h3>

<table border="1"><tr>

<tr>

<td>Individuo</td>

<td>recorrido</td>

<td>costo</td>

<td>aptitud</td>

</tr>

<td><?echo $optimos[$icosto]?></td>

<td>

<?

$recorrido = binarioADecimal($optimos[$icosto], $numBits, $n);

for ($j=0;$j<sizeof($recorrido);$j++){

echo $recorrido[$j].'-';

}

?>

</td>

<td><?echo costoRecorrido(binarioADecimal($optimos[$icosto], $numBits, $n), $matrizAdy, $infinito)?></td>

62

<td><?echo $aptitud[$icosto]?></td>

</tr></table>

<a href="genetico.php"> REGRESAR</a>

Genético.PHP

Este código representa la tabla principal, donde el usuario puede meter los valores y ver la solución del problema del agente viajero (PAV).

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<meta http-equiv="Expires" content="Fri, Jan 01 1900 00:00:00 GMT">

<meta http-equiv="Pragma" content="no-cache">

<meta http-equiv="Cache-Control" content="no-cache">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<meta http-equiv="Lang" content="en">

<meta name="author" content="">

<meta http-equiv="Reply-to" content="@.com">

<meta name="generator" content="PhpED 5.6">

<meta name="description" content="">

<meta name="keywords" content="">

<meta name="creation-date" content="">

<meta name="revisit-after" content="15 days">

<title>Solución</title>

<link rel="stylesheet" type="text/css" href="my.css">

</head>

<body>

63

<form method="post" action="torneo.php">

<h3>Grafica con 5 ciudades (0-1-2-3-4)</h3>

Numero de generaciones <input type="text" name="generaciones" value="20"> ej. 20<br>

Tamaño de la Poblacion <input type="text" name="tam_poblacion" value="150"> ej. 150<br>

Probabilidad de cruza <input type="text" name="prob_cruza" value="0.25">ej. 0.25<br>

Probabilidad de mutacion <input type="text" name="probMutacion" value="0.01">ej. 0.01<br>

<input type="submit" value="enviar">

</form>

</body>

</table>

<a href="principal.html"> REGRESAR A LA PAGINA PRINCIPAL</a>

<br

</html>

MANUAL DE USUARIO.

En este manual podrás encontrar la información de cómo navegar en el Tutorial de Problema del Agente Viajero.

64

Abrir un navegador de su preferencia.

Colocamos en el buscador la dirección donde se encuentra alojado nuestro Tutorial http:// localhost/genetico/principal.html.

65

Una vez colocada la dirección correctamente visualizaremos una página como la que se muestra, la cual contiene la siguiente información:

• Información del alumno

• Introducción

• Descripción

• Solución al PAV (problema del agente viajero)

- Solución improcedente al PAV

- Explicación del algoritmo por etapas: etapa 1 y etapa 2

- Corrida del PAV

Ya una vez mostrada la página el usuario podrá leer la introducción de nuestro tutorial, como se muestra en la pantalla de arriba.

66

Posteriormente ya que el usuario haya leído la introducción, puede seguirse con la descripción del problema, como se muestra en la pantalla de arriba.

67

Una vez que el usuario haya visto la descripción del problema puede ver la solución del problema del agente viajero. Esta solución cuenta con 4 ligas y se pueden ver en la pantalla siguiente:

La primera liga corresponde a una solución improcedente al PAV, la cual puede ser vista por el usuario dando click en ella, una vez que se haya dado click lo que se muestra es lo siguiente:

68

Una vez vista por el usuario, puede regresar a la pantalla principal dando click en la liga REGRESAR.

Regresando a nuestra pantalla principal, el usuario puede meterse a la segunda liga, la cual corresponde a la explicación del algoritmo por etapas y esta es la primera etapa, como se ve en la pantalla.

69

Una vez que se ha dado click en la liga de primera etapa del algoritmo, lo que se ve es lo que está en la pantalla de arriba y corresponde a la primera parte de la solución del agente viajero debidamente explicada. Después de ser vista el usuario puede regresar a la pantalla principal.

70

Ahora el usuario puede dar click en la tercera liga que corresponde a la segunda etapa de la solución del algoritmo, una vez dando click lo que se muestra es lo siguiente:

Que es la descripción detalla de la solución del PAV paso a paso como se ve en la pantalla de arriba. En esta parte el usuario también puede regresar a la pantalla principal.

71

Pantalla principal.

Finalmente el usuario podrá ver la última liga, la cual corresponde a la corrida del programa (corrida del Algoritmo PAV) como se ve en la liga y el usuario podrá pulsar y lo que vera a primera instancia será lo siguiente:

72

Aquí el usuario esta frente a la tabla principal, la cual da solución a nuestro algoritmo y además esta previamente llena con datos, esto es porque estos parámetros son los que nos acercan a una solución óptima de nuestro algoritmo, pero el usuario puede meter los parámetros que desee y a si poder jugar y aprender un poco y sacar sus propias conclusiones de las soluciones dadas por el algoritmo dependiendo de qué parámetros se metan y a si llegar a diferentes soluciones.

Ya que están listos los parámetros en nuestra tabla principal, al enviar los datos nos da una solución como se ve a continuación:

73

Corrida del algoritmo para 20 generaciones, como se ve en las dos pantallas.

74

Se puede ver la corrida del algoritmo y esto es para 20 generaciones.

75

En esta última tabla se puede apreciar el óptimo global que significa que es el recorrido óptimo de todas las generaciones dadas por nuestro algoritmo, a si podemos concluir la corrida de nuestro programa y el usuario finalmente puede regresar a la pantalla anterior donde se muestra la tabla principal por si el usuario decide meter otros parámetros.

Pantalla que muestra la tabla principal de nuestro programa, en la cual el usuario puede meter otros valores.

76

CONCLUSIONES

A grandes rasgos este proyecto (Tutorial vía Web del Problema del Agente Viajero), fue una gran experiencia, ya que puede servir para los alumnos de la materia de Inteligencia Artificial y primordialmente porque lo pueden usar otras generaciones que necesiten saber de este problema que es muy conocido y que es muy fácil de entender pero muy difícil de resolver, además de que se puede aplicar en la vida real y sirve como solución a muchos problemas de este tipo.

Además este tutorial puede servir para otras materias de computación tal es el caso de análisis de algoritmos, ya que se abordo un tema muy importante de dicha materia, esto porque debido a que gracias a los algoritmos genéticos se pueden resolver problemas como el problema del agente viajero de manera un poco más sencilla y más clara. Al realizar este tutorial valga la redundancia se tuvo que estudiar a fondo el problema del agente viajero, así como el estudio de la optimización y también se tuvo que estudiar a detalle la solución de los algoritmos genéticos, ya que con esta técnica fue como se soluciono este problema.

Para este tutorial se desarrollo una plantilla hecha en HTML ya que fue donde se expuso nuestro proyecto, fue una buena experiencia el usar HTML porque se tuvo que repasar para poder usarla nuevamente esta herramienta sencilla pero muy poderosa y en la cual se pueden hacer muchísimas cosas.

El tutorial cuenta con una introducción, la descripción del problema y lo mas importante la solución del agente viajero para cinco ciudades, esto es básicamente la estructura de nuestro tutorial.

También se uso el lenguaje de alto nivel PHP para la realización de nuestro programa (agente viajero), el cual es un lenguaje con el que me identifico mas y que por ende se hizo el programa con esta herramienta tan poderosa y a mi forma de ver embona bien con la página hecha en HTML .

Puedo concluir que aprendí mucho el tema de la optimización que en realidad no están fácil de entender porque se requiere de mucha paciencia y de mucha lógica para entender conceptos y demás, este tutorial ayudara de apoyo a otras materias, lo cual es un objetivo y creo que será cumplido porque está bien implementado y por supuesto

77

probado, lo cual me deja tranquilo y satisfecho el hecho de que funcione este tutorial.

Referencias.

[Búsqueda y Exploración Estocástica 2010] Sergio Gerardo de los Cobos, John Goddard Close, Miguel Ángel Gutiérrez Andrade, Alma Edith Martínez Licona. Búsqueda y Exploración Estocástica.

[PHP, 2007] Curso PHP en línea. http://www.w3schools.com/

[Gutiérrez Andrade 2011] Notas de la UEA Análisis de Algoritmos, Miguel Angel Gutiérrez Andrade, 2011.

[Mariano Posadas 2000] Marino Posadas, Introducción al Lenguaje HTML, Grupo EIDOS Consultaría y Documentación Informática, S.L., 2000

78

79

80

81

82

83