Libertonia
Portada · Todo · Software Libre · Desarrolladores · Comunidad · Internet · Tecnología · Meta · Diarios
Algoritmos genéticos: un caso práctico

Programación
Por jamarier
departamento prometo no soltar más rollos en una temporada , Sección Tecnología
Puesto a las Mon Jan 12th, 2004 at 08:17:38 AM CET

Como segunda parte a esta introducción a los algoritmos genéticos, vamos a desarrollar un programa que nos resuelva un problema de empaquetamiento (que como han indicado por ahí se llama «el problema de la mochila»). Para el que no lo conozca, relato brevemente aquél que vamos a resolver:

Tenemos un directorios lleno de ficheros y subdirectorios y queremos grabarlos en CDs de forma que el espacio que sobre en cada CD sea mínimo y que ni los ficheros ni los directorios se tengan que dividir entre varios CD.

Para ello, tenemos ya un programa llamado «empaca.pl» que implementa dicho algoritmo y que podemos encontrar en empaca con la única pega de no tener más instrucciones de uso que las que vienen en las primeras lineas del programa (less empaca.pl).

Ah, no está escrito en arameo antiguo, es Perl. B-)

 


Como comenté en el otro artículo, para usar un algoritmo genético hacen falta 3 elementos, La descripción del individuo, la función de evaluación (llamada función de ajuste) y los mecanismos de reproducción. Voy a describir a continuación los tres aspectos. Dado que el espacio es reducido, voy a hacer una descripción general y en función de los comentarios me centro en aquellas partes que no hayan quedado muy claras.

Descripción del individuo.

Supongamos que tenemos 10 ficheros a repartir en 3 CDs. Necesitamos indicar de una forma clara como se reparten (o podrían) esos ficheros en los CDs. Un sistema sería poner una lista de ceros y unos de la siguiente forma: como hay 10 ficheros ponemos 3 ristras (número de CDs) de 10 dígitos cada una (número de ficheros/directorios) donde un 0 indica no inclusión y un 1 indica inclusión. ejemplo:

1100000000 0011100000 0000011111

Que significa que los dos primeros archivos entran en el primer CD, los tres siguientes en el segundo y los restantes en el tercero. Este conjunto de datos que definen el estado completo del problema lo llamaremos cromosoma o individuo según nos interese en cada momento. Fijaos que no cualquier ristra de 30 bits representa a un individuo viable (pueden darse casos en los que un archivo esté en varios CD o en ninguno). Por lo que habría que implementar sistemas de control que nos asegurara cuando es realmente una solución y cuando no. Por eso no hemos usado este sistema de codificación.

El sistema que hemos empleado en empaca.pl es definir cada individuo como una única ristra de números (tantos como ficheros a repartir) y cuyo valor representa el CD donde se incluye el fichero. La misma solución anterior se representaría como:

0011122222

La ventaja es obvia, siempre que la longitud del cromosoma sea constante y que las cifras en cada posición sea inferior al número de soportes de grabación, este representará un posible reparto. Por cierto cada trozo del cromosoma con significado se le llama gen (en este caso cada cifra es un gen).

Función de ajuste

La segunda parte interesante es la de encontrar una expresión matemática que puntúe a cada individuo de forma que nuestro ideal sea un máximo o un mínimo.

Un primer intento sería sumar lo que sobra de cada CD e intentar que esta función sea un mínimo. OJO, esto es erróneo porque el espacio sobrante siempre será constante. Una segunda aproximación sería que la suma de todos los espacios sobrantes de los CDs salvo un CD sea mínimo. Esta función si sería válida (dejo como ejercicio la demostración de esto último, o si no lo añado como comentario más tarde); pero tiene un problema: Caso de 3 CDs, dos de ellos casi llenos. Si en esos 2 CDs casi llenos sobran 4 megas, la función de ajuste valorará igual como se repartan estos megas sobrantes: 2+2 o 0+4 o 1+3. Desde mi punto de vista lo ideal sería 0+4, es decir un CD lleno y el otro menos lleno. Osea que sería necesario una función cuya suma de espacios sobrantes menos 1 CD sea mínima pero cuya suma de cuadrados de los mismos espacios fuera máximo. Vamos un lío.

Al final la función escogida a minimizar es la siguiente: es un producto donde cada factor depende del espacio sobrante (tanto por uno) en cada CD según la siguiente relación.

CD_n sobrante -> factor_n=(1+(EspacioTot-EspacioUsad_n)/EspacioTot)

El uno está incluido para evitar la siguiente situación: un CD completamente lleno tendría un factor de valor 0. Sería óptimo. Al multiplicar dicho factor por los factores de los otros soportes, la función de evaluación sería 0, mínimo y por tanto la solución óptima independientemente de los estados de los otros soportes. El 1 no altera el comportamiento del factor pero elimina el problema del 0 (siendo ahora el óptimo el valor de la función de evaluación=1)

El que sobre espacio en un CD es una situación poco deseable (por eso la evaluación de ese espacio no es óptima y el factor de ajuste es superior a 1), pero que exista un desbordamiento en un CDs se convierte en una situación intolerable. Modificamos el factor de un CD desbordado para que el valor de función global sea superior en el caso de desbordamiento que en el caso de espacios no aprovechados. La expresión del factor del soporte desbordado es:

CD_n desbordado -> factor_n=(2+(EspacioUsad_n-EspacioTot)/EspacioTot)

Fijaos que ante dos situaciones de desbordamiento, el valor factor de la función de ajuste menor se da en el que presente un desbordamiento menor, que es lo deseable.

Mecanismo de reproducción

He de confesar que en este apartado he sido un poco perro. La definición purista de Algoritmo genético implica que los cromosomas de 2 padres se mezclen para obtener una descendencia. Podría haber escogido dos individuos y copiar un trozo de su cromosoma y mezclarlo con el trozo del cromosoma de otro y obtener un descendiente de estos. Luego aportaríamos un poco de azar mutando el cromosoma de algún descendiente (para evitar el empobrecimiento genético de la población) y por último eliminaríamos a los menos aptos de la especie.

En empaca.pl hemos simplificado el proceso reproductivo. Hacemos reproducción asexuada. Los más adaptados de la generación anterior tienen 2 descendientes uno idéntico a si mismo y el otro un hijo mutado (alteramos el valor de algún gen del cromosoma del padre). El resto de la población tiene un solo descendiente que es un hijo mutado. Como la población total sufre un crecimiento igual al número de los considerados más aptos, hacemos una criba de los peor clasificados según la función de ajuste. Y así mantenemos la población constante

Y eso es todo

Para facilitar la posibilidad de jugar con el software de empaquetamiento, se han habilitado una serie de opciones en la línea de comandos que permiten variar las variables del algoritmo tales como la población, el número de generaciones, grado de la mutación y otros.

¡Que lo disfrutéis!

< ¿Está KDE en decadencia? (29 comments) | Una nueva vida con Mandrake (!y sin salir de Linux!) (62 comments) >
Enlaces Relacionados
· empaca
· More on Programación
· Also by jamarier

Encuesta
empaca.pl me parece:
· La mejor utilidad del 2004. Premio nobel 7%
· Una buena utilidad, que usaré regularmente a partir de ahora 7%
· Curioso, he jugado un poco con ella y ya está 7%
· No me es útil 5%
· No funciona 2%
· Dedicate a la magia. 10%
· Un ejemplo de mala programación 0%
· No soy capaz de hacerlo funcionar 5%
· ¿y la rubia? ¿No aparece en esta encuesta? 53%

Votos: 39
Resultados | Otras Encuestas

Menu
· crear cuenta
· FAQ
· búsqueda
· Fuentes de Noticias

Login
Nueva cuenta
Usuario:
Contraseña:

Ver: Modo: Orden:
Algoritmos genéticos: un caso práctico | 14 comentarios (10 temáticos, 4 editoriales, 0 ocultos)
¿Azar en el paso entre generaciones? (4.00 / 2) (#5)
por nya a las Sun Jan 11th, 2004 at 08:51:49 PM CET
(Información Usuario)

El tema me parece muy interesante, aunque mis conocimientos son pocos :). Pero si no voy errado, el hecho de que la reproducción sea asexual hace que la evolución sea más lenta (en número de generaciones, en tiempo de ejecución supongo que dependerá de la implementación) que si fuera sexual. Además, intuyo (aunque no afirmo con rotundidad, si alguien le ve problemas que lo diga) que la reproducción sexual podría minimizar el riesgo de caer en máximos/mínimos locales.

Una duda que tengo (no del empaca.pl, sino de los algoritmos genéticos en general) es si los individuos que pasan a la siguiente generación son los más aptos, elegidos siempre de forma determinista, o por el contrario interviene el azar, aunque la probabilidad de pasar a la siguiente generación venga determinada por la función de evaluación. Lo digo porque en la evolución biológica interviene siempre el azar, y se tiene que considerar el efecto de la deriva genética. Esto hace que en según qué circunstancias (por ejemplo en poblaciones pequeñas) se pueda llegar a la fijación de un alelo que tenía una fitness menor que otro (y esto no es lo mismo que los máximos/mínimos locales) simplemente por azar. Como esto no es deseable si lo que quieres es encontrar una solución suficientemente buena, supongo que la mayoría de bibliotecas para programación genética o programas en sí lo harán de forma totalmente determinista, pero me interesaría saber si existe la posibilidad de incorporar el azar al paso entre generaciones. ¿Alguien sabe si hay alguna herramienta que permita esta opción?



Mi (poca) experiencia (3.00 / 1) (#7)
por Walden (waldenmail at gmx dot net) a las Tue Jan 13th, 2004 at 02:44:44 AM CET
(Información Usuario)

Yo apliqué una vez los algoritmos genéticos en el diseño de antenas inteligentes. Una antena inteligente, o array de antenas, es un conjunto de antenas sobre las que se aplica una ganancia en amplitud y fase de manera que se pueda controlar electrónicamente el haz de emisión/recepción de todo el conjunto, permitiendo por ejemplo "apuntar y seguir" a un emisor movil.

Los algoritmos de diseño de estos controles de ganancia, denominados algoritmos de beamforming, aplicados a cada antena son continuo objeto de investigación, y los hay de todos los sabores. Normalmente, se basan en métodos de gradiente para encontrar el mínimo de una función de coste. Para impedir caer en un mínimo local pueden crease perturbaciones en la elección de ganancias y evaluar el error cometido. Los algoritmos genéticos demostraron un buen comportamiento ante errores no lineales (acoples entre antenas, fallos eléctricos, etc), incluso mejor que algoritmos tan conocidos como el LMS. La convergencia es sorprendentemente rápida. Eso sí, el suelo del error tras muchas iteraciones suele ser más alto que el RLS. Parece una buena opción para disparar el sistema, y luego saltar a otro algoritmo más refinado o ad-hoc.



 
Curiosidades de los algoritmos genéticos (3.00 / 1) (#12)
por svampa a las Sun Jan 18th, 2004 at 07:15:37 PM CET
(Información Usuario)

Durante mucho tiempo me encantó hacer simulaciones genéticas en el sentido más clásico: Simular una población de individuos en unos condiciones y llegar al mejor. Quizá algún día busque las pruebas que hice y las ponga en la red.

Más tarde descubrí que era un método para buscar soluciones a problemas diversos, incluso matemáticos.

Si no tenemos ningún técnica matemática para calcular los parámetros óptimos de un proceso, un algoritmo genetico proporciona siempre una solución buena, quizá no la mejor, pero si buena y muy rápidamente. Siempre se pueden hacer varias pruebas partiendo distintos "indivíduos inciales" para intentar evitar caer en un óptimo local.

Entre los más curiosos intentos que encontré hace tiempo están estos:

Un algorítmo genético para optimizar las colas de porcesos en Unix/Linux.

Este me fascinó. Analizar las tareas que realiza un usuario desde que se conecta para intentar carga anticipadamente las librerías que utiliza y disminuir la latencia. Tiene que conjugar dos factores, si la carga demasiado pronto, usa memoria inecesariamente, si tarda demasiado con el usuario arrancará el programa antes de haber cargado nada, y tendrá que esperar como siempre. Como buen algoritmo genético, se adapta a cada individuo.

Si alguien encuentra los enlaces de esto, que me lo diga, los perdía hace mucho. Bueno la verdad es que hace mucho que no trabajo on esto.



 
Explicar la funcion de ajuste o evaluacion (2.00 / 1) (#10)
por tecnocrata a las Tue Jan 13th, 2004 at 09:45:43 PM CET
(Información Usuario)

Aun no me quedo claro lo de la funcion de ajuste, si yo hubiese hecho el algoritmo hubiese utilizado la primera que planteas y que dices que es erronea, de sumar todos los espacios restantes y buscar el minimo de ellos. Pero tu dices que ese espacio sera constante, podrias explicar un poco mas la funcion de ajuste por favor?

Muchas Gracias



Matemáticas de segundo de bachillerato (2.00 / 1) (#13)
por Corellian a las Tue Jan 20th, 2004 at 12:02:04 AM CET
(Información Usuario)

Esto me recuerda a los problemas que hace unos días hacíamos en Matemáticas, en Segundo de Bachillerato: Los famosos "problemas de Optimización". Claro que, por lo que aquí se refiere, con un grado de complicación más, añadido ;-)

Saludos.



 
Algoritmos genéticos: un caso práctico | 14 comentarios (10 temáticos, 4 editoriales, 0 ocultos)
Ver: Modo: Orden:

ecol Logo Powered by Scoop
Todas las Marcas Registradas y copyrights de esta página son propiedad de sus respectivos dueños.
Los comentarios son propiedad del que los escribe.
Los iconos de las noticias y el logotipo son propiedad de Javier Malonda.
El Resto © 2002 Escomposlinux.org y aledaños.

Puedes sindicar los contenidos de libertonia en formato RSS 1.0 y RDF 0.9. También se puede sindicar la cola de envíos pendientes de moderación.

El proyecto escomposlinux.org está dedicado a la memoria de tas

crear cuenta | faq | búsqueda