• No se han encontrado resultados

Parte II Planteamiento de la

N/A
N/A
Protected

Academic year: 2018

Share "Parte II Planteamiento de la"

Copied!
83
0
0

Texto completo

(1)

1 20 150

(2)
(3)

Í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

(4)

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

(5)

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

(6)

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

(7)

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ística

Hay 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

(8)

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

(9)

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.

(10)

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:

(11)

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

(12)

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 Viajero

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

Para 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

(13)

* 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 ETAPAS Primera 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. 20 Tamaño de la Población ej. 150 Probabilidad de cruza ej. 0.25 Probabilidad de mutación ej. 0.01 Donde:

• 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

(14)

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 1

Promedio 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

(15)

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

(16)
(17)

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

(18)
(19)

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.

(20)

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.

PHP

PHP 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

(21)

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

(22)

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

(23)

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>

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

(25)

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

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

(27)

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>

(28)

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>

(29)

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>

(30)

Solucionimprocedente.html <ul>Da click a la

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

</a>

<br>

</body>

(31)

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>

(32)
(33)

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>

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

(35)

Etapa2.html

(36)

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.

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

(37)

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>

(38)

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>

(39)

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>

(40)

<td> 5 </td> <td> 500 </td> </tr>

(41)

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>

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

(43)

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>

(45)

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;

(46)

$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

(47)

$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++){

(48)

$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){

(49)

$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); }

(50)

$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; }

(51)

// 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];

(52)

}

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;

(53)

//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++;

(54)

} }

}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++; }

(55)

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

(56)

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

(57)

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

(58)

<?}?> </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>

(59)

$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++){

(60)

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++){

Referencias

Documento similar

Luis Miguel Utrera Navarrete ha presentado la relación de Bienes y Actividades siguientes para la legislatura de 2015-2019, según constan inscritos en el

Fuente de emisión secundaria que afecta a la estación: Combustión en sector residencial y comercial Distancia a la primera vía de tráfico: 3 metros (15 m de ancho)..

En nuestra opinión, las cuentas anuales de la Entidad Pública Empresarial Red.es correspondientes al ejercicio 2010 representan en todos los aspectos significativos la imagen fiel

En nuestra opinión, las cuentas anuales de la Entidad Pública Empresarial Red.es correspondientes al ejercicio 2012 representan en todos los aspectos

La Intervención General de la Administración del Estado, a través de la Oficina Nacional de Auditoría, en uso de las competencias que le atribuye el artículo 168

La Intervención General de la Administración del Estado, a través de la Oficina Nacional de Auditoría, en uso de las competencias que le atribuye el artículo

La campaña ha consistido en la revisión del etiquetado e instrucciones de uso de todos los ter- mómetros digitales comunicados, así como de la documentación técnica adicional de

Abstract: This paper reviews the dialogue and controversies between the paratexts of a corpus of collections of short novels –and romances– publi- shed from 1624 to 1637: