La ruta más óptima entre n ciudades aplicando un …...la ruta más corta para nuestro mapa de 20...
Transcript of La ruta más óptima entre n ciudades aplicando un …...la ruta más corta para nuestro mapa de 20...
1
La ruta más óptima entre n ciudades
aplicando un algoritmo genético
The most optimal route between n cities applying a genetic algorithm
Jhonatan Pineda Gómez – Sebastián Huertas Cardona Facultad de ingeniería, universidad tecnológica de Pereira, Colombia
Correo-e: [email protected]
Resumen— En este documento se pretende implementar un
algoritmo genético con el cual se puede hallar la ruta más óptima
entre n ciudades aplicando un algoritmo genético.
Palabras clave—, Ruta más óptima, algoritmo genético.
Abstract— in this document we intend to implement a genetic
algorithm with which the most optimal route between n cities can
be found by applying a genetic algorithm
Key Word —, the most optimal route, genetic algorithm.
I. INTRODUCCIÓN
TSP (Travelling Salesman Problem)
En el problema se presentan N! rutas posibles, aunque se puede
simplificar ya que dada una ruta nos da igual el punto de partida
y esto reduce el número de rutas a examinar en un factor N
quedando (N-1)! Como no importa la dirección en que se
desplace el viajante, el número de rutas a examinar se reduce
nuevamente en un factor 2. Por lo tanto, hay que considerar (N-
1)!/2 rutas posibles.
Puede comprobarse que por cada ciudad nueva que
incorporemos, el número de rutas se multiplica por el factor N
y crece exponencialmente (factorialmente). Por ello el
problema pertenece a la clase de problemas NP-completos.
Se va a codificar un algoritmo genético que sea capaz de
resolver este problema para n ciudades.
Imagina que eres un vendedor y te han dado un mapa como el
opuesto. En él se ve que el mapa contiene un total de 20
ubicaciones y le dicen que es su trabajo visitar cada una de estas
ubicaciones para realizar una venta.
Antes de emprender el viaje, es probable que desee planificar
una ruta para minimizar el tiempo de viaje. Afortunadamente,
los humanos somos bastante buenos en esto, podemos
encontrar una ruta razonablemente buena sin necesidad de
hacer mucho más que mirar el mapa. Sin embargo, cuando
encontramos una ruta que consideramos óptima, ¿cómo
podemos probar si realmente es la ruta óptima?
Para entender por qué es tan difícil probar la ruta óptima,
consideremos un mapa similar con solo 3 ubicaciones en lugar
de las 20 originales. Para encontrar una ruta única, primero
debemos elegir una ubicación de inicio entre las tres
ubicaciones posibles en el mapa. A continuación, tendríamos
una opción de 2 ciudades para la segunda ubicación, y
finalmente, solo queda 1 ciudad para elegir para completar
nuestra ruta. Esto significa que hay 3 x 2 x 1 rutas diferentes
para elegir en total.
Eso significa que, para este ejemplo, solo hay 6 rutas diferentes
para elegir. Entonces, para este caso de solo 3 ubicaciones, es
razonablemente trivial calcular cada una de esas 6 rutas y
encontrar la más corta. Si eres bueno en matemáticas, es posible
2
que ya te hayas dado cuenta de cuál es el problema. La cantidad
de rutas posibles es un factorial de la cantidad de ubicaciones
que se pueden visitar, y los problemas con los factoriales es que
crecen en tamaño notablemente rápido.
Por ejemplo, el factorial de 10 es 3628800, pero el factorial de
20 es un gigantesco, 2432902008176640000.
Volviendo a nuestro problema original, si queremos encontrar
la ruta más corta para nuestro mapa de 20 ubicaciones,
¡tendríamos que evaluar 2432902008176640000 rutas
diferentes! Incluso con el poder de la informática moderna, esto
es terriblemente poco práctico, y para problemas aún mayores,
es casi imposible.
Encontrar una solución al problema del agente viajero requiere
que establezcamos un algoritmo genético de una manera
especializada. Por ejemplo, una solución válida debería
representar una ruta en la que cada ubicación se incluye al
menos una vez y solo una vez. Si una ruta contiene una sola
ubicación más de una vez, o se pierde una ubicación por
completo, no sería válida y sería un valioso tiempo de cálculo
para calcular su distancia.
Para garantizar que el algoritmo genético cumpla con este
requisito, se necesitan tipos especiales de métodos de mutación
y cruce.
En primer lugar, el método de mutación solo debería ser capaz
de barajar la ruta, nunca debería agregar o quitar una ubicación
de la ruta, de lo contrario correría el riesgo de crear una solución
no válida. Un tipo de método de mutación que podríamos usar
es la mutación de intercambio.
Con la mutación de intercambio dos ubicaciones en la ruta se
seleccionan al azar, entonces sus posiciones simplemente se
intercambian. Por ejemplo, si aplicamos la mutación de
intercambio a la siguiente lista, [1, 2, 3, 4, 5] podríamos
terminar con [1,2,5,4,3]. Aquí, las posiciones 3 y 5 se
cambiaron creando una nueva lista con exactamente los
mismos valores, solo un orden diferente. Debido a que la
mutación de intercambio solo está intercambiando valores
preexistentes, nunca creará una lista que tenga valores faltantes
o duplicados en comparación con el original, y eso es
exactamente lo que queremos para el problema del vendedor
viajero.
Ahora que hemos tratado el método de mutación, debemos
elegir un método de cruce que pueda imponer la misma
restricción.
Un método de cruce que puede producir una ruta válida es un
cruce ordenado. En este método de cruce, seleccionamos un
subconjunto del primer padre y luego agregamos ese
subconjunto a la descendencia. Cualquier valor faltante se
agrega a la descendencia del segundo padre para que se
encuentren.
Para aclarar un poco esta explicación, considere el siguiente
ejemplo:
Aquí un subconjunto de la ruta se toma del primer padre (6,7,8)
y se agrega a la ruta de la descendencia. A continuación, las
ubicaciones de ruta faltantes se suman en orden desde el
segundo padre. La primera ubicación en la ruta del segundo
padre es 9, que no está en la ruta de la descendencia, por lo que
se agrega en la primera posición disponible. La siguiente
posición en la ruta de los padres es 8, que está en la ruta de la
descendencia, por lo que se omite. Este proceso continúa hasta
que la descendencia no tenga valores vacíos restantes. Si se
implementa correctamente, el resultado final debe ser una ruta
que contenga todas las posiciones que hicieron sus padres sin
perder ni duplicar posiciones.
Aplicando el algoritmo genético con una población inicial de
50 cromosomas, un numero evolutivo de 100 generaciones y 20
ciudades
3
II. CONTENIDO
1. El primer proceso Generar población inicial.
2. el segundo proceso Evaluar individuos.
3. El tercer proceso Selección se ha optado por el
método de Selección por torneo que consiste
básicamente en seleccionar k individuos que
participaran en un torneo el cual ganara el que
tenga la mejor función de adaptabilidad.
4. Después del proceso de selección ya conocemos
cuales son los individuos más actos para sobrevivir
y cuantos descendientes van a tener. Lo siguiente
que tenemos que hacer es el cuarto proceso de
cruzamiento
5. El quinto proceso Mutación que es el encargado de
cambiar la información de algún hijo
aleatoriamente con el objetivo de alcanzar zonas de
soluciones que el cruzamiento haya descartado.
6. Después de tener codificado todos los procesos del
algoritmo genético se tienen que unir todos en un
orden específico para que el algoritmo funcione
correctamente.
La solución del problema se implementó en el lenguaje de
programación Java y para los gráficos la librería Javafx.
Para empezar, se creó una clase que pueda codificar las
ciudades.
City.java
Ahora se tiene una clase que contenga todas las ciudades de
destino para el recorrido.
TourManager.java
4
A continuación, se necesita una clase que pueda codificar las
rutas, estas generalmente se conocen como recorridos (Tours)
Tour.java
Clase que pueda tener a una población de recorridos candidatos
Población.java
Clase Algoritmo_Genetico que manejará el funcionamiento del
algoritmo genético y evolucionará nuestra población de
soluciones
Algoritmo_Genetico.java
5
Clase para iniciar el algoritmo genético la cual tiene dos
funciones una que es con las ciudades ya preestablecidas y la
otra con las ciudades aleatorias, recibe la cantidad de ciudades,
la población inicial de cromosomas y el numero evolutivo de
generaciones.
TSP_Algoritmo_Genetico.java
6
Finalmente se tiene la clase para probar que el programa
funcione correctamente y nos muestre en pantalla gráficamente
usando Javafx la ruta más óptima.
Prueba.java
Pruebas del algoritmo genético
7
8
Se puede observar gráfica y estadísticamente que al aumentar
la cantidad de generaciones, es más óptima la distancia y la ruta
elegida por el algoritmo.
9
III. Conclusiones
Se aprendió a implementar un algoritmo genético para
hallar la ruta más óptima entre n ciudades.
Los algoritmos genéticos reducen la complejidad en
gran escala.
una solución válida debería representar una ruta en la
que cada ubicación se incluye al menos una vez y solo
una vez.
Para resolver el problema se necesitaron tipos
especiales de métodos de mutación y cruce.
Se hizo una ardua investigación sobre el tema y se
aplicaron los conceptos vistos en clase.
IV. Referencias
http://www.sc.ehu.es/ccwbayes/docencia/mmcc/docs/
temageneticos.pdf
http://eddyalfaro.galeon.com/geneticos.html
http://www.it.uc3m.es/jvillena/irc/practicas/06-
07/05.pdf
http://sci2s.ugr.es/sites/default/files/files/Teaching/Gr
aduatesCourses/Bioinformatica/Tema%2006%20-
%20AGs%20I.pdf
https://iccl.inf.tu-
dresden.de/w/images/b/b7/GA_for_TSP.pdf
https://scholar.google.com.co/scholar?q=tsp+algorithm
+genetic&hl=es&as_sdt=0&as_vis=1&oi=scholart&sa=X
&ved=0ahUKEwj27_XD4ubXAhUGOCYKHUHBCHgQgQM
IIzAA
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10
.1.1.371.7771&rep=rep1&type=pdf
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10
.1.1.91.9167&rep=rep1&type=pdf
https://es.slideshare.net/shivankshah3/travelling-
salesman-problem-using-genetic-algorithms
https://github.com/parano/GeneticAlgorithm-TSP
https://link.springer.com/article/10.1023/A:100652901
2972
http://www.theprojectspot.com/tutorial-post/applying-
a-genetic-algorithm-to-the-travelling-salesman-
problem/5
http://code.makery.ch/library/javafx-8-tutorial/es/
https://docs.oracle.com/javase/8/javase-
clienttechnologies.htm
http://www.oracle.com/technetwork/es/java/javafx/ov
erview/index.html
http://www.tutorialspoint.com/javafx/
https://netbeans.org/features/java-on-
client/javafx.html
https://docs.oracle.com/javase/7/docs/api/
https://www.codeproject.com/Articles/1403/Genetic-
Algorithms-and-the-Traveling-Salesman-Prob
http://www.obitko.com/tutorials/genetic-
algorithms/tsp-example.php
http://pcbunn.cithep.caltech.edu/Java/Genetic.html