Sunteți pe pagina 1din 123

Desarrollo de Algoritmos Genticos en Lenguaje C

aplicados a la resolucin de problemas de


optimizacin
Luis Marco Gimnez

UNED - 2005

Genetic Algorithms
Implementation in C Language
applied to the resolution of
optimization's problems

Resumen
Los Algoritmos Genticos, como paradigma principal de la computacin evolutiva, presentan una alternativa a los procedimientos tradicionales de bsqueda y
optimizacin como mtodos sistemticos para la resolucin de estos problemas. En
concreto, y en el mbito de este trabajo, los algoritmos genticos se han aplicado
con buenos resultados en problemas de optimizacin en los que se desea localizar
los mximos o mnimos de una funcin matemtica determinada. La herramienta
desarrollada para este proyecto n de carrera,

ra la Optimizacin de Funciones-,

SIGENOF -Sistema Gentico pa-

consiste en la implementacin de un algoritmo

gentico para la optimizacin de una amplia variedad de funciones matemticas de


las que se desea localizar sus mximos globales. La principal aportacin de esta
herramienta frente a otras implementaciones genticas es la incorporacin de un
sencillo e intuitivo interfaz grco de usuario que permite, entre otras funcionalidades, la introduccin de la funcin a optimizar junto con los parmetros que guiarn
la ejecucin del algoritmo gentico, representacin grca de las mejores soluciones
localizadas por la herramienta, as como la generacin de cheros con los resultados de la ejecucin que permiten realizar un anlisis posterior de las soluciones
encontradas.

ii

Abstract
Genetic Algorithms, as a major main paradigm of evolutional computation, present a good alternative to traditional procedures of searching and optimizing as
systematic methods for the resolution of this kind of problems. Genetic algorithms
have been applied with good results in optimizing problems where the objective
is to obtain the maximus or minimus about a mathematical function. The implemented tool in this degree work,

SIGENOF -Sistema Gentico para la Optimi-

zacin de Funciones- (Genetic System for the Optimization Functions),

consist in

the implementation of a genetic algorithm for the optimization of a wide variety


of mathematical functions of which we want to obtain their local maximums. The
main contribution of this tool compared to other genetic implementations is its easy
and intuitive graphical user interface allowing, among others functions, the input
of the function to be optimized, the parameters of the genetic algorithm that will
guide its execution, a graphical representation of the best solutions founded by the
tool, and a generation of les within the execution's results that will allow a further
analysis of the founded solutions.

iii

iv

Lista de palabras clave


Algoritmo Gentico, Aptitud, Bsqueda ciega, Bsqueda estocstica, Computacin Evolutiva, Cromosoma, Cruce, Elitismo, Evolucin biolgica, Gen, Individuo,
Maximizacin, Mutacin, Optimizacin, Poblacin, Reproduccin, Seleccin, Solucin.

Keywords
Genetic Algorithm, Fitness, Blind search, Stocastic search, Evolutionary Computation, Chromosome, Crossover, Elitism, Biological evolution, Gen, Individual,
Maximization, Mutation, Optimization, Population, Reproduction, Selection, Solution.

Siglas, Abreviaturas y
Acrnimos
AG: Algoritmo Gentico
ASCII: American Standard Code for Information Interchange
GIMP: GNU Image Manipulation Program
GNU: GNU's Not Unix
GPL: General Public License
GTK: GIMP Toolkit
GUI: Interfaz Grco de Usuario
SIGENOF: Sistema Gentico para la Optimizacin de Funciones

ndice general
Lista de palabras clave

Siglas, Abreviaturas y Acrnimos

1. Introduccin

15

1.1.

Preliminares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

1.2.

Computacin Evolutiva

. . . . . . . . . . . . . . . . . . . . . . . . .

16

1.3.

Algoritmos Genticos . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

1.4.

Caractersticas de los AG como mtodos de bsqueda

. . . . . . . .

18

1.5.

Mtodos de Optimizacin y Bsqueda tradicionales . . . . . . . . . .

19

1.6.

Diferencias de los AG con los mtodos de bsqueda y optimizacin


tradicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

1.7.

Funcionamiento de un AG bsico . . . . . . . . . . . . . . . . . . . .

20

1.8.

Herramientas software actuales que implementan AG . . . . . . . . .

23

1.9.

Herramienta SIGENOF

. . . . . . . . . . . . . . . . . . . . . . . . .

24

1.10. Problemas de optimizacin que resuelve SIGENOF . . . . . . . . . .

25

1.11. Estructura de la memoria

26

. . . . . . . . . . . . . . . . . . . . . . . .

2. Algoritmo Gentico implementado en SIGENOF

29

2.1.

Lenguaje de implementacin utilizado

. . . . . . . . . . . . . . . . .

29

2.2.

Estructuras de datos . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

2.3.

Sintaxis para la denicin de funciones

. . . . . . . . . . . . . . .

33

2.3.1.

Variables y Constantes:

. . . . . . . . . . . . . . . . . . . . .

34

2.3.2.

Operadores disponibles:

. . . . . . . . . . . . . . . . . . . . .

34

2.3.3.

Funciones predeterminadas: . . . . . . . . . . . . . . . . . . .

35

NDICE GENERAL

2.3.4.
2.4.

Reglas de precedencia: . . . . . . . . . . . . . . . . . . . . . .

36

Algoritmo gentico implementado . . . . . . . . . . . . . . . . . . . .

37

2.4.1.

Paso 1. Inicializacin . . . . . . . . . . . . . . . . . . . . . . .

37

2.4.2.

Paso 2. Evaluacin . . . . . . . . . . . . . . . . . . . . . . . .

39

2.4.3.

Paso 3. Mantener al mejor individuo . . . . . . . . . . . . . .

39

2.4.4.

Paso 4. Bucle de ejecucin del AG hasta MAXGENS . . . . .

40

2.4.5.

Paso 5. Terminacin del AG . . . . . . . . . . . . . . . . . . .

45

3. Interfaz Grco de Usuario de SIGENOF

47

3.1.

Librera grca utilizada . . . . . . . . . . . . . . . . . . . . . . . . .

47

3.2.

Visin general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

3.3.

Funcionalidades del GUI . . . . . . . . . . . . . . . . . . . . . . . . .

48

3.3.1.

Panel 1: Parmetros Poblacionales

. . . . . . . . . . . . . . .

50

3.3.2.

Panel 2: Parmetros Naturales

. . . . . . . . . . . . . . . . .

50

3.3.3.

Panel 3: Otros Parmetros del AG

. . . . . . . . . . . . . . .

50

3.3.4.

Panel 4: Ventana de Resultados . . . . . . . . . . . . . . . . .

51

3.3.5.

Panel 5: Funcin

3.3.6.

Panel 6: Grco de Soluciones generacionales

3.3.7.

Panel 7: Datos estadsticos y Tiempo de ejecucin

3.3.8.

Panel 8: Progreso y Control del proceso

3.4.

Ejemplo de uso del GUI

a Optimizar . . . . . . . . . . . . . . . . .
. . . . . . . . .

52
55

. . . . . .

55

. . . . . . . . . . . .

55

. . . . . . . . . . . . . . . . . . . . . . . . .

56

3.4.1.

Paso 1. Iniciar SIGENOF

. . . . . . . . . . . . . . . . . . . .

3.4.2.

Paso 2. Denir la funcin

3.4.3.

Paso 3. Establecer el espacio

3.4.4.

Paso 4. Grabar la funcin

. . . . .

60

3.4.5.

Paso 5. Establecer los parmetros poblacionales . . . . . . . .

61

3.4.6.

Paso 6. Establecer los parmetros naturales del AG . . . . . .

62

3.4.7.

Paso 7. Establecer otros parmetros del AG . . . . . . . . . .

63

3.4.8.

Paso 8. Seleccionar el tipo de visualizacin grca

. . . . . .

63

3.4.9.

Paso 9. Comenzar con la ejecucin

. . . . . . . . . . . . . . .

64

3.4.10. Paso 10. Evaluacin de las soluciones obtenidas . . . . . . . .

64

J
J

a optimizar

57

. . . . . . . . . . . .

58

. . . . . . . . . . . . . . . . .

59

y su espacio

denido.

NDICE GENERAL

4. Ejemplos de aplicacin de SIGENOF

67

4.1.

Caso particular 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

4.2.

Caso particular 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

4.3.

Caso particular 3. Funcin de Ackley . . . . . . . . . . . . . . . . . .

69

4.4.

Caso particular 4. Funcin de Shaer . . . . . . . . . . . . . . . . . .

70

4.5.

Caso particular 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

4.6.

Caso particular 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

4.7.

Ejecucin con variantes

. . . . . . . . . . . . . . . . . . . . . . . . .

74

4.7.1.

Sin variacin de parmetros (Ejecucin 1) . . . . . . . . . . .

75

4.7.2.

Variacin de la probabilidad de mutacin (Ejecucin 2)

75

4.7.3.

Variacin de las probabilidades de cruce y mutacin (Ejecu-

. . .

cin 3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.4.

Variacin del tamao de la poblacin a un valor pequeo (Ejecucin 4)

4.7.5.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Variacin del n
cucin 5)

4.7.6.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

o de generaciones a un tamao grande (Ejecu-

Variacin del n

80

Variacin del tamao de la poblacin a un valor grande (Ejecucin 7)

4.7.8.

78

o de generaciones a un tamao pequeo (Eje-

cin 6) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.7.

77

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

82

Variacin de la probabilidad de mutacin y del tamao de la


poblacin a un valor grande (Ejecucin 8) . . . . . . . . . . .

83

5. Conclusiones

85

A. Gramtica para Funciones J en SIGENOF

87

B. Funcin ran2

89

B.1. Fichero aleatorio.h

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

89

B.2. Fichero aleatorio.c

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

C. Cdigo del AG de SIGENOF

93

C.1. Fichero ag.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

93

C.2. Fichero ag.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

95

10

NDICE GENERAL

D. Ficheros de salida de SIGENOF


D.1. Descripcin de las salidas

111

. . . . . . . . . . . . . . . . . . . . . . . . 111

D.2. Fichero salida_ag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111


D.3. Fichero soluciones_ag

Referencias Bibliogrcas

. . . . . . . . . . . . . . . . . . . . . . . . . .

112

115

ndice de guras
1.1.

Codicacin de Soluciones en los Cromosomas

1.2.

Esquema de funcionamiento de un AG bsico

1.3.

Estructura genrica del bucle bsico de ejecucin de un AG

2.1.

Esquema de un algoritmo gentico bsico .

2.2.

Generacin de 1000 nmeros reales aleatorios

. . . . . . . . . . . . .

38

2.3.

Generacin de 5000 nmeros reales aleatorios

. . . . . . . . . . . . .

39

2.4.

Mtodo de la Ruleta

. . . . . . . . . . . . . . . . . . . . . . . . . . .

41

2.5.

Cruce en un solo punto

2.6.

Cruce en un solo punto en SIGENOF

3.1.

. . . . . . . . . . . .

18

. . . . . . . . . . . . .

21

. . . . .

22

. . . . . . . . . . . . . . .

37

. . . . . . . . . . . . . . . . . . . . . . . . .

43

. . . . . . . . . . . . . . . . .

43

GUI de SIGENOF

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

3.2.

Funcin de ejemplo

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

56

3.3.

Inicio de SIGENOF

. . . . . . . . . . . . . . . . . . . . . . . . . . .

58

3.4.

Denicin de la funcin J y del espacio S

3.5.

Grabacin de la funcin J y espacio S

3.6.

Parmetros poblacionales

3.7.

Parmetros naturales

3.8.

Otros parmetros

3.9.

Tipo de visualizacin grca

3.10.

Soluciones obtenidas por SIGENOF para el ejemplo propuesto

3.11.

Resultados estadsticos para el ejemplo propuesto

3.12.

Mximo para el ejemplo propuesto

4.1.

Caso Particular 1

. . . . . . . . . . . . . . .

60

. . . . . . . . . . . . . . . . .

61

. . . . . . . . . . . . . . . . . . . . . . . .

62

. . . . . . . . . . . . . . . . . . . . . . . . . . .

62

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

. . . . . . . . . . . . . . . . . . . . . . .

64

. . . .

64

. . . . . . . . . . .

64

. . . . . . . . . . . . . . . . . . .

65

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

11

12

NDICE DE FIGURAS

4.2.

Caso Particular

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

4.3.

Caso Particular 4

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

4.4.

Caso Particular 5 (vista 1)

. . . . . . . . . . . . . . . . . . . . . . .

72

4.5.

Caso Particular 5 (vista 2)

. . . . . . . . . . . . . . . . . . . . . . .

72

4.6.

Caso Particular 6

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

4.7.

Caso inicial - Generacin 1

4.8.

Variacin probabilidad de mutacin

4.9.

Variacin probabilidades de cruce y mutacin

4.10.

Variacin a un tamao de la poblacin pequeo

4.11.

Variacin a un no de generaciones pequeo

4.12.

Variacin a un no de generaciones grande

4.13.

Variacin a un tamao de la poblacin grande

4.14.

Variacin tamao poblacin y probabilidad mutacin a valores grandes

. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . .

76
77
78

. . . . . . . . . . . .

79

. . . . . . . . . . . . . .

81

. . . . . . . . . . . . . . .

82

. . . . . . . . . . . .

83
84

ndice de cuadros
2.1.

Denicin del cromosoma

2.2.

Denicin de la funcin J a optimizar

2.3.

Sintaxis para la denicin de funciones J

2.4.

Denicin de una funcin J

4.1.

Parmetros del AG utilizados en los ejemplos

. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .

31
32

. . . . . . . . . . . . . . .

33

. . . . . . . . . . . . . . . . . . . . . . .

37

13

. . . . . . . . . . . . .

67

14

NDICE DE CUADROS

Captulo 1

Introduccin
1.1. Preliminares
Para la correcta comprensin de esta memoria a continuacin se van a denir una
serie de conceptos bsicos necesarios para la lectura del mismo y que se enmarcan
dentro del contexto de los Algoritmos Genticos.

Algoritmo Gentico : Tcnica de programacin que imita la evolucin biolgica como estrategia para resolver problemas.

Poblacin :

Conjunto de candidatos que representan soluciones potenciales

con las que el Algoritmo Gentico trabajar para resolver un determinado


problema.

Cromosoma : Codicacin de las soluciones potenciales del problema de forma que una computadora pueda procesarlas. Un enfoque comn es codicar
estos candidatos, o soluciones, como cadenas binarias donde cada valor de bit
representa el valor de algn aspecto de la solucin. Un mtodo alternativo
consiste en codicar las soluciones como nmeros enteros o reales, donde cada
posicin representa algn aspecto particular de la solucin.

Gen : Elemento de informacin atmica que compone una parte de la posible


solucin que es codicada en un cromosoma.

Aptitud :

Mtrica que permite evaluar cuantitativamente a cada candidato


15

1.2. Computacin Evolutiva

16

con respecto al problema que se desea resolver.

Seleccin : Proceso por el cual se eligen a los candidatos que representan una
mayor aptitud al problema a resolver para su posterior cruce y reproduccin.

Cruce : Procedimiento por el que los candidatos seleccionados para su reproduccin intercambian segmentos de informacin gentica, para producir posteriormente una descendencia articial cuyos individuos sean combinaciones
de sus padres. Este proceso pretende simular el proceso anlogo a la recombinacin que se da en los cromosomas durante la reproduccin sexual.

Reproduccin : Proceso por el cual se producen copias de los candidatos previamente seleccionados y que pasarn a formar parte de una nueva poblacin
de candidatos.

Mutacin : Cambios aleatorios que se producen durante el proceso de copia


en algunos cromosomas para producir diversidad en la poblacin.

Generacin : Acervo de soluciones candidatas producidas por la aplicacin


sucesiva de los mecanismos de seleccin, cruce, reproduccin y mutacin entre los candidatos de una poblacin, y que produce una nueva poblacin de
candidatos.

Solucin del Algoritmo Gentico : Mejor solucin obtenida por el algoritmo, de entre todas las soluciones candidatas que componen la poblacin, en
el momento de haber iterado un nmero determinado de generaciones.

Era : Sucesivas ejecuciones del Algoritmo Gentico que proporcionan diferentes mejores soluciones.

1.2. Computacin Evolutiva


La Computacin Evolutiva presenta un enfoque alternativo a los algoritmos tradicionales para abordar problemas complejos de bsqueda y aprendizaje a travs de
modelos computaciones de procesos evolutivos, cuyo principal objetivo consiste en
guiar una bsqueda estocstica haciendo evolucionar a un conjunto de estructuras,
y seleccionando, de modo iterativo, las ms adecuadas.

1. Introduccin

17

Son cuatro los paradigmas fundamentales de la computacin evolutiva:

Los Algoritmos Genticos [Holl92]. Hacen evolucionar a una poblacin de


enteros binarios sometindolos a transformaciones unitarias y binarias genricas, junto a un proceso de seleccin.

Los Programas Evolutivos [Mich99]. Hacen evolucionar a una poblacin de


estructuras de datos sometindolas a una serie de transformaciones especcas
y a un proceso de seleccin.

Las Estrategias Evolutivas . Hacen evolucionar a una poblacin de nmeros


reales que codican las posibles soluciones de un problema numrico y los
tamaos de salto. La seleccin es implcita.

La Programacin Evolutiva . Hacen evolucionar a una poblacin de mquinas de estados nitos sometindolas a transformaciones unitarias.

1.3. Algoritmos Genticos


Desarrollados por John Holland, junto a su equipo de investigacin, en la Universidad de Michigan en la dcada de 1970, los algoritmos genticos representan el
paradigma principal de la computacin evolutiva. Son mtodos sistemticos para la
resolucin de problemas de bsqueda y optimizacin que aplican a estos los mismos
mtodos de la evolucin biolgica: seleccin basada en la poblacin, reproduccin
sexual y mutacin, combinando las nociones de supervivencia del individuo ms
apto con un intercambio estructurado y aleatorio de caractersticas entre individuos
de una poblacin de posibles soluciones, conformando un algoritmo de bsqueda
que puede aplicarse para resolver problemas de optimizacin en diversos campos.
Estos algoritmos de optimizacin tratan de obtener el vector de parmetros

(x1 , x2 . . . , xn )

que genera el mximo o el mnimo global de una cierta funcin

F (x1 , x2 . . . , xn ).
En un algoritmo gentico el problema se parametriza en un conjunto de variables

(x1 , x2 . . . , xn )

que a su vez se codican en cromosomas, formando el conjunto

de estos ltimos poblaciones, y, a diferencia de otros mtodos de bsqueda, en los


algoritmos genticos el mtodo de bsqueda est implcito en l, por tanto se puede

1.4. Caractersticas de los AG como mtodos de bsqueda

18

armar que los algoritmos genticos son independientes del problema que se desea resolver, lo cual por un lado los hacen robustos por su utilidad ante cualquier
problema, pero por otro lado los hacen dbiles al no estar especializados en ninguno.

Figura 1.1:

Codicacin de Soluciones en los Cromosomas

Como se puede apreciar en la gura 1.1, las soluciones, codicadas en los cromosomas (

C1, C2, ..., Cn ),

solucin al problema (

compiten para ver cul de ellos constituye la mejor

S1 , S2, ..., Sn ),

de forma que nicamente los cromosomas

mejor adaptados sobrevivirn, dando lugar, en las siguientes generaciones, a cromosomas ms fuertes, y por tanto a mejores soluciones, las cuales legarn su material
gentico a las siguientes generaciones. Este escenario de competicin y legado es
anlogo al de la naturaleza, en el que la presin de la seleccin natural provoca que
sean los mejores individuos aquellos que sobrevivan frente a los ms dbiles, siendo
estos los que se reproducirn y crearn nuevos individuos. La diversidad gentica,
de forma anloga al escenario natural, se introducir mediante mutaciones y cruces.

1.4. Caractersticas de los AG como mtodos de


bsqueda
Adems de la caracterstica de seleccin natural, se pueden citar otras caractersticas inherentes a los algoritmos genticos como mtodos de bsqueda [Perez96]:

1. Introduccin

19

Ciega, es decir, no se dispone de ningn conocimiento especco del problema,


de manera que la bsqueda se basa exclusivamente en los valores de la funcin
objetivo.

Codicada, puesto que no se trabaja directamente sobre el dominio del problema, sino sobre representaciones de sus elementos.

Mltiple, ya que se busca simultneamente entre un conjunto de candidatos.


Estocstica, referida tanto a las fases de seleccin como a las de transformacin. Ello proporciona control sobre el factor de penetracin de la bsqueda.

Todas las caractersticas enumeradas se introducen deliberadamente para proporcionar ms robustez a la bsqueda.

1.5. Mtodos de Optimizacin y Bsqueda tradicionales


Los mtodos de optimizacin y bsqueda tradicionales se pueden clasicar en
tres tipos principales: basados en el clculo innitesimal, de enumeracin y aleatorios
[Gold89].

1.

Mtodos de clculo basados en el clculo innitesimal: Estos mtodos


se dividen a su vez en dos tipos: Directos e Indirectos

Mtodos Indirectos :

Buscan un extremo local mediante la resolucin de

un conjunto de ecuaciones no lineales que aparecen tras igualar el gradiente de la funcin objetivo a cero. Dada una funcin sin restricciones
y suave, buscando un posible pico empezando por restringir la bsqueda
a aquellos puntos que poseen pendiente cero en todas las direcciones.

Mtodos Directos :

Buscan puntos locales ptimos movindose en una

direccin relativa al gradiente local.

2.

Tcnicas de enumeracin: Consisten en ir probando uno a uno todos los


puntos de un espacio de bsqueda restringido, ya sea un espacio nito o uno

1.6. Diferencias de los AG con los mtodos de bsqueda y optimizacin


tradicionales

20

innito discretizado. Presentan el problema de ser poco ecientes ya que requieren un tiempo excesivo de clculo cuando el espacio de bsqueda es grande.

3.

Algoritmos de bsqueda aleatoria: Consisten en probar con distintos valores de manera aleatoria. Se puede armar que no actan peor que las tcnicas
de enumeracin.

Estas tcnicas se caracterizan por no ser robustas, aunque esto no signica que no
sean tiles.

1.6. Diferencias de los AG con los mtodos de bsqueda y optimizacin tradicionales


Las diferencias de los AG con los algoritmos de bsqueda y optimizacin tradicionales se pueden resumir en las siguientes [Gold89]:

1.

Los AG trabajan con una codicacin de un conjunto de parmetros no con


los parmetros directamente.

2.

Los AG no se limitan a buscar en las cercanas de un punto, sino que utilizan


una poblacin de puntos.

3.

Los AG utilizan nicamente la informacin que les proporciona la funcin de


coste, sin necesidad de ninguna otra informacin. Por lo tanto no requieren
calcular derivadas.

4.

Los AG utilizan reglas de transicin probabilsticas para guiar su bsqueda


en lugar de las reglas deterministas que otros mtodos tradicionales suelen
utilizar.

Estas cuatro propiedades contribuyen a que los AG sean ms robustos que los
mtodos tradicionalmente usados.

1.7. Funcionamiento de un AG bsico


La gura 1.2 representa el esquema de funcionamiento de un algoritmo gentico bsico. En este algoritmo bsico, el proceso comienza seleccionando un nmero

1. Introduccin

21

de cromosomas que conformarn la poblacin inicial. A continuacin se evala la


funcin de adaptacin para estos individuos. Esta funcin de adaptacin proporciona una medida de la aptitud de cada cromosoma para sobrevivir en su entorno, y
debe estar denida de tal forma que los cromosomas que representen las mejores
soluciones obtengan valores ms altos de adaptacin; de este modo, los individuos
ms aptos se seleccionan en parejas para reproducirse. La reproduccin genera nuevos cromosomas que combinarn caractersticas de ambos padres. Estos nuevos
cromosomas reemplazarn a los individuos con menores valores de adaptacin. A
continuacin algunos cromosomas son seleccionados al azar para ser mutados. La
mutacin consiste en aplicar un cambio aleatorio en su estructura. Posteriormente,
los nuevos cromosomas se incorporarn a la poblacin reemplazando a cromosomas ya existentes. Para realizar esta sustitucin existen varios criterios que pueden
utilizarse para elegir a los cromosomas que sern reemplazados.

Figura 1.2:

Esquema de funcionamiento de un AG bsico

El ciclo de seleccin, reproduccin y mutacin se repetir hasta que se cumpla


el criterio de terminacin del algoritmo gentico, momento en el cual el cromosoma
mejor adaptado se devolver como la mejor solucin.

1.7. Funcionamiento de un AG bsico

22

Los criterios de terminacin empleados en implementaciones de AGs son bsicamente dos [Mich99]:

1.

La condicin de terminacin ms simple es aquella que va comprobando el nmero actual de generacin

g ; la bsqueda se termina si el nmero total de gene-

raciones excede un valor constante predenido, es decir si

2.

g M AXGEN S .

Como la condicin de terminacin anterior supone el conocimiento del usuario


de las caractersticas de la funcin, lo cual inuye en la longitud de la bsqueda, parece ms conveniente que el algoritmo nalice la bsqueda cuando
la probabilidad de una mejora signicativa entre sucesivas generaciones sea
muy pequea, es decir que el valor de la funcin de coste entre generaciones

no mejore por encima de un cierto umbral

En el algoritmo gentico programado, SIGENOF , se han implementado ambas condiciones de terminacin, siendo la primera el criterio por defecto, mientras que el
segundo criterio se puede utilizar de forma discrecional por el usuario de la herramienta.
La estructura genrica del bucle bsico de ejecucin de un algoritmo gentico se
puede sintetizar en el diagrama mostrado en la gura 1.3 [Perez96]:

Figura 1.3:

Estructura genrica del bucle bsico de ejecucin de un AG

Como puede observarse en la gura anterior, una poblacin

1 Sistema

Gentico para la Optimizacin de Funciones

Pop,

que consta

1. Introduccin
de

23

miembros, se somete a un proceso de seleccin para constituir una poblacin

intermedia

AuxPop

de

miembros. De dicha poblacin intermedia se extraer un

grupo reducido de individuos llamados progenitores, que son los que efectivamente
se van a reproducir. Sirvindose de los operadores genticos, los progenitores son
sometidos a ciertas transformaciones de alteracin y recombinacin en la fase de

nuevos individuos que constituyen

la descendencia. Para formar la nueva poblacin

Pop[t + 1], se deben seleccionar n

reproduccin, en virtud de las cuales se generan

supervivientes de entre los

n+s

de la poblacin auxiliar y la descendencia; esto se

realizar en la fase de reemplazo.


Todo el procedimiento de bsqueda estar guiado exclusivamente por una funcin de aptitud
evaluacin

f(x)

u(x),

la cual se obtiene directamente a partir de la funcin de

del problema.

1.8. Herramientas software actuales que implementan AG


Se pueden encontrar una gran variedad de herramientas que implementan AG y
que son usadas para diferentes propsitos en diversidad de campos, entre los que se
encuentran la acstica, ingeniera aeroespacial, astronoma y astrofsica, qumica,
ingeniera elctrica, los mercados nancieros, juegos, geofsica, ingeniera de materiales, matemtica y algoritmia, diseo de rutas y horarios, biologa molecular,
reconocimiento de patrones y robtica, entre otros.
Muchas de estas herramientas presentan unas limitaciones que se pueden resumir
en las siguientes:

La mayora no implementan ningn GUI que permita la interaccin con la


herramienta por parte del usuario de manera sencilla e intuitiva. Sus salidas
se suelen realizar mediante consola o a travs de cheros de texto.

No son fcilmente parametrizables, es decir, suele ser difcil cambiar el objetivo


del problema que resuelven. Por ejemplo, muchas herramientas que optimizan
funciones buscando mximo o mnimos necesitan ser compiladas cada vez que
la funcin objetivo, o algunos de sus parmetros, vara.

1.9. Herramienta SIGENOF

24

En muchas ocasiones el cambio de los parmetros del AG, tales como el tamao de la poblacin, la probabilidad de cruce, etc., resulta complejo al tener que
realizar cambios en el programa o, en el mejor de los casos, en algunos cheros de conguracin de la herramienta. Frecuentemente el programa necesita
volver a compilarse para hacer efectivos dichos cambios.

Los lenguajes utilizados en su desarrollo son bastante heterogneos, encontrndose herramientas programadas en C/C++, Perl, Java, LISP, Fortran,
etc. En muchos casos estas herramientas son portables, es decir se pueden ejecutar en distintas computadoras, como por ejemplo las que se desarrollan en
Java (Java application o Java applet), sin embargo en otros casos, sobretodo
cuando incorporan un GUI, son dependientes del sistema operativo para el
cual se han desarrollado.

1.9. Herramienta SIGENOF


SIGENOF, se ha desarrollado con el objetivo de suplir algunas de las limitaciones que otras herramientas presentan, sobretodo en lo referente a la capacidad de
interactividad del usuario con sta.
Las caractersticas ms destacables que aporta SIGENOF con respecto a otras
herramientas se pueden resumir en las siguientes:

1.

Proporciona un entorno grco sencillo e intuitivo que permite:

Introducir fcilmente diferentes parmetros al AG como tamao de la poblacin, nmero de generaciones, nmero de eras, probabilidad de cruce
y de mutacin, etc.
Denir dinmicamente, sin necesidad de volver a compilar el programa, la
expresin de la funcin matemtica que se desea optimizar, as como los
valores mximos y mnimos que sus variables de incertidumbre pueden
tomar.
Interactuar en tiempo de ejecucin con la herramienta pudiendo iniciar
o cancelar la ejecucin a peticin del usuario, o denir el tipo de visualizacin grca que mejor convenga.

1. Introduccin

25

Representacin grca de las mejores soluciones obtenidas por el AG en


cada generacin / era.
Posibilidad de pausar la ejecucin tras nalizar una era para poder observar con detenimiento el grco de las mejores soluciones obtenidas antes
de pasar a la siguiente era.

2.

Portabilidad frente a distintas plataformas hardware y software. La herramienta se ha desarrollado en un lenguaje portable, en lenguaje C, que permite la
compilacin en cualquier sistema operativo que disponga de un compilador de
ANSI C. Para la implementacin del GUI se han utilizado las libreras grcas GTK+ distribuidas bajo licencia GNU GPL. Estas libreras requieren
la instalacin del framework GTK+, distribuido tambin bajo licencia GNU
GPL y que puede descargarse gratuitamente desde Internet.

3.

Fcil instalacin y distribucin ya que nicamente se requiere la distribucin


del framework GTK+ y del chero ejecutable de la herramienta.

4.

Generacin de cheros log con los resultados de cada ejecucin.

5.

La herramienta ha sido desarrollada bajo licencia GNU GPL, lo que permite


su libre distribucin.

1.10. Problemas de optimizacin que resuelve SIGENOF


SIGENOF, se utiliza de forma eciente para resolver problemas de optimizacin
como el que se describe a continuacin.
Se dene el

vector de parmetr os :

= [x1 , . . . , xn ]

Donde los elementos

xi

son nmeros reales acotados dentro de un cierto espacio

S.
max
S = {x1 [xmin
, xmax
], x2 [xmin
, xmax
], . . . , xn [xmin
]}
1
1
2
2
n , xn

1.11. Estructura de la memoria

26

Es decir, el valor que puede tomar cada elemento


de un cierto valor mnimo
Sea la funcin de coste

xmin
i

xi

se encuentra acotado dentro

y de un cierto valor mximo

xmax
.
i

J : Rn R

J = f ()

Se verica la condicin de que

J >0

para cualquier

considerado.

El problema que resuelve el algoritmo gentico, por tanto, es el de obtener el


vector de parmetros ptimo
de coste

opt S

que genera el valor mximo

Jopt

de la funcin

J.
Jopt = J(opt ) = maxS (J())

1.11. Estructura de la memoria


Esta memoria se ha dividido en cinco captulos. En el captulo 1 se exponen los
conceptos bsicos que envuelven a los AG como uno de los paradigmas de la Computacin Evolutiva, presentndose estos como un enfoque alternativo a los algoritmos
tradicionales usados en problemas de bsqueda y optimizacin de soluciones. Asimismo se enumeran las caractersticas de los AG como mtodos de bsqueda y se
comparan con los mtodos tradicionales, se expone el funcionamiento de un AG bsico y se hace un breve estudio de las herramientas software actuales que implementan
AG. Por ltimo se proporciona una visin general de la herramienta implementada
para este proyecto, SIGENOF, as como los problemas de optimizacin que sta
resuelve.
En el captulo 2 se describen los detalles de implementacin de SIGENOF, tales
como el lenguaje utilizado para su escritura, las estructuras de datos relevantes para
el AG programado (Cromosomas, Funciones a optimizar, Parmetros de ejecucin,
etc.), la sintaxis para la denicin de las funciones

a optimizar, y el detalle pro-

cedimental de los principales pasos que realiza la herramienta en la implementacin


de su AG.
En el captulo 3 se justica, en primer lugar, la librera grca con la que se
ha implementado el GUI de SIGENOF, las GTK+. A continuacin se realiza un
anlisis de todas y cada una de las funciones que la herramienta proporciona a

1. Introduccin

27

travs de su GUI, describiendo, paso a paso y a modo de manual de usuario, la


ejecucin de la herramienta con un ejemplo.
El captulo 4 muestra algunos de los ejemplos utilizados para vericar el funcionamiento de SIGENOF como herramienta para la optimizacin de funciones
matemticas. En cada uno de estos ejemplos se describe el problema a resolver y se
muestra la solucin grca en la que se puede observar el valor ptimo de la funcin;
posteriormente se compara la solucin encontrada por SIGENOF frente a la solucin real de forma que se pueda ponderar la calidad de la solucin proporcionada
por la herramienta. Asimismo se explica cmo se comporta la herramienta en la
optimizacin de un caso particular con diferentes variaciones de los parmetros del
AG, tales como el tamao de la poblacin, la probabilidad de cruce y/o mutacin,
entre otros.
En el captulo 5 se describen algunas de las conclusiones a las que he llegado
tras la implementacin de SIGENOF.
Al nal de la memoria se incluyen, como apndices, informacin relativa a diversos aspectos clave en la implementacin del AG de SIGENOF, as como de los
cheros de salida (

cheros LOG ) generados por la herramienta.

28

1.11. Estructura de la memoria

Captulo 2

Algoritmo Gentico
implementado en SIGENOF
2.1. Lenguaje de implementacin utilizado
El lenguaje de programacin de alto nivel utilizado para implementar el AG que
usa SIGENOF ha sido el lenguaje C, puesto que presenta las siguientes ventajas:

El lenguaje C es adecuado para la programacin a bajo nivel cubriendo as el


vaco entre el lenguaje mquina y los lenguajes de alto nivel ms convencionales.

Permite la redaccin de programas fuentes muy concisos debido, en parte, al


gran nmero de operadores que incluye en lenguaje.

Tiene un repertorio de instrucciones bsicas relativamente pequeo, aunque


incluye numerosas funciones de biblioteca que mejoran las instrucciones bsicas. Adems los usuarios pueden escribir bibliotecas adicionales para su propio
uso.

Los compiladores de C son, frecuentemente, compactos y generan programas


objeto pequeos y ecientes.

Los programas escritos en C son muy portables. La razn de esto es que C


deja en manos de las funciones de biblioteca la mayora de las caractersticas
29

2.2. Estructuras de datos

30

dependientes de la computadora. De esta forma, la mayora de los programas escritos en C se pueden compilar y ejecutar en muchas computadoras
diferentes, con muy pocas o ninguna modicacin.

2.2. Estructuras de datos


Los cromosomas poblacionales se han denido como estructuras que contienen
los siguientes datos:

Un vector de parmetros o variables

de la funcin

que se desea optimizar,

particular para el cromosoma. Este vector de parmetros representa una solucin particular al problema. Estos parmetros, tambin denominados
estn acotados al espacio

de posibles valores que pueden tomar, y que han

sido denidos para la funcin

Un valor que representa el


funcin

Un valor

genes,

J.

tness

o grado de adaptacin del cromosoma a la

que se desea optimizar.

que indica la probabilidad de seleccin del cromosoma para su

reproduccin.

Un valor

que representa la probabilidad acumulada del cromosoma con

respecto a los dems cromosomas de la poblacin, decisivo para su seleccin


para el cruce con otro cromosoma.

Un valor booleano que indica que el cromosoma ha sido seleccionado para su


cruce y reproduccin.

La denicin del cromosoma se ha realizado como se muestra en el cuadro 2.1.

2. Algoritmo Gentico implementado en SIGENOF

31

Estructura CROMOSOMA

typedef struct CROMOSOMA


{
long *x;
float fitness;
float p;
float q;
int seleccionado;
}
Tipo_cromosoma;
Cuadro 2.1:

Denicin del cromosoma

De esta forma, la poblacin se ha establecido como un conjunto de


mosomas denidos como un vector de

La funcin

pop_size

cro-

pop_size elementos de tipo Tipo_cromosoma.

que se desea optimizar se ha denido como una estructura que

contiene los siguientes datos:

Una cadena de caracteres que contiene la descripcin aritmtica de la funcin

a optimizar, ajustada a la sintaxis denida en el cuadro 2.3. Esta represen-

tacin proporciona una gran exibilidad ya que permite optimizar diferentes


funciones

sin necesidad de volver a compilar el programa cada vez que sta

vare. La gramtica denida para las expresiones aritmticas de las funciones

se describe en el Apndice A.

Un valor entero que indica el nmero de parmetros o variables


la funcin, con

xi que contiene

0 i numero_parametros 1.

Un vector de valores de coma otante que establece el valor mnimo que cada
variable

xi puede tomar como extremo inferior xmin del espacio S

de la funcin

J.
Un vector de valores de coma otante que establece el valor mximo que cada
variable
funcin

xi

puede tomar como extremo superior

xmax

del espacio

de la

J.

La denicin de la funcin

se ha realizado como se muestra en el cuadro 2.2.

2.2. Estructuras de datos

32

Estructura FUNCIN

typedef struct DEF_FUNCION


{
char *funcion;
int numero_parametros;
float *valor_min_parametro;
float *valor_max_parametro;
}
Tipo_funcion;
Cuadro 2.2:

Denicin de la funcin J a optimizar

Como se puede observar en el cuadro 2.1, se ha denido el tipo del vector de


parmetros

como entero largo (long

*x),

puede representar se encuentra en el intervalo

cuyo rango de posibles valores que

[2.147.483.648 . . . 2.147.483.647], sin

embargo los posibles valores que dichos parmetros pueden tomar se han denido
en la tabla 2.2 como valores de coma otante (float

float *valor_max_parametro).

*valor_min_parametro y

Este cambio en el tipo de datos para el vector de

parmetros se ha realizado con el n de optimizar el tiempo de ejecucin del AG


as como su tamao en memoria, ya que los clculos con enteros son sensiblemente
ms rpidos que con nmeros en coma otante. Estos parmetros, tratados como

1 y

valores en coma otante, son redondeados, por defecto, a tres cifras decimales

almacenados posteriormente en el cromosoma como valores enteros largos. Cuando


se desea operar con estas variables, como sucede cuando se realiza la evaluacin
del cromosoma segn la funcin de coste

para determinar su adaptacin o

tness

a dicha funcin, se realiza el proceso inverso convirtiendo los valores enteros a su


correspondiente valor en coma otante.
Otras variables que se han considerado en la implementacin del AG son:

Tamao de la poblacin (POP_SIZE), es decir, el nmero de cromosomas


de que consta la poblacin.

Nmero mximo de generaciones

(MAXGENS) en las que se ejecutar el

bucle bsico del AG para dar por nalizada una era.

1 Aunque el nmero de cifras decimales es un valor que, como se ver posteriormente, puede ser
denido por el usuario de la herramienta.

2. Algoritmo Gentico implementado en SIGENOF


Nmero de eras

33

(ERAS); establece el nmero de ejecuciones completas e

independientes entre s del AG.

Probabilidad de cruce

de los cromosomas (pc). Es un nmero real com-

prendido en el intervalo [0, 1] que dene la probabilidad que cada cromosoma


tendr de ser seleccionado para su cruce y reproduccin con otro cromosoma.

Probabilidad de mutacin de los cromosomas (pm). Nmero real comprendido en el intervalo [0, 1] que dene la probabilidad que cada cromosoma
tendr de sufrir una mutacin en sus genes.

2.3. Sintaxis para la denicin de funciones J


La sintaxis que permite denir diferentes funciones

se muestra en el cuadro

2.3.

SINTAXIS PARA LA DEFINICIN DE FUNCIONES

1. VARIABLES Y CONSTANTES:
Variables de funcin x[0], x[1], ..., x[j]
Constantes pi, e
Constantes Numricas enteras, Punto Flotante o Expresiones Exponenciales

2. OPERADORES DISPONIBLES:
suma(+) resta/negacin(-) producto(*) div(/) potencia(/\)

3. FUNCIONES PREDEFINIDAS:
sin, cos, tan, asin, acos, atan, hsin, hcos, htan, sqrt, exp, ln, log, abs

4. REGLAS DE PRECEDENCI A (de mayor a menor):


1o Parntesis
2o Negacin unaria
3o Potencia, Producto y Divisin
4o Suma y Resta

Cuadro 2.3:

Sintaxis para la denicin de funciones J

A continuacin se detallan, de manera individual, los diferentes elementos que


componen dicha sintaxis.

2.3. Sintaxis para la denicin de funciones J

34

2.3.1. Variables y Constantes:


Variables de incertidumbre de la funcin (x[j] ): Dada una determinaf

da funcin
variables

xi

con

variables de incertidumbre, es decir

de la funcin se denirn como variables

0 j n 1.

Con esta sintaxis las variables

f (x1 , x2 , ..., xn ),

x[j],

donde

x1 , x2 , ..., xn ,

las

j = i1

se denirn como

x[0], x[1], ..., x[n 1]. As en la expresin de una funcin f (x1 , x2 ) apareceran
nicamente las variables

x[0]

x[1],

junto con los operadores necesarios, fun-

ciones predenidas y las constantes numricas necesarias para su denicin


completa.

Constantes predenidas:
1. Constante (pi ): Establece

el valor del nmero

el cual se dene de

manera aproximada como 3,14159265358979. Una expresin en la que se haga


uso de la constante
2.

como

se redene como

2 pi.

Constante e de Euler (e ): Establece el valor del nmero e el cual se dene

de manera aproximada como 2,718282. Una expresin en la que se haga uso


de la constante

como ocurre en

Constantes numricas:
1. Constantes Enteras:

2e

se redene como

2 e.

Como por ejemplo las constantes

2, -5

125.

Se

redenen en la expresin de la misma forma.


2.

Constantes de Punto Flotante: Como por ejemplo las constantes 2.25


-48,002.

En este caso se redenen en la expresin de la misma forma pu-

dindose sustituir el punto decimal por una coma decimal o viceversa, como
mejor convenga, quedando redenidos como
3.

2,25

2.25

-48,002

48.002.

Expresiones Exponenciales: Expresiones como 2 103 2.05 105 se

pueden redenir en notacin exponencial como

2E + 3, 2E3

2.05E 5.

2.3.2. Operadores disponibles:


Operador suma (+): Suma dos trminos a y b. Una expresin como x + y
se redene como

x[0] + x[1].

Operador resta ():


expresin como

Obtiene la diferencia de dos trminos

x (y z)

se redene como

x[0] (x[1] x[2]).

b.

Una

2. Algoritmo Gentico implementado en SIGENOF

35

Operador producto (*): Multiplica dos trminos a y b. Una expresin como


2x

se redene como

2 x[0].

Operador divisin (/): Divide dos trminos a y b. Una expresin como y/x
se redene como

x[1]/x[0].

Operador potencia (^): Realiza el clculo a


expresin como

x3

se redene como

elevado al exponente

b.

Una

x[0]^3.

Operador negacin unaria (-): Realiza el complemento de signo del trmino al que antecede. Una expresin como

5y

se redene como

5 x[1].

2.3.3. Funciones predeterminadas:


Funciones trigonomtricas:
1. seno, coseno y tangente (sin(a), cos(a), tan(a)):
expresiones trigonomtricas como
denindose stas como
2.

seno(2.5), coseno(x)

sin(2, 5), cos(x[0])

tangente(1 z)

re-

tan(1 x[2]).

arcoseno, arcocoseno y arcotangente (asin(a), acos(a), atan(a)): Ob-

tiene el valor de expresiones trigonomtricas como


y

Obtiene el valor de

arcoseno(2.5), arcocoseno(x)

arcotangente(1z), redenindose stas como asin(2, 5), acos(x[0]) y atan(1

x[2]).
3.

seno, coseno y tangente hiperblica (hsin(a), hcos(a), htan(a)): Obtie-

ne el valor de expresiones trigonomtricas hiperblicas como

cosenoHiperbolico(x)
mo

tangenteHiperbolica(1 z),

hsin(2, 5), hcos(x[0])

senoHiperbolico(2.5),

redenindose stas co-

htan(1 x[2]).

Funcin raz cuadrada (sqrt(a)): Realiza clculos del tipo


dose mediante esta sintaxis como

2,

redenin-

sqrt(2).

Funcin exponencial (exp(a)): Realiza clculos del tipo ex , donde e es la


constante de Euler y

exp(x[0]).

x es el argumento a. Estas expresiones se redenen como

Alternativamente esta expresin tambin se podra redenir como

e^x[0].

Funciones logartmicas:
1. Logaritmo en base 10 (log(a)):

Obtiene el logaritmo en base 10 del

2.3. Sintaxis para la denicin de funciones J

36

argumento

a. Una expresin como log(y x) se redene como log(x[1] x[0]).

2.

Logaritmo natural (ln(a)): Obtiene el logaritmo natural del argumento

a.

Una expresin como

ln e

Valor absoluto (abs(a)):


expresin como

|x|

se redene como

ln(e).

Obtiene el valor absoluto del argumento

se redene como

a.

Una

abs(x[0]).

2.3.4. Reglas de precedencia:


Una expresin en la que existan diversos operadores juntos puede resultar ambigua. Para resolver estas situaciones se han denido unas sencillas reglas de precedencia, las cuales aplican los diferentes operadores en el orden denido a continuacin,
considerando en este caso al factor
dencia que los operadores
esta enumeracin, como

Suma

Parntesis

como un elemento de mayor prece-

Resta. Los operadores que aparecen agrupados en

Potencia, Producto y Divisin, tienen la misma precedencia

cuando aparecen en una expresin; en este caso se resolver la expresin mediante


un anlisis sintctico de izquierda a derecha.

Parntesis.

Negacin unaria.

Potencia, Producto y Divisin.

Suma y Resta.

As, una funcin

denida como,

f (x1 , x2 ) = 21.5 + x1 sin(4x1 ) + x2 sin(4x2 )


S = {x1 [3.0, 12.1], x2 [4.1, 5.8]}
segn la sintaxis establecida para el AG, en el cuadro 2.3 y la gramtica descrita
en el Apndice A, se dene como se muestra en el cuadro 2.4.

2. Algoritmo Gentico implementado en SIGENOF

37

Funcin: 21.5 + x[0] * sin(4*pi*x[0]) + x[1] * sin(4*pi*x[1])


Nmero de parmetros: 2
Valor mnimo parmetro x[0]: -3.0, x[1]: 4.1
Valor mximo parmetros x[0]: 12.1, x[1]: 5.8

Cuadro 2.4:

Denicin de una funcin J

2.4. Algoritmo gentico implementado


El AG implementado se ha realizado siguiendo el esquema bsico de algoritmo
gentico propuesto por Michalewicz [Mich99], y mostrado en la gura 2.1.

Figura 2.1:

Esquema de un algoritmo gentico bsico

Se detalla a continuacin la implementacin de los diferentes pasos del AG:

2.4.1. Paso 1. Inicializacin


Este primer paso es uno de los ms crticos, en lo que a resultados del AG
se reere, ya que es el responsable de generar

aleatoriamente

la poblacin inicial

2.4. Algoritmo gentico implementado

38

de individuos con la que el AG empezar a operar. Es especialmente importante


que el generador de nmeros aleatorios, o ms concretamente

pseudoaleatorios 2

sea

lo sucientemente bueno y capaz para generar individuos de forma verdaderamente


aleatoria. Para ello se ha utilizado la implementacin que se da en el texto [Recip88]
como

ran2,

una funcin que produce nmeros aleatorios de manera

perfecta, consi-

derando la denicin de funcin perfecta la que los autores describen en el texto: 

...

pagaremos $1000 al primer lector que nos convenza de lo contrario . En las guras
2.2 y 2.3 se muestra la distribucin de varios nmeros aleatorios generados con dicha
implementacin; en el primer grco se generaron 1000 nmeros reales aleatorios
comprendidos en el intervalo

[0, 100],

mientras que en la segunda se generaron 5000

nmeros reales aleatorios en el intervalo

[1000, 1000].

Se puede observar en ellas

cmo los distintos nmeros generados se distribuyen de forma aleatoria a lo largo


del espacio de posibles valores que pueden tomar. El cdigo fuente de la funcin

ran2

se muestra en el Apndice B.

Figura 2.2:

2 El

Generacin de 1000 nmeros reales aleatorios

concepto de aleatorio se suele reservar a la generacin mediante fenmenos fsicos, tales


como el tiempo transcurrido entre sucesivos clicks de un contador Geiger situado cerca de una
muestra radiactiva.

2. Algoritmo Gentico implementado en SIGENOF

Figura 2.3:

39

Generacin de 5000 nmeros reales aleatorios

2.4.2. Paso 2. Evaluacin


En este paso se evala cada individuo o cromosoma
tamao
su

POP_SIZE

tness

sobre la funcin de coste

de la poblacin inicial de

del problema a resolver, obteniendo

o adaptacin al problema.

2.4.3. Paso 3. Mantener al mejor individuo


Se identica y se selecciona el mejor individuo de la generacin actual para
conservar su informacin gentica para la siguiente generacin. Esta seleccin se
realiza en funcin del grado de adaptacin del individuo a la funcin de coste

que

se est optimizando. En este caso su adaptacin vendr determinada por el valor


que hace mximo la funcin de coste

en la generacin actual. El AG guarda al

mejor individuo de la generacin en una variable de tipo

mejor_cromosoma.

Tipo_cromosoma

llamada

2.4. Algoritmo gentico implementado

40

2.4.4. Paso 4. Bucle de ejecucin del AG hasta MAXGENS


Este cuarto paso se subdivide a su vez en los siguientes seis subpasos:

Paso 4.1. Incremento del contador de generaciones


En este paso nicamente se actualiza un contador de generaciones para controlar
el bucle de ejecucin del AG.

Paso 4.2. Aplicacin del operador de Seleccin


El propsito de la seleccin de padres es dar ms oportunidades de reproduccin
a aquellos individuos de una poblacin que son los que mejor se ajustan tras haber
sido evaluados por la funcin de evaluacin. Con este propsito, el operador de
Seleccin aplica, en este AG, el

Mtodo de la Ruleta

para establecer la probabilidad

de seleccin de cada cromosoma de la poblacin actual.


El algoritmo que describe el Mtodo de la Ruleta se detalla como:

1.

Se suman los

tness

se le denominar

de todos los individuos de la poblacin

Ji .

A esta suma

F, denindose como:
P OP _SIZE

F =

Ji

i=1

2.

Se calcula la probabilidad de seleccin

pi para cada cromosoma de la poblacin

como:

pi =

3.

Se calcula la probabilidad acumulada

Ji
F

qi para cada cromosoma de la poblacin

como:

P OP _SIZE

qi =

pk

k=1

4.

Se gira la ruleta
siguiente:

POP_SIZE

veces. Cada vez que se gira la ruleta se realiza lo

2. Algoritmo Gentico implementado en SIGENOF


Se genera un nmero real aleatorio

Si

r < q1

dentro del rango

se selecciona el cromosoma

cromosoma i-simo

C1 ,

41

[0, 1].

en caso contrario se selecciona el

Ci (2 i P OP _SIZE), tal que qi1 < r qi

para una

nueva poblacin.

Tras haber girado la ruleta

POP_SIZE

veces, se habrn seleccionado

POP_SIZE

cro-

mosomas para formar parte de la nueva poblacin.


Se muestra grcamente el proceso de seleccin de cromosomas con el mtodo
de la ruleta en la gura 2.4.

Figura 2.4:

Mtodo de la Ruleta

2.4. Algoritmo gentico implementado

42

Paso 4.3. Aplicacin del operador de Cruce en un solo punto


La probabilidad de cruce vendr determinada por el valor de probabilidad

[0, 1],

pc

siendo ste un parmetro congurable por el usuario que ejecuta el AG.

Teniendo en cuenta este parmetro

pc, el operador de cruce en un solo punto se

ha implementado de la siguiente forma:

1.

En primer lugar se seleccionan los individuos de la nueva poblacin de

POP_SIZE

individuos para reproducirse. Para ello para cada individuo se genera un nmero real aleatorio
cromosoma

comprendido en el rango

[0, 1].

Si

r < pc,

entonces el

es seleccionado para reproducirse.

Como el operador de cruce en un solo punto opera con parejas de individuos, si


tras nalizar la seleccin de cromosomas para su reproduccin se observa que
este nmero es impar, se procede a la seleccin de un cromosoma adicional de
forma aleatoria, de forma que el conjunto nal de cromosomas seleccionados
sea un nmero par.

2.

Se realiza la operacin de cruce en un solo punto entre parejas de individuos


seleccionados para reproduccin. El punto de cruce para el intercambio de
informacin entre genes se selecciona, en este caso, de forma aleatoria. Se
puede observar esta operacin grcamente en la gura 2.5.

Tras la seleccin de parejas de cromosomas y cruce en un solo punto, se obtendrn dos nuevos cromosomas hijos que reemplazarn a los cromosomas padre en la
poblacin de individuos.
En el AG implementado, al contener el cromosoma un nmero de variables de
genes determinado por la variable
ro

de variables de la funcin

nGenes, y sta a su vez condicionada por el nme-

que se desea optimizar

(xi , . . . , xn ), el intercambio

de informacin gentica se realiza seleccionando un nmero entero aleatorio comprendido en el intervalo

i)

[0, n 1]

que indicar la posicin del parmetro

xi

(gen

a partir del cual se intercambiar la informacin gentica, codicada como va-

lores enteros que representan valores reales, entre la pareja de cromosomas. Este
funcionamiento puede apreciarse en la gura 2.6.

2. Algoritmo Gentico implementado en SIGENOF

Figura 2.5:

Figura 2.6:

43

Cruce en un solo punto

Cruce en un solo punto en SIGENOF

Paso 4.4. Aplicacin del operador de Mutacin Uniforme


El operador de mutacin se aplica a todos los individuos de la poblacin, aunque
su efecto estar condicionado por el valor de probabilidad

pm [0, 1] que el usuario

2.4. Algoritmo gentico implementado

44

que ejecuta el AG haya establecido para una ejecucin concreta.

xk

Este operador se ha implementado de forma que para cada gen


uno de los

POP_SIZE

comprendido entre

de cada

cromosomas de la poblacin se genera un nmero aleatorio

[0, 1],

de forma que si

r < pm

el cromosoma

xk

La mutacin consiste, en este caso, en el reemplazo del valor

ser mutado.

xk

por un nuevo

valor real aleatorio comprendido dentro del rango de posibles valores denidos para
dicho gen entre

[xmin
, xmax
].
k
k

Paso 4.5. Evaluacin de la nueva poblacin actual


Este paso se realiza sobre la nueva poblacin de individuos tal y como se describi
en el Paso 2.

Paso 4.6. Mecanismos de Elitismo


Puede suceder que el mejor miembro de una poblacin falle en la reproduccin
de descendientes para la siguiente generacin. Por este motivo se ha optado por
la inclusin de una estrategia elitista en el AG de forma que se resuelva esta posible debilidad copiando los mejores individuos de una generacin en la siguiente
generacin, de forma incondicional.
Se ha implementado la estrategia de elitismo de la siguiente forma:

1.

Se busca el mejor cromosoma de la poblacin actual de


y se almacena en la variable

2.

3.

Se compara el valor del


(

mejor_actual )

individuos

mejor_actual.

Se busca el peor cromosoma de la poblacin actual de


se almacena en la variable

POP_SIZE

POP_SIZE

individuos y

peor_actual.

tness

del mejor cromosoma de la poblacin actual

con el mejor cromosoma de las generaciones anteriores (

me-

jor_cromosoma ).
Si el mejor cromosoma de la poblacin actual (

mejor_actual )

es mejor que

el mejor cromosoma de las generaciones anteriores, es decir, tiene un

tness

mayor, se guarda como mejor cromosoma el de la poblacin actual. Es decir,

mejor_cromosoma = mejor_actual.

2. Algoritmo Gentico implementado en SIGENOF

45

En caso contrario, se sustituye el peor cromosoma de la poblacin actual

peor_actual ) por el mejor cromosoma de las generaciones anteriores. Es decir,

peor_actual = mejor_cromosoma.

2.4.5. Paso 5. Terminacin del AG


El AG implementado naliza, de forma normal, su bucle de ejecucin cuando el
contador

generacin

alcanza el valor denido en la variable

MAXGENS

por el usuario

que ejecuta el AG. Otra forma alternativa de nalizar el AG es a travs de la


interaccin del usuario con el Interfaz Grco de forma explcita. Este algoritmo se
ejecuta tantas veces como ERAS han sido denidas por el usuario de la herramienta.
Tras la nalizacin del AG se habrn generado dos chero
nombres

log

de salida con los

./salida_ag_DD.MM.AAAA_HH.MM.SS.txt y ./soluciones_ag_DD.MM.AAAA

_HH.MM.SS.txt

respectivamente, donde

DD, MM

ao de la ejecucin respectivamente, mientras que

AAAA

corresponden al da, mes y

HH, MM

SS

a la hora, minutos y

segundos.
El contenido del primer chero de salida (salida_ag) se organiza en cuatro
secciones precedidas por un encabezamiento:

1.

Encabezamiento que muestra el nombre de la herramienta, SIGENOF, junto


con la fecha y la hora de ejecucin.

2.

Seccin que describe la funcin

que se ha optimizado. En ella se muestra la

descripcin aritmtica de la funcin, as como los valores


para cada variable

3.

xk

[xmin
, xmax
] denidos
k
k

de la funcin.

Seccin que muestra los parmetros introducidos para la ejecucin del AG:
nmero de eras ejecutadas (ERAS), nmero de generaciones para cada una de
las eras (MAXGENS), nmero de individuos de la poblacin (POP_SIZE), probabilidad de cruce (pc) y probabilidad de mutacin (pm).

4.

Seccin de soluciones, en las que se muestran las mejores soluciones encontradas por el AG en cada era.

5.

Seccin resumen del proceso, en la que se detallan los resultados de la ejecucin. Se muestran datos como el tiempo de ejecucin empleado por el AG para

2.4. Algoritmo gentico implementado

46

llegar a las soluciones, as como el valor mximo, medio y desviacin estndar


de las soluciones encontradas en todas las eras de la ejecucin del AG.

El contenido del segundo chero de salida (soluciones_ag) es ms sencillo y se


organiza en una nica seccin precedida, al igual que el chero anterior, por un
encabezamiento:

1.

Encabezamiento que muestra el nombre de la herramienta, SIGENOF, junto


con la fecha y la hora de ejecucin.

2.

Seccin con los mejores valores de la funcin de adaptacin para cada una de
las generaciones de las que consta cada era.

Se incluye en el Apndice D un listado de los dos chero


para una determinada ejecucin.

log obtenidos por SIGENOF

Captulo 3

Interfaz Grco de Usuario de


SIGENOF
3.1. Librera grca utilizada
Para la implementacin del Interfaz Grco de Usuario, GUI en lo sucesivo,

se ha empleado la librera grca GTK+ , la cual se integra perfectamente con el


lenguaje de programacin elegido para la implementacin del AG, el lenguaje C.
Esta librera, bsicamente, proporciona un conjunto de componentes tiles en el
diseo de GUIs que permiten el desarrollo de aplicaciones que podrn ejecutarse
en distintas plataformas software. Los aspectos decisivos que han condicionado la
eleccin de esta librera para la implementacin del GUI han sido:

GTK+ es software libre y parte del proyecto GNU .

Permite el desarrollo de aplicaciones grcas multiplataforma.

Proporciona un abanico amplio de componentes grcos.

Existen editores grcos, como GLADE , que tambin es software libre, que
facilitan la labor de diseo del GUI.

1 www.gtk.org
2 www.gnu.org
3 glade.gnome.org

y gladewin32.sourceforge.net (para MS-Windows)


47

3.2. Visin general

48

3.2. Visin general


La herramienta implementada, SIGENOF, dispone de un sencillo, cmodo e
intuitivo GUI, que sirve como

front-end

al AG para proporcionar interactividad con

el usuario que lo ejecuta. Este GUI permite, entre otras funcionalidades, introducir
los parmetros poblacionales bsicos del AG como el nmero de eras en las que se
va a ejecutar el algoritmo, el nmero de generaciones para cada una de estas eras y
el nmero de individuos de que constar la poblacin de cromosomas; parmetros
naturales tales como la probabilidad de cruce entre cromosomas y la probabilidad
de mutacin natural, as como el detalle de la funcin matemtica que el algoritmo
deber optimizar. Esta funcin se podr introducir de forma manual o desde un
chero almacenado con anterioridad por la propia herramienta en formato texto.
Adems se facilitan una serie de controles y visualizaciones que permitirn al usuario
pausar la ejecucin entre eras o cancelar el proceso en una era determinada, as
como observar grcamente cmo las sucesivas generaciones de soluciones varan. El
GUI tambin mostrar resultados de la ejecucin en trminos de tiempo empleado,
soluciones encontradas en cada una de las eras y valor mximo, medio y desviacin
estndar de las soluciones. Por ltimo, para que el usuario que ejecuta la herramienta
tenga una visn estimada del tiempo restante de ejecucin del AG, se visualiza en
la parte inferior del GUI una barra de progreso que avanza conforme la ejecucin
del algoritmo tambin lo hace.

3.3. Funcionalidades del GUI


Para describir todas las funcionalidades que proporciona el GUI, se ha optado
por clasicar en paneles las diferentes partes que ste aporta tal y como se puede
observar en la gura 3.1.
En total se identican los ocho paneles siguientes:

1.

Panel de parmetros poblacionales.

2.

Panel de parmetros naturales.

3.

Panel de otros parmetros de aplicacin para el funcionamiento del AG.

4.

Panel de visualizacin textual de las mejores soluciones entre eras.

3. Interfaz Grco de Usuario de SIGENOF

Figura 3.1:

5.

49

GUI de SIGENOF

Panel para denir, guardar o recuperar la funcin

a optimizar por la herra-

mienta.

6.

Panel de visualizacin grca de las mejores soluciones para la funcin de


adaptacin en cada generacin para cada era.

7.

Panel estadstico y de tiempo de ejecucin.

8.

Panel de control y visualizacin del avance del proceso.

A continuacin se detallarn las funcionalidades aportadas por cada uno de los ocho
paneles anteriormente enumerados.

3.3. Funcionalidades del GUI

50

3.3.1. Panel 1: Parmetros Poblacionales


Este panel permite introducir tres parmetros que afectan a la poblacin con la
que el AG trabajar. En concreto el nmero de Eras que correr el algoritmo, el
nmero de Generaciones que cada era contendr, y el nmero de individuos de la
poblacin.
Se proporciona un botn

Ayuda

al usuario que informa del signicado de estos

parmetros.
Se realiza una comprobacin de que los valores introducidos son los correctos,
es decir que son nmeros positivos mayores que cero dentro del rango de posibles
valores permitidos para cada uno de los parmetros:

Nmero de Eras

[1, 999]

Nmero de Generaciones

Nmero de Individuos

[1, 99999]

[1, 999999]

3.3.2. Panel 2: Parmetros Naturales


Permite la especicacin de dos parmetros que afectan al proceso de seleccin de cromosomas, reproduccin y mutacin gentica. Estos parmetros son la
Probabilidad de Cruce y la Probabilidad de Mutacin.
Se proporciona un botn

Ayuda

al usuario que informa del signicado de estos

parmetros.
De la misma manera que en el panel anterior, se realiza una comprobacin de
que los valores introducidos son los correctos, es decir que son nmeros positivos
mayores que cero dentro del rango de posibles valores permitidos para cada uno de
los parmetros:

Probabilidad de Cruce

[0.001, 0.999]

Probabilidad de Mutacin

[0.00001, 0.99999]

3.3.3. Panel 3: Otros Parmetros del AG


En este panel se pueden introducir tres parmetros adicionales que condicionarn
el comportamiento del AG de diferentes formas. Estos parmetros son: el nmero

3. Interfaz Grco de Usuario de SIGENOF

51

de cifras decimales con las que el AG trabajar internamente para la representacin


de las soluciones, un criterio adicional de terminacin (criterio psilon) y la opcin
de seleccin del mecanismo de elitismo.

Cifras decimales de precisin del AG: Nmero de cifras decimales con las que
el AG trabajar para representar las soluciones.

Criterio adicional de terminacin (psilon): Se dene un umbral


cual el AG nalizar cuando la diferencia entre el valor

k+1 )

y el de la generacin ( ) sea menor o igual a dicho

a partir del

de la generacin

aunque no se

haya alcanzado el nmero mximo de generaciones indicado, es decir cuando

| Jk+1 Jk | .

Cuando no se desee aplicar dicho criterio adicional de

terminacin, este parmetro se deber dejar sin contenido.

Elitismo: Esta opcin se marcar si se desea aplicar en el AG el mecanismo


de elitismo. En caso contrario se deber dejar sin marcar.

Se proporciona un botn

Ayuda

al usuario que informa del signicado de estos

parmetros.
De la misma manera que en los paneles anteriores, se realiza una comprobacin
de que los valores introducidos son los correctos, es decir que son nmeros positivos
mayores que cero dentro del rango de posibles valores permitidos para cada uno de
los parmetros:

Cifras decimales de precisin del AG

Epsilon

[1, 6]

[0, 000001, 99999999]

3.3.4. Panel 4: Ventana de Resultados


Este panel muestra, para cada una de las eras, la mejor solucin encontrada. La
informacin que se visualiza es la siguiente:

Informacin del nmero de era.

Valor mximo obtenido para la funcin


maximizan.

J,

junto con los valores

xk

que la

3.3. Funcionalidades del GUI

52

Si se ha establecido un valor

como criterio de terminacin adicional, se

muestra la informacin de la generacin en la que se ha alcanzado dicho umbral


para cada una de las eras.

Si el proceso ha sido cancelado por el usuario antes de la nalizacin del AG,


se muestra dicha informacin en este panel.

A continuacin se muestra la salida del AG en la ventana de resultados para una


ejecucin determinada:

ERA 1: MEJOR SOLUCION (11,180 5,627) = 35,739 :: (epsilon en generacion 4)


ERA 2: MEJOR SOLUCION (9,598 4,609) = 35,067 :: (epsilon en generacion 4)
ERA 3: MEJOR SOLUCION (10,633 5,609) = 37,575 :: (epsilon en generacion 7)
ERA 4: MEJOR SOLUCION (11,572 5,641) = 36,126 :: (epsilon en generacion 6)
*** Proceso cancelado por el usuario ***

3.3.5. Panel 5: Funcin J a Optimizar


Es en este panel donde se deber expresar aritmticamente la funcin que el
AG deber maximizar, mediante una sintaxis previamente denida y que se puede
consultar a travs del botn

Pregunta

. Este panel se divide, a su vez, en tres

subpaneles:

Subpanel 5.1: Barra de herramientas


Muestra tres botones,

Botn

Abrir

Abrir Guardar Pregunta


,

. Recupera desde un archivo una funcin previamente almacena-

da por la herramienta. Este botn despliega un dilogo que permite navegar


a travs del sistema de cheros local o remoto para localizar de forma sencilla
el chero buscado. El dilogo de seleccin de chero permite, incluso, aadir
accesos a carpetas

favoritas

para localizar posteriores cheros en esa ruta con

rapidez.

Botn

Guardar

. Permite guardar a disco la denicin de una funcin denida

en la herramienta, as como los valores


variable

xk

[xmin
, xmax
]
k
k

establecidos para cada

de la funcin. El dilogo que se muestra para denir el nombre

del chero que se desea almacenar, as como su ubicacin que puede ser local

3. Interfaz Grco de Usuario de SIGENOF


o remota, permite aadir tambin carpetas
como lo realiza el dilogo

Abrir

53

favoritas

. Estas ubicaciones

de la misma manera a

favoritas

son compartidas

entre ambos dilogos.

Botn

Pregunta

. Muestra una ventana con los operadores disponibles en la

suma, resta, producto...),

denicin de la funcin a optimizar (

sin, cos, ...)

las funciones

e, pi, nmeros enteros, ...),

y constantes que se pueden usar (

la forma de escribir las diferentes variables

xk

que componen la funcin (x[0],

..., x[n]), as como las reglas de precedencia que regirn la interpretacin de


la funcin.

El nombre y extensin de los cheros que almacenan las funciones que la herramienta
guarda y recupera se deja a eleccin del usuario, aunque su formato interno debe
ajustarse al denido por la herramienta segn el siguiente esquema:

Lnea de denicin sintctica de la funcin: #FUN: , ajustada a la sintaxis


denida en la seccin 2.3.

Lnea del valor mnimo que puede tomar el parmetro


#X0_MIN: , y as sucesivamente hasta el parmetro

x1

de la funcin:

x1

de la funcin:

x10 .

Lnea del valor mximo que puede tomar el parmetro


#X0_MAX: , y as sucesivamente hasta el parmetro

x10 .

Cuando en la denicin de la funcin nicamente se requieren

x,

de forma que

n 10,

no es necesario

declarar

parmetros

las diez variables #X _MIN

y #X _MAX, aunque s es aconsejable hacerlo con valores cero para denir,


de manera explcita, que estas variables no tienen contenido y que no son
necesarias en la funcin denida en la lnea #FUN:. Este es el criterio seguido
por SIGENOF.

El orden de estas lneas es irrelevante, aunque para facilitar la lectura y edicin


de estos cheros la herramienta los almacena en el mismo orden en el que aqu
se han descrito.

El contenido ntegro del chero se almacena en formato ASCII, de manera


que puede ser editado externamente desde cualquier editor de textos.

3.3. Funcionalidades del GUI

54

Un ejemplo del contenido de un chero de este tipo es el siguiente:

#FUN:21.5 + x[0] * sin(4 * pi * x[0]) + x[1] * sin(4 * pi * x[1])


#X0_MIN:-3,00
#X0_MAX:12,10
#X1_MIN: 4,10
#X1_MAX: 5,80
#X2_MIN: 0,00
#X2_MAX: 0,00
#X3_MIN: 0,00
#X3_MAX: 0,00
#X4_MIN: 0,00
#X4_MAX: 0,00
#X5_MIN: 0,00
#X5_MAX: 0,00
#X6_MIN: 0,00
#X6_MAX: 0,00
#X7_MIN: 0,00
#X7_MAX: 0,00
#X8_MIN: 0,00
#X8_MAX: 0,00
#X9_MIN: 0,00
#X9_MAX: 0,00

Subpanel 5.2: rea de denicin de la funcin


Se compone de un rea de texto en el que se puede escribir la expresin que
denir la funcin a optimizar, o donde se mostrar la funcin tras recuperarla
desde un archivo.

Subpanel 5.3: rea de denicin de las variables xk

Variable de la Funcin
Valor Mn. Valor Mx.

Permitir, a travs de la lista desplegable


de los campos

diferentes variables

xk

hasta diez variables

xk .

, as como

, denir el rango de valores que las

(x[k]) podrn tomar. Se permite especicar los valores de

3. Interfaz Grco de Usuario de SIGENOF

55

3.3.6. Panel 6: Grco de Soluciones generacionales


Las diferentes soluciones encontradas para la funcin

en cada una de las sucesi-

vas generaciones de una era particular, son visualizadas grcamente en este panel.
En el eje horizontal del grco se muestran las generaciones, mientras que en el
eje vertical se muestran las mejores soluciones obtenidas para cada generacin. Los
datos se muestran, por defecto, como barras. Esta visualizacin puede cambiarse de
forma que las soluciones se muestren como puntos seleccionando al pie del grco
el botn de radio

Grfico de Puntos

. Para volver de nuevo a la visualizacin de

barras se puede seleccionar el botn de radio

Grfico de Barras

Como este grco muestra las mejores soluciones obtenidas para la funcin de
adaptacin en cada generacin de una cierta era, cuando el AG cambia de era el grco tambin cambia los valores mostrados. Debido a que estos cambios, en muchas
ocasiones, se realizarn rpidamente, el usuario dispone de la posibilidad de realizar
pausas entre eras para que, de este modo, se pueda observar con detenimiento el
grco de mejores soluciones antes del cambio de era, accin que se realiza pulsando
el botn

Continuar

3.3.7. Panel 7: Datos estadsticos y Tiempo de ejecucin


En este panel se muestra el tiempo de ejecucin consumido por el AG en formato
MM:SS, donde MM y SS representan los minutos y segundos respectivamente, junto
con algunos datos estadsticos del resultado de la ejecucin entre las sucesivas eras.
En concreto se muestra el Mximo Valor encontrado para

J,

su Media Aritmtica

y, al nalizar el algoritmo, la Desviacin Estndar entre soluciones.

3.3.8. Panel 8: Progreso y Control del proceso


Este ltimo panel proporciona una barra de progreso que muestra de forma
visual el tiempo de ejecucin del proceso, junto con tres botones adicionales, de los
cuales dos de ellos permiten el control del proceso. Estos botones son:

Botn

Empezar

. Valida los datos introducidos en el GUI y, en caso de estar

completos y correctos, empieza la ejecucin del AG.

3.4. Ejemplo de uso del GUI

56

Figura 3.2:

Botn

Cancelar

Funcin de ejemplo

. Permite terminar el AG tras nalizar la ejecucin de la era

en curso.

Botn

Acerca De

. Proporciona informacin de la herramienta y del autor.

3.4. Ejemplo de uso del GUI


A continuacin se va a describir el uso del GUI siguiendo un caso prctico. Para
ello se ha denido la funcin de ejemplo

f (x1 , x2 )

en el espacio

tal y como se

muestra seguidamente.

f (x1 , x2 ) =

2 2
2)
2x1 +x
2

sin(

x1 +x2

S = {x1 [12, 12.01], x2 [12, 12.01]}


Se presenta grcamente la funcin

f (x1 , x2 )

en

propuesta como ejemplo en

la gura 3.2.
En dicha representacin grca se puede observar que el mximo de esta funcin
para el espacio

denido se encuentra en el punto

(0, 0)

con un valor mximo para

3. Interfaz Grco de Usuario de SIGENOF


f (x1 , x2 ) = 1.

57

Comprobaremos al nalizar el ejemplo cmo SIGENOF se aproxima

a la solucin alrededor de dicho punto.


Se va a describir la realizacin del caso prctico en diferentes pasos, los cuales
se enumeran como:

Paso 1. Iniciar SIGENOF

Paso 2. Denir la funcin

a optimizar

Paso 3. Establecer el espacio

Paso 4. Grabar la funcin

S
y su espacio

denido

Paso 5. Establecer los parmetros poblacionales

Paso 6. Establecer los parmetros naturales del AG

Paso 7. Establecer otros parmetros del AG

Paso 8. Seleccionar el tipo de visualizacin grca

Paso 9. Comenzar con la ejecucin

Paso 10. Evaluacin de las soluciones obtenidas

Es importante destacar que los pasos 1 a 8 se pueden realizar en cualquier orden


sin afectar al resultado nal del proceso.
A continuacin se describen de forma detallada las acciones a realizar para completar cada uno de los pasos anteriormente enumerados.

3.4.1. Paso 1. Iniciar SIGENOF


Se procede a ejecutar el archivo binario
el archivo binario ser

sigenof . En plataformas MS-Windows

sigenof.exe .

La apariencia del GUI ser como la mostrada en la gura 3.3. Los parmetros del
AG mostrarn los valores por defecto que se pueden observar en la gura, mientras
que la funcin a optimizar se encontrar en este paso sin contenido alguno a la espera
de que el usuario que ejecuta la herramienta decida qu funcin desea optimizar,
as como qu parmetros desea establecer para la ejecucin del AG.

3.4. Ejemplo de uso del GUI

58

Figura 3.3:

Inicio de SIGENOF

3.4.2. Paso 2. Denir la funcin J a optimizar


La funcin

propuesta anteriormente para seguir este ejemplo fue:

f (x1 , x2 ) =

Esta funcin

mizar 

2 2
2)
2x1 +x
2

sin(

x1 +x2

se escribir en el rea de texto del rea 

Funcin J a opti-

del GUI de SIGENOF, segn la sintaxis descrita en el cuadro 2.3, con la

siguiente expresin:

sin( sqrt( x[0]^2 + x[1]^2 ) ) / sqrt( x[0]^2 + x[1]^2 )

Se puede observar esta accin en la gura 3.4.

3. Interfaz Grco de Usuario de SIGENOF

59

3.4.3. Paso 3. Establecer el espacio S


El espacio

para la funcin

f (x1 , x2 )

se dene como:

S = {x1 [12, 12.01], x2 [12, 12.01]}

Este espacio de posibles valores para las variables de incertidumbre de la funcin

que se desea optimizar se denir en el rea 

Variable de la Funcin .

En este rea existen tres elementos para la denicin de los distintos valores que
componen el espacio

para cada uno de las variables

xk

de la funcin:

Lista desplegable para establecer las distintas variables xk .


lista se permite denir valores para hasta diez variables

xk

A travs de esta
(desde

x[0]

hasta

x[9]).

Valor Mnimo de S para cada xk . Para cada x[k] se indicar el valor mnimo
que la variable puede tomar.

Valor Mximo de S para cada xk . Para cada x[k] se indicar el valor mximo
que la variable puede tomar.

En nuestro caso se denirn los siguientes valores para las variable

x1

funcin:

Variable

x1

Variable

Valor Mn: -12,00

Valor Mx: 12,01

Variable

x[0]

en la lista desplegable.

x2

Variable

Valor Mn: -12,00

Valor Mx: 12,01

x[1]

en la lista desplegable.

Se puede observar el procedimiento de denicin de

en la gura 3.4.

x2

de la

3.4. Ejemplo de uso del GUI

60

Figura 3.4:

Denicin de la funcin J y del espacio S

3.4.4. Paso 4. Grabar la funcin J y su espacio S denido.


Llegados a este punto, la funcin

y su espacio

se encuentran completamente

denidos. En este momento es conveniente guardar dichas deniciones en un chero para poder recuperarlas en cualquier otro momento y poder utilizarlas con la

Guardar  situado en la barra de herramientas superior del rea  Funcin J a optimizar, tal y como se muestra en
herramienta. Para ello pulsaremos el icono 

la gura 3.5.
En el dilogo para guardar la funcin, que aparece en la parte central del GUI
de la gura como dilogo 

Guardar Funcin , se deber introducir el nombre del

chero que almacenar los datos introducidos en pantalla, as como su ubicacin


en el sistema de archivos, que puede ser local o remoto. Para buscar carpetas en
ubicaciones remotas o en distintos lugares del sistema de archivos local, se podr

3. Interfaz Grco de Usuario de SIGENOF

Figura 3.5:

desplegar la opcin 

61

Grabacin de la funcin J y espacio S

Buscar otras carpetas  de este dilogo para ampliar, de esta

forma, su funcionalidad. Este dilogo extendido es el que se muestra en la gura


3.5.
Mediante el botn 
denir 

+ Aadir

rutas favoritas ,

 del dilogo 

Guardar Funcin ,

se pueden

es decir rutas a las que se acceden con frecuencia en ope-

raciones de guardado o recuperacin de funciones.


Una funcin guardada se podr recuperar en cualquier momento pulsando el

Abrir  de la barra de herramientas y seleccionando su ubicacin de manera


similar a como se ha realizado con el dilogo  Guardar Funcin .
icono 

3.4.5. Paso 5. Establecer los parmetros poblacionales


Para este ejemplo se denieron los siguientes parmetros:

3.4. Ejemplo de uso del GUI

62

Figura 3.6:

Parmetros poblacionales

Nmero de Eras : Se establecieron tres eras.


Nmero de Generaciones: Para el ejemplo se establecieron doscientas generaciones para cada una de las tres eras denidas en el parmetro anterior.

Nmero de Individuos: Se denieron cien individuos para la poblacin del


ejemplo.

Se puede observar la introduccin de estos parmetros en la gura 3.6.

3.4.6. Paso 6. Establecer los parmetros naturales del AG


En el ejemplo se denieron estos parmetros como:

Probabilidad de cruce: Se estableci una probabilidad de cruce entre parejas de individuos equivalente a un 70 %, es decir con un valor de 0,7.

Probabilidad de mutacin:

Se deni para la ejecucin una probabilidad

de mutacin gentica para cada individuo equivalente a un 0,5 %, es decir con


un valor de 0,005.

Se pueden observar estos parmetros en la gura 3.7.

Figura 3.7:

Parmetros naturales

3. Interfaz Grco de Usuario de SIGENOF

Figura 3.8:

63

Otros parmetros

3.4.7. Paso 7. Establecer otros parmetros del AG


Otros parmetros que se denieron para esta ejecucin fueron:

Cifras decimales de precisin del AG : Se opt por dejar el valor de este


parmetro al que por defecto la herramienta propone, tres decimales.

Criterio de terminacin adicional (epsilon): Para este ejemplo se decidi no aplicar el criterio de terminacin adicional

epsilon,

as que se dej sin

contenido el campo.

Utilizar ELITISMO en el AG : En este caso s se deseaba aplicar el mecanismo de elitismo y, por tanto, se marc dicha casilla.

Los parmetros introducidos en este caso se pueden observar en la gura 3.8.

3.4.8. Paso 8. Seleccionar el tipo de visualizacin grca


Se seleccion como tipo de grco 

Grco de Barras .

Esta seleccin se

realiza pulsando el botn de radio que aparece al pie del espacio reservado para la
visualizacin grca, tal y como se puede observar en la gura 3.9.
Para observar con detenimiento la grca de las mejores soluciones encontradas
por la herramienta, se decidi marcar la casilla 

Pausa entre Eras ,

de forma

que al nalizar una era su ejecucin, quede sta suspendida hasta que el usuario
pulse el botn 

Continuar

, momento en el cual comenzar la siguiente era, y as

sucesivamente hasta la nalizacin del proceso.

3.4. Ejemplo de uso del GUI

64

Figura 3.9:

Tipo de visualizacin grca

3.4.9. Paso 9. Comenzar con la ejecucin


En este ltimo paso nicamente resta pulsar el botn 

Empezar

 para que SI-

GENOF comience su ejecucin y obtenga las soluciones para el problema propuesto.

3.4.10. Paso 10. Evaluacin de las soluciones obtenidas


Tras nalizar la ejecucin de todas las eras, el AG implementado en SIGENOF
obtuvo las soluciones que se observan en la gura 3.10, as como los valores estadsticos de la gura 3.11.

Figura 3.10:

Soluciones obtenidas por SIGENOF para el ejemplo propuesto

Figura 3.11:

Resultados estadsticos para el ejemplo propuesto

3. Interfaz Grco de Usuario de SIGENOF

Figura 3.12:

65

Mximo para el ejemplo propuesto

Se observa que la herramienta encontr en las tres eras similares soluciones en


las cercanas de (0, 0), con un valor mximo para

J = 1, 0.

Si ahora examinamos de nuevo la forma grca de la funcin

denida para este

ejemplo, observaremos claramente cmo el valor mximo efectivamente se encuentra


en el punto (0, 0) con una cota de 1 para el espacio

denido en nuestro ejemplo.

Se muestra este mximo en la gura 3.12.


Esta solucin, a la que podramos haber llegado fcilmente mediante tcnicas
analticas convencionales, se ha alcanzado satisfactoriamente mediante una implementacin de AG. En este caso la solucin obtenida tiene una precisin muy alta
con respecto a la solucin real.

66

3.4. Ejemplo de uso del GUI

Captulo 4

Ejemplos de aplicacin de
SIGENOF
Se detallan a continuacin algunos casos particulares que describen diversas funciones matemticas con las que se ha vericado el buen funcionamiento del algoritmo
gentico implementado.
En la ejecucin de todos los casos particulares que se describen, se han empleado
los parmetros que se muestran en el cuadro 4.1:

Parmetro

Nmero de Eras
Nmero de Generaciones
Tamao de la Poblacin
Nmero de decimales de precisin
Criterio de terminacin epsilon
Uso de mecanismo de Elitismo
Probabilidad de Cruce
Probabilidad de Mutacin
Cuadro 4.1:

Valor establecido
5
100
100
3
NO
S
80 % (0,8)
0,5 % (0,005)

Parmetros del AG utilizados en los ejemplos

4.1. Caso particular 1


La funcin objetivo a optimizar se describe como:
67

4.2. Caso particular 2

68

Figura 4.1:

Caso Particular 1

f (x1 , x2 ) = 21.5 + x1 sin(4x1 ) + x2 sin(4x2 )


S = {x1 [3.0, 12.1], x2 [4.1, 5.8]}
Se representa la funcin

f (x1 , x2 )

en

en la gura 4.1.

En ella se puede observar que el valor mximo para la funcin se encuentra


entorno al punto

x1 = 12

x2 = 5.6,

con un valor para

prximo a

39.

SIGENOF obtuvo como mejores soluciones las cercanas al punto

x2 = 5.629,

con un valor para

de

x1 = 11.6

38.682.

4.2. Caso particular 2


La funcin objetivo a optimizar se describe como:

f (x1 , x2 , x3 , x4 , x5 , x6 ) = 100 (x21 + x22 + x23 + x24 + x25 + x26 )

x1 [3.0, 5.1], x2 [2.1, 7.8], x3 [10.1, 20.3],

S=

x4 [3.3, 4.2], x5 [15.3, 70.1], x6 [0.25, 0.35]

4. Ejemplos de aplicacin de SIGENOF

69

Fcilmente se puede comprobar que el mximo de esta funcin se encuentra en


el punto

xi = 0,

con

1 i 6,

con una cota para

de

100.

Para este caso particular, la probabilidad de mutacin se vari hasta un valor


de

2,5 % (0,025)

para que el algoritmo pudiera converger a la solucin con mayor

precisin. De esta forma SIGENOF coincidi con la solucin real obteniendo puntos
prximos a cero

(xi = 0),

con un valor para

de

100.

4.3. Caso particular 3. Funcin de Ackley


La funcin objetivo a optimizar se describe como:


f (x1 , x2 ) = c1 e
c1 = 20

c2

c2 = 0.2

1
2


(x21 +x22 )

c3 = 2

e 2 (cos(c3 x1 )+cos(c3 x2 )) + c1 + e
e = 2.71282

S = {x1 , x2 [5, 5]}


Se representa la funcin de Ackley

f (x1 , x2 )

en

en la gura 4.2.

En ella se puede observar que existen cuatro mximos para la funcin. Los puntos
que hacen mxima la funcin con un valor cercano a

14.30,

se encuentran entorno

a los cuatro siguientes puntos:

Solucin 1:

x1 = 4.60

Solucin 2:

x1 = 4.60

x2 = 4.60

Solucin 3:

x1 = 4.60

Solucin 4:

x1 = 4.60

x2 = 4.60

x2 = 4.60

x2 = 4.60

SIGENOF obtuvo como mejores soluciones las cercanas a los cuatro mismos puntos
anteriormente enumerados tras la observacin de la grca, todos ellos con valores
para

prximos a

14.300.

Solucin 1:

x1 = 4.599

x2 = 4.633

con

f = 14.297.

Solucin 2:

x1 = 4.608

x2 = 4.572

con

f = 14.300.

Solucin 3:

x1 = 4.640

Solucin 4:

x1 = 4.638

x2 = 4.596

x2 = 4.656
con

con

f = 14.274.

f = 14.296.

4.4. Caso particular 4. Funcin de Shaer

70

Figura 4.2:

Caso Particular

4.4. Caso particular 4. Funcin de Shaer


La funcin objetivo a optimizar se describe como:



f (x1 , x2 ) = 100 (x21 + x22 )0.25 [sin2 (50 (x21 + x22 )0.1 ) + 1.0]
S = {x1 , x2 [100, 100]}
Se representa la funcin de Shaer

f (x1 , x2 )

en

en la gura 4.3.

Observando la grca se comprueba que el mximo de esta funcin se encuentra


en el punto

x1 = x2 = 0

con un valor para

de

100.

SIGENOF obtuvo la misma solucin que la observada grcamente, es decir


valores para

x1

x2

cercanos a

con valores para

entorno a

soluciones obtenidas por la herramienta son las siguientes:

x1 = 0.002

x1 = 0.001

x2 = 0.000

x2 = 0.002

con

con

f = 99.944.

f = 99.968.

99.9.

Ejemplos de

4. Ejemplos de aplicacin de SIGENOF

Figura 4.3:

71

Caso Particular 4

4.5. Caso particular 5


La funcin objetivo a optimizar se describe como:



f (x1 , x2 ) = 500 a (x2 b x21 + c x1 d)2 + e (1 f ) cos(x1 ) + e
a=1

b=

5.1
4 2

c=

S = {5 x1 10,
Se representa la funcin

d=6

e = 10

f=

1
8

0 x2 15}
f (x1 , x2 )

en

en las guras 4.4 y 4.5, desde diferentes

puntos de vista.
En estas dos grcas se puede observar que existen diversos puntos que hacen
mxima la funcin. Estos puntos hacen que la funcin tome valores cercanos a

500.

Se pueden identicar stos fcilmente en las grcas, como por ejemplo los

siguientes:

x1 = 3.00

x1 = 3.00

x2 = 1.15

x1 = 3.00

x2 = 0.85

x2 = 11.00

4.5. Caso particular 5

72

Figura 4.4:

Caso Particular 5 (vista 1)

Figura 4.5:

Caso Particular 5 (vista 2)

4. Ejemplos de aplicacin de SIGENOF

Figura 4.6:

73

Caso Particular 6

La herramienta SIGENOF, tras una ejecucin, obtuvo las siguientes soluciones:

x1 = 3.089

x1 = 3.026

x2 = 1.148

con

f = 499.536.

x1 = 2.889

x2 = 1.152

con

f = 499.230.

x1 = 2.975

x2 = 0.832

con

f = 499.273.

x2 = 10.940

con

f = 499.58.

4.6. Caso particular 6


La funcin objetivo a optimizar se describe como:

f (x1 , x2 ) = 0.5

sin2

x21 +x22 0.5


2

(1+0,001(x21 +x22 ))

S = {x1 , x2 [100, 100]}


Se representa la funcin

f (x1 , x2 )

en

en la gura 4.6.

Visualmente se puede comprobar que el mximo de esta funcin se encuentra en


el punto

x1 = x2 = 0,

con un valor para

de

1.0.

4.7. Ejecucin con variantes

74

En este caso SIGENOF tambin coincidi con la solucin real obteniendo puntos
prximos a cero con un valor para

igual o muy cercano a

1.0,

como se puede

observar en las siguientes soluciones obtenidas por la herramienta:

x1 = 0.009

x2 = 0.002

x1 = 0.006

x2 = 0.002

x1 = 0.054

x2 = 0.003

con

con

con

f = 1.000.

f = 1.000.

f = 0.997.

4.7. Ejecucin con variantes


El caso particular 2 expuesto anteriormente representa un ejemplo de maximizacin de una funcin multivariable:

f (x1 , x2 , x3 , x4 , x5 , x6 ) = 100 (x21 + x22 + x23 + x24 + x25 + x26 )

x1 [3.0, 5.1], x2 [2.1, 7.8], x3 [10.1, 20.3],


S=

x4 [3.3, 4.2], x5 [15.3, 70.1], x6 [0.25, 0.35]


Aunque la solucin que la hace mxima se obtiene con facilidad con una simple
observacin de la denicin de la funcin, localizada en el punto
con un valor para

equivalente a

(0, 0, 0, 0, 0, 0),

100, en SIGENOF se necesit realizar una ligera

variacin de los parmetros que se aplicaban al resto de los casos particulares para
que alcanzara de forma eciente la solucin deseada. Por ello, tal y como se expuso
anteriormente, en este caso particular la probabilidad de mutacin se vari desde
un valor de hasta un valor

0,5 % (0,005)

hasta un valor de

2,5 % (0,025).

Esto no

quiere decir que la herramienta no fuera capaz de encontrar el mximo para este
caso particular con los parmetros establecidos por defecto en el cuadro 4.1, ya que
en la mayora de las ejecuciones siempre haba eras en las que se localizaba ste
con bastante precisin, aunque en algunas otras eras no se acercaba lo suciente a
la solucin real. Lo que ocurra era que las variaciones entre sucesivas generaciones
eran extremadamente grandes, obteniendo divergencias tales como valores para

4791.560

as como para

f = 97.900,

f=

es decir valores con una desviacin estndar

enorme, a pesar de que la desviacin estndar entre sucesivas eras para una ejecucin
determinada no resultaban ser tan marcadas.

4. Ejemplos de aplicacin de SIGENOF

75

Debido a estas observaciones se realiz en primer lugar una ejecucin con los
parmetros denidos en el cuadro 4.1 para posteriormente realizar variaciones en
algunos de los parmetros de ejecucin del AG, y de esta forma observar cmo se
comportaba SIGENOF para este caso particular. Se detalla a continuacin el caso
inicial y siete variaciones realizadas a ste, as como los resultados obtenidos para
cada una ellas en la primera era.

4.7.1. Sin variacin de parmetros (Ejecucin 1)


En este caso se obtuvo en la primera era un valor mximo para

-1.313 0.005 0.612 -0.002 0.007 0.037).

punto (

f = 97.900 en el

Los parmetros empleados en esta

ejecucin fueron los denidos en el cuadro 4.1, es decir:

No de Generaciones: 100
No de Individuos de la Poblacin: 100
Probabilidad de Cruce: 0,8
Probabilidad de Mutacin: 0,005
Elitismo: S
Se puede observar la divergencia entre las distintas soluciones obtenidas por SIGENOF para la primera era en la gura 4.7. En este y en todos los siguientes grcos,
el eje horizontal representa las

vertical representa los valores de

generaciones de la ejecucin, mientras que el eje

de cada mejor solucin en cada generacin.

4.7.2. Variacin de la probabilidad de mutacin (Ejecucin


2)
Se vari nicamente en este caso la probabilidad de mutacin a un valor de

0,015. De esta manera la ejecucin se realiz con los siguientes parmetros:


No de Generaciones: 100
No de Individuos de la Poblacin: 100
Probabilidad de Cruce: 0,8

4.7. Ejecucin con variantes

76

Figura 4.7:

Caso inicial - Generacin 1

Probabilidad de Mutacin: 0,015

Elitismo: S

El resultado obtenido por SIGENOF en la primera era tras esta variacin fue

100

en el punto

f =

(0.004 0.003 0.003 -0.001 0.000 0.000).

Se puede observar en la gura 4.8 cmo las soluciones obtenidas por SIGENOF
para la primera era ya no divergan tanto como ocurra en el caso inicial, a pesar
de que haba unas pocas soluciones con valores negativos para

muy alejados,

la mayora de las soluciones se encontraban en una regin cercana a la solucin


real. Por tanto se puede armar que una probabilidad de mutacin ms elevada
produca, para este problema, una mejora en el rendimiento del AG ya que esta
mayor probabilidad permita realizar cambios en un nmero mayor de soluciones
que en el caso inicial, dando lugar a que algunas de las que se encontraban alejadas
de la solucin real tuvieran una mayor probabilidad de ser mutadas, y con ms
posibilidades de convertirse en soluciones adaptadas al problema.

4. Ejemplos de aplicacin de SIGENOF

Figura 4.8:

77

Variacin probabilidad de mutacin

4.7.3. Variacin de las probabilidades de cruce y mutacin


(Ejecucin 3)
Se variaron en este caso las probabilidades de cruce y de mutacin a valores
de

0,2

hasta un

0,015
20 %,

respectivamente, es decir se disminuy la probabilidad de cruce


y la probabilidad de mutacin se estableci, al igual que en el caso

anterior, a un valor de

1,5 %. De esta manera la ejecucin se realiz con los siguientes

parmetros:

No de Generaciones: 100
No de Individuos de la Poblacin: 100

Probabilidad de Cruce: 0,2


Probabilidad de Mutacin: 0,015
Elitismo: S
El resultado obtenido por SIGENOF en la primera era tras esta variacin fue similar
al obtenido en la ejecucin anterior,

0.000 0.000).

f = 100 en el punto (0.000 0.003 -0.001 -0.001

4.7. Ejecucin con variantes

78

Figura 4.9:

Variacin probabilidades de cruce y mutacin

Se puede observar en la gura 4.9 cmo las soluciones obtenidas por SIGENOF
para la primera era tampoco divirgieron tanto como ocurri en el caso inicial, a pesar
de que todava existan soluciones con valores para

muy alejados, la mayora de las

soluciones se encontraban en una regin mucho ms cercana a la solucin real que


en la ejecucin anterior. A la vista del grco, se deduce que aunque la probabilidad
de mutacin en este caso era acertada, la probabilidad de cruce ms adecuada para
obtener una convergencia rpida de las soluciones era la anterior, es decir valores
prximos a un

80 %,

ya que esta probabilidad fomentaba el cruce entre distintas

soluciones que pudieran estar muy alejadas de la solucin real y que podan dar
lugar a soluciones ms adaptadas al problema.

4.7.4. Variacin del tamao de la poblacin a un valor pequeo (Ejecucin 4)


La nica variacin que se realiz en este caso fue la del tamao de la poblacin,
varindose desde un valor inicial establecido en
pequea de

25

100

individuos a una poblacin

individuos. El resto de los parmetros se mantuvieron tal y como se

denieron inicialmente en el cuadro 4.1, es decir:

4. Ejemplos de aplicacin de SIGENOF

Figura 4.10:

79

Variacin a un tamao de la poblacin pequeo

No de Generaciones: 100

No de Individuos de la Poblacin: 25
Probabilidad de Cruce: 0,8
Probabilidad de Mutacin: 0,005
Elitismo: S
El resultado obtenido por SIGENOF en la primera era tras esta variacin fue

85.779

en el punto

f =

(1.255 0.003 0.017 3.556 0.020 0.000).

Se puede observar en la gura 4.10 cmo en este caso la mayora de las soluciones obtenidas por SIGENOF para la primera era se encontraban alejadas de la
solucin real. A pesar de ello algunas pocas soluciones consiguieron alcanzar un
valor aceptable para el problema, en este caso un valor para

f = 85.779,

aunque

en diversas ejecuciones los resultados obtenidos no fueron tan buenos, es decir tan
cercanos a la solucin real. Se deduce, por tanto, en este caso que el tamao de la
poblacin era demasiado pequeo para que el AG consiguiera soluciones adaptadas
a este problema concreto.

4.7. Ejecucin con variantes

80

4.7.5. Variacin del no de generaciones a un tamao pequeo


(Ejecucin 5)
En este caso se vari nicamente el nmero de generaciones para cada era establecindose un valor de pequeo para este parmetro,

25

generaciones. El resto

de los valores se dejaron como inicialmente se establecieron. De esta manera la


ejecucin se realiz con los siguientes parmetros:

No de Generaciones: 25
No de Individuos de la Poblacin: 100
Probabilidad de Cruce: 0,8
Probabilidad de Mutacin: 0,005
Elitismo: S
El resultado obtenido por SIGENOF en la primera era tras esta variacin no fue
muy alto con un valor de

f = 71.935

en el punto

(-1.775 4.639 0.832 -1.608 0.037

0.339).
Se puede observar en la gura 4.11 cmo la mayora de las soluciones obtenidas
por SIGENOF en la primera era se alejaron bastante de la solucin real, encontrndose tan slo unas pocas que ligeramente se adaptaban al problema. Esto fue
debido a que el nmero de generaciones era muy pequeo y, por tanto, si las soluciones generadas inicialmente aleatoriamente no eran buenas el AG no tena la
posibilidad de mejorarlas en un nmero tan reducido de generaciones, es decir en
sucesivas etapas de

seleccin-cruce-reproduccin-mutacin.

4.7.6. Variacin del no de generaciones a un tamao grande


(Ejecucin 6)
En este caso se vari nmero de generaciones para cada era establecindose
un valor grande para este parmetro,

400

generaciones. El resto de los valores se

dejaron como inicialmente se establecieron. De esta manera la ejecucin se realiz


con los siguientes parmetros:

No de Generaciones: 400

4. Ejemplos de aplicacin de SIGENOF

Figura 4.11:

81

Variacin a un no de generaciones pequeo

No de Individuos de la Poblacin: 100


Probabilidad de Cruce: 0,8
Probabilidad de Mutacin: 0,005
Elitismo: S

El resultado obtenido por SIGENOF en la primera era tras esta variacin coincidi
con la solucin real con un valor para

f = 100 en el punto (0.003 0.002 0.001 0.000

0.004 0.000).
Se puede observar en la gura 4.12 cmo la mayora de las soluciones obtenidas por SIGENOF en la primera era se alejaban bastante de la solucin real,
encontrndose tan slo unas pocas que se adaptaban al problema, y an as el
AG fue capaz de encontrar la solucin real. Esto fue debido a que el nmero de
generaciones era bastante grande y, por tanto, como existieron muchas etapas de

seleccin-cruce-reproduccin-mutacin
alcanzar la solucin correcta.

tambin existieron muchas posibilidades de

4.7. Ejecucin con variantes

82

Figura 4.12:

Variacin a un no de generaciones grande

4.7.7. Variacin del tamao de la poblacin a un valor grande


(Ejecucin 7)
En este caso se vari nicamente el nmero de individuos de la poblacin, establecindose un tamao grande para este parmetro,

400

individuos. El resto de los

valores se dejaron como inicialmente se establecieron. De esta manera la ejecucin


se realiz con los siguientes parmetros:

No de Generaciones: 100

No de Individuos de la Poblacin: 400


Probabilidad de Cruce: 0,8
Probabilidad de Mutacin: 0,005
Elitismo: S
El resultado obtenido por SIGENOF en la primera era tras esta variacin se acerc
bastante a la solucin real con un valor para

0.012 1.361 0.030 -0.049).

f = 98.144

en el punto

(0.001 0.002

4. Ejemplos de aplicacin de SIGENOF

Figura 4.13:

83

Variacin a un tamao de la poblacin grande

Se puede observar en la gura 4.13 cmo la mayora de las soluciones obtenidas


por SIGENOF en la primera era se encontraban en un rango de valores ms o menos
cercano a la solucin real, encontrndose tan slo unas pocas que se alejaban mucho
de la solucin al problema. Esto fue debido a que como el nmero de individuos
de que constaba la poblacin era bastante grande, y por tanto exista una gran
variacin gentica, exista ms probabilidad de intercambio de informacin entre los
individuos ms adaptados al problema en las etapas de

seleccin-cruce-reproduccin.

4.7.8. Variacin de la probabilidad de mutacin y del tamao


de la poblacin a un valor grande (Ejecucin 8)
En este caso se variaron dos parmetros, el nmero de individuos de la poblacin,
establecindose de la misma forma que en el caso anterior un tamao grande para
este parmetro con
babilidad de

400

individuos, y la probabilidad de mutacin, con una pro-

1,5 % (0,015 ).

Se eligieron los dos parmetros y valores mencionados

porque en las anteriores variaciones se observ que la herramienta se comportaba


relativamente bien con estos valores. El resto se dejaron como inicialmente fueron
establecidos. De esta manera la ejecucin se realiz con los siguientes parmetros:

4.7. Ejecucin con variantes

84

Figura 4.14:

Variacin tamao poblacin y probabilidad mutacin a valores grandes

No de Generaciones: 400

No de Individuos de la Poblacin: 400


Probabilidad de Cruce: 0,8

Probabilidad de Mutacin: 0,015


Elitismo: S
El resultado obtenido por SIGENOF en la primera era tras esta variacin coincidi
con la solucin real con un valor para

-0.002 -0.002 0.000).

f = 100

en el punto

(-0.002 0.005 0.000

Otras ejecuciones tambin dieron resultados muy similares a

esta primera era.


Se puede observar en la gura 4.14 cmo la mayora de las soluciones obtenidas
por SIGENOF en la primera era se acercaban a la solucin real, empezando con
valores algo ms alejados a sta pero que segn iban avanzando las sucesivas generaciones se acercaban cada vez ms al valor

100. Unas pocas soluciones se alejaron

bastante de la solucin debido probablemente a mutaciones aleatorias. No obstante,


se comprob que el AG converga con facilidad a la solucin con estas variaciones.

Captulo 5

Conclusiones
La herramienta implementada en este proyecto n de carrera, SIGENOF, no
pretende ser en ningn momento una herramienta universal para la optimizacin de
funciones matemticas, sino ms bien una aplicacin prctica de una de las ramas
de la Computacin Evolutiva, los Algoritmos Genticos. A travs de SIGENOF se
ha demostrado cmo un sencillo algoritmo que simula los mecanismos bsicos de
la evolucin biolgica es capaz, en la mayora de los casos, de obtener soluciones
aceptables a un problema de optimizacin dado a travs de una sencilla formulacin
matemtica. Es cierto que en ocasiones, y dependiendo del problema que se est
resolviendo, se debern ajustar algunos parmetros del AG, tales como el tamao de
la poblacin, el nmero de generaciones o las probabilidades de seleccin y mutacin,
pero tras estos pequeos ajustes el AG probablemente ser capaz de encontrar una

buena solucin

al problema a resolver.

Cuando se habla de una

buena solucin

nos referimos a una solucin muy cer-

cana a la solucin real que se busca, es decir es posible que el AG no localice la


solucin exacta al 100 %, sin embargo probablemente s ser capaz de localizarla en
un entorno muy cercano, y en algunos casos incluso se llegar al 100 % de precisin.
Es evidente por tanto que la aplicacin de esta herramienta, y en general la de los
AG, se circunscribe a aquellos problemas en los que una solucin cercana puede ser
tan vlida como la solucin real. Al mismo tiempo estas soluciones, generalmente
muy prximas al mximo global, servirn como magncas soluciones iniciales en
los mtodos tradicionales de optimizacin.
85

86

SIGENOF resuelve problemas de optimizacin basados en funciones matemticas descritas con una sencilla sintaxis denida por la herramienta, donde el espacio
de bsqueda puede ser muy amplio. Aparentemente no es mucho. Sin embargo el
verdadero potencial de la herramienta es su interfaz grco de usuario (GUI), que
permite realizar multitud de pruebas con diferentes funciones matemticas y diferentes parmetros para el AG, de forma que el usuario puede, con un tiempo de
aprendizaje muy pequeo, comprobar cmo se comporta un AG frente a diversas
situaciones. Adems, ya que los AG son una herramienta genrica para la resolucin
de problemas de optimizacin, SIGENOF podra utilizarse para resolver cualquier
problema de optimizacin que pudiera formularse como una funcin matemtica
acotada en un espacio S.
Un aspecto que se podra mejorar en esta herramienta es el relativo al mdulo
que realiza el anlisis lxico y sintctico de la expresin matemtica que se desea
optimizar, es decir de la funcin

J, de forma que este analizador fuera ms robusto y

completo, con posibilidad de ayudar al usuario a detectar errores de parentizacin,


de introduccin de operadores incorrectos, etc.
En lo relativo a futuras ampliaciones que la herramienta podra disponer, destacar las siguientes:

Posibilidad de representar en tiempo real la funcin

a optimizar en su espacio

S.

Distintos tipos de representaciones grcas de las mejores soluciones encontradas en cualquier generacin/era una vez nalizado el proceso haciendo uso
de alguna herramienta externa a la aplicacin.

Posibilidad de introducir restricciones ms complejas a la funcin

J.

Paralelizacin del AG.

Para nalizar, destacar que el contenido ntegro de este Proyecto de Fin de Carrera, es decir la herramienta y la memoria, se publican bajo licencia GNU GPL

www.gnu.org ),

lo que permite la libre copia, modicacin y distribucin de stos

siempre y cuando se realice bajo los trminos de esta misma licencia y no se vulnere
ningn otro derecho o norma.

Apndice A

Gramtica para Funciones J en


SIGENOF
La gramtica que dene la construccin de expresiones aritmticas vlidas para
la denicin de las funciones

a optimizar se describe con la siguientes reglas:

<expr>:= <term><expr_prime>

<expr_prime>:= + <term><expr_prime>
| - <term><expr_prime>
| do nothing

<term>:= <factor><term_prime>

<term_prime>:= ^ <factor><term_prime>
| * <factor><term_prime>
| / <factor><term_prime>
| do nothing

<factor>:= ( <expr>)
| -( <expr>)
87

88

| <value>
| - <value>

<value>:= <functVal>
| <constnt>

<functVal>:= <functName>( <expr>)

<functName>:= sin

| cos

| tan | sqrt

| asin | acos | atan | exp


| ln

| abs

| pi

| log

| hsin | hcos | htan

<constnt>:= integer
| floating point
| exponential number
| variables x[i]

| e

Apndice B

Funcin ran2
En este apndice se muestra el listado fuente de la funcin
texto 

Numerical Recipes in C 

ran2,

extrada del

[Recip88] y ligeramente modicada para incluir los

extremos del rango de valores posibles que la funcin puede devolver. Esta funcin
es usada durante la generacin de nmeros aleatorios para resolver el problema de
la creacin de individuos de la poblacin inicial de forma verdaderamente aleatoria,
como se describe en el paso de Inicializacin del AG, as como para la obtencin de
cualquier nmero aleatorio empleado por el AG, tal y como se realiza en los pasos
de Seleccin, Cruce en un solo punto y Mutacin uniforme.

B.1. Fichero aleatorio.h


/* GENERACIN DE NMEROS ALEATORIOS -------------------------------------------------------------------------------------------------------------------------------------------------------- */
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 0
#define RNMX (1.0-EPS)
89

B.2. Fichero aleatorio.c

90

/*
Prototipos de las funciones que generan nmeros seudoaleatorios
*/
float ran2(long *);
float aleatorio(float, float);

B.2. Fichero aleatorio.c


/* GENERACIN DE NMEROS ALEATORIOS -------------------------------------------------------------------------------------------------------------------------------------------------------- */
#include <stdlib.h>
#include <time.h>
#include "aleatorio.h"
static long idum = -1;
/*
Cdigo extraido del texto "Numerical Recipes in C".
Long period (>2 x 10^18) random number generator of L'Ecuyer with Bays-Durham shuffle
and added safeguards. Returns a uniform random deviate between 0.0 and 1.0.
Call with idum a negative integer to initialize; thereafter, do not alter
idum between successive deviates in a sequence. RNMX should approximate the largest floating
value that is less than 1.
*/
float ran2(long *idum)
{
int j;
long k;
static long idum2 = 123456789;
static long iy = 0;
static long iv[NTAB];
float temp;
if (*idum <= 0)
{

// Initialize.
if ((*idum) <= 0) *idum = time(NULL) % 32000; // use clock: Generacin de semilla
else *idum = -(*idum);
idum2 = (*idum);
for (j = NTAB+7; j >= 0; j--)
{

// Load the shuffle table (after 8 warm-ups).


k=(*idum) / IQ1;
*idum = IA1 * (*idum - k * IQ1) - k * IR1;
if (*idum <0) *idum += IM1;
if (j <NTAB) iv[j] = *idum;

B. Funcin ran2

91

}
iy = iv[0];
}
k = (*idum) / IQ1;

// Start here when not initializing.

*idum = IA1 * (*idum - k*IQ1) - k * IR1;

// Compute idum=(IA1*idum) % IM1 without


// overflows by Schrage's method.

if (*idum <0) *idum += IM1;


k = idum2 / IQ2;
idum2 = IA2 * (idum2 - k * IQ2) - k * IR2; // Compute idum2=(IA2*idum) % IM2 likewise.
if (idum2 <0) idum2 += IM2;
j = iy / NDIV;

// Will be in the range 0..NTAB-1.

iy = iv[j] - idum2;

// Here idum is shuffled, idum and idum2 are


// combined to generate output. iv[j] = *idum;

if (iy <1) iy += IMM1;


if ((temp = AM * iy) >RNMX) return RNMX; // Because users don't expect endpoint values.
else return temp;
}
/*
Generacin de nmeros seudoaleatorios entre min y max
*/
float aleatorio(float min, float max)
{
return min + ran2(&idum) * (max - min);
}

92

B.2. Fichero aleatorio.c

Apndice C

Cdigo del AG de SIGENOF


C.1. Fichero ag.h
/***************************************************************************
* Copyright (C) 2005 by Luis Marco Gimnez - UNED 2004/2005
* luigimaloni@hotmail.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
***************************************************************************/
/*
Definicin de la funcin J a optimizar
*/
typedef struct DEF_FUNCION
{
char *funcion;
int num_parametros;
float *valor_min_parametro;
float *valor_max_parametro;
}
93

C.1. Fichero ag.h

94

Tipo_funcion;
/*
El cromosoma se define como un vector de parmetros xi de la funcion J a
optimizar. Se realiza una sustitucin en los parmetros de la funcin,
de forma que las diferentes variables x, y, z, ... toman los valores
x[0], x[1], x[2], ...
*/
typedef struct CROMOSOMA
{
long *x; // Vector de parmetros de la funcin J
float fitness; // Fitness del resultado de la evaluacin de la funcin J
float p; // Probabilidad de seleccin p para cada cromosoma
float q; // Probabilidad acumulada q para cada cromosoma
int seleccionado; // Cromosoma seleccionado para cruce
}
Tipo_cromosoma;
/*
Era en la que comenzar a correr el AG y que ser til para continuar tras pulsar_grafico
*/
static int era_inicial = 1;
/*
Prototipos de funciones usadas por el AG
*/
void copiar_cromosoma (Tipo_cromosoma *, Tipo_cromosoma *);
void establecer_J (void);
void inicializar_cromosomas (void);
void generar_poblacion_aleatoria (void);
void seleccion_cromosomas (void);
void cruce_cromosomas (void);
void mutacion_uniforme (void);
void evaluacion_poblacion (void);
void elitismo (void);
void copiar_genes (Tipo_cromosoma *, int, Tipo_cromosoma *, int, int);
void init_ag (int, int, int, float, float, int, float, int);
void cancel_ag (void);
float *precision_decimal (long *);
void ver_cromosomas (Tipo_cromosoma *);
float *reservar_memoria_parametros (int);
void gui_mejor_solucion (int);
void trata_linea_fun (char *);
float calculo_desviacion_estandar(void);
void bucle_ag(void);
int condicion_epsilon(void);

C. Cdigo del AG de SIGENOF

C.2. Fichero ag.c


/***************************************************************************
* Copyright (C) 2005 by Luis Marco Gimnez - UNED 2004/2005
* luigimaloni@hotmail.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
***************************************************************************/
/* PROGRAMA PRINCIPAL: Algoritmo Gentico -----------------------------------------####################################################################################
S I G E N O F: Sistema de Implementacin Gentica para la Optimizacin de Funciones
####################################################################################
---------------------------------------------------------------------------------- */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
/*
Directivas include estndar
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#include <string.h>
/*
Directivas include especficas del problema
*/
#include "aleatorio.h"
#include "pfc_ag.h"
#include "ag.h"
#include "eval.h"
#include "fichero.h"
/*
Parmetros del algoritmo gentico
*/

95

C.2. Fichero ag.c

96

int MAXGENS; // Nm. de Generaciones


int POP_SIZE; // Tamao de la poblacin
int ERAS; // Nm. de Eras
float pc; // Probabilidad de cruce [0,1]
float pm; // Probabilidad de mutacin [0,1]
float *x_dec = NULL; // Codificacin de los genes en formato decimal
int PRECISION = 3; // Precisin en decimales para la codificacinn de soluciones
float EPSILON; // Criterio de terminacin adicional tal que: |J(k+1) - J(k)| <= EPSILON
int ELITISMO; // Aplicacin de mecanismos de Elitismo en el AG
/*
Cromosomas
*/
Tipo_cromosoma *cromosoma = NULL;
Tipo_cromosoma *nueva_poblacion = NULL;
Tipo_cromosoma mejor_cromosoma;
Tipo_cromosoma cromosoma_aux;
/*
Variables y contadores del algoritmo gentico
*/
int generacion;
int era;
int nGenes;
char *str_gui = NULL;
char *str_aux = NULL;
int cancelado = 0;
float *lista_mejores_soluciones_eras = NULL;
float mejor_solucion_gen = -FLT_MAX;
float mejor_solucion_gen_ant = -FLT_MAX;
float mejor_solucion_eras = -FLT_MAX;
float suma_mejor_solucion_eras = 0;
int epsilon_alcanzado = FALSE;
/*
Datos estadsticos del AG
*/
float maximo_J = 0;
float media_J = 0;
float desviacion_J = 0;
/*
Definicin de la funcin J y de los cromosomas poblacionales necesarios
*/
Tipo_funcion J;
/*
Establece la funcin J a optimizar
*/
void establecer_J()
{
// Define la funcin J definida por el usuario

C. Cdigo del AG de SIGENOF

97

if (J.funcion) free(J.funcion);
J.funcion = malloc( sizeof(char) * strlen(get_user_function()) );
strcpy(J.funcion, get_user_function());
J.num_parametros = contar_variables_x(J.funcion);
if (J.valor_min_parametro) free(J.valor_min_parametro);
if (J.valor_max_parametro) free(J.valor_max_parametro);
J.valor_min_parametro = reservar_memoria_parametros(J.num_parametros);
J.valor_max_parametro = reservar_memoria_parametros(J.num_parametros);
/*
Salida del AG a fichero
*/
char str_fich[350];
abrir_fichero("./salida_ag", FICHERO_SALIDA);
abrir_fichero("./soluciones_ag", FICHERO_SOLUCIONES);
escribir_fichero("1. FUNCIN J A OPTIMIZAR:\n\n", FICHERO_SALIDA);
sprintf(str_fich, "\tJ = %s\n", J.funcion);
escribir_fichero(str_fich, FICHERO_SALIDA);
escribir_fichero("\tcon,\n", FICHERO_SALIDA);
int i;
for (i = 0; i <J.num_parametros; i++)
{
J.valor_min_parametro[i] = get_max_min_x(i, 0);
J.valor_max_parametro[i] = get_max_min_x(i, 1);
// Salida del AG a fichero
sprintf(str_fich, "\t\tx[ %i] entre [ %5.2f, %5.2f]\n", i, J.valor_max_parametro[i],
J.valor_min_parametro[i]);
escribir_fichero(str_fich, FICHERO_SALIDA);
}
// Salida del AG a fichero
escribir_fichero("\n\n", FICHERO_SALIDA);
escribir_fichero("2. PARMETROS DEL AG:\n\n", FICHERO_SALIDA);
sprintf(str_fich, "\t* No de ERAS: %i\n", ERAS);
escribir_fichero(str_fich, FICHERO_SALIDA);
sprintf(str_fich, "\t* No de GENERACIONES: %i\n", MAXGENS);
escribir_fichero(str_fich, FICHERO_SALIDA);
sprintf(str_fich, "\t* INDIVIDUOS de la Poblacin: %i\n", POP_SIZE);
escribir_fichero(str_fich, FICHERO_SALIDA);
sprintf(str_fich, "\t* Probabilidad de Cruce: %0.4f\n", pc);
escribir_fichero(str_fich, FICHERO_SALIDA);
sprintf(str_fich, "\t* Probabilidad de Mutacin: %0.4f\n", pm);
escribir_fichero(str_fich, FICHERO_SALIDA);
sprintf(str_fich, "\t* Precisin decimal: %i\n", PRECISION);
escribir_fichero(str_fich, FICHERO_SALIDA);
sprintf(str_fich, "\t* Condicin adicional (epsilon): %f\n", EPSILON);
escribir_fichero(str_fich, FICHERO_SALIDA);
if (ELITISMO)
{
sprintf(str_fich, "\t* ELITISMO: SI\n\n\n");

C.2. Fichero ag.c

98

}
else
{
sprintf(str_fich, "\t* ELITISMO: NO\n\n\n");
}
escribir_fichero(str_fich, FICHERO_SALIDA);
escribir_fichero("3. MEJORES SOLUCIONES EN CADA ERA:\n\n", FICHERO_SALIDA);
// Nmero de genes por cromosoma
nGenes = J.num_parametros;
}
/*
Se reserva memoria para los rangos de valores de cada uno de los parmetros de la funcin J
*/
float *reservar_memoria_parametros(int n)
{
return (float *) calloc(n, sizeof(float));
}
/*
Inicializa la poblacin aleatoriamente
*/
void inicializar_cromosomas()
{
// Se reserva memoria para la poblacin de cromosomas y las sucesivas nuevas poblaciones
if (cromosoma) free(cromosoma);
if (nueva_poblacion) free(nueva_poblacion);
cromosoma = malloc(sizeof(Tipo_cromosoma) * POP_SIZE);
nueva_poblacion = malloc(sizeof(Tipo_cromosoma) * POP_SIZE);
// Se reserva memoria para guardar el MEJOR cromosoma de la poblacin futura y se inicializa
if (mejor_cromosoma.x) free(mejor_cromosoma.x);
mejor_cromosoma.x = (long *) calloc(nGenes, sizeof(long));
mejor_cromosoma.fitness = -FLT_MAX;
mejor_cromosoma.p = mejor_cromosoma.q = mejor_cromosoma.seleccionado = 0;
int i;
for (i = 0; i <POP_SIZE; i++)
{
// Se reserva memoria para cada cromosoma poblacional
cromosoma[i].x = (long *) calloc(nGenes, sizeof(long));
nueva_poblacion[i].fitness = -FLT_MAX;
cromosoma[i].p = cromosoma[i].q = cromosoma[i].seleccionado = 0;
// Se reserva memoria para cada cromosoma de la nueva poblacin futura y se inicializan
nueva_poblacion[i].x = (long *) calloc(nGenes, sizeof(long));
nueva_poblacion[i].fitness = -FLT_MAX;
nueva_poblacion[i].p = nueva_poblacion[i].q = nueva_poblacion[i].seleccionado = 0;
}
// Se reserva memoria para un cromosoma auxiliar utilizado en algunas operaciones genticas
cromosoma_aux.x = (long *) calloc(nGenes, sizeof(long));

C. Cdigo del AG de SIGENOF


// Se reserva memoria para la cadena de texto de las salidas impresas del AG
if (str_gui) free(str_gui);
if (str_aux) free(str_aux);
str_gui = malloc(sizeof(char) * 350);
str_aux = malloc(sizeof(char) * 350);
// Se reserva memoria para la codificacin decimal de los genes de cada cromosoma;
if (x_dec) free(x_dec);
x_dec = (float *) calloc(nGenes, sizeof(float));
// Se inicializa la mejor solucin entre eras, sus contadores y estadsticos
mejor_solucion_eras = -FLT_MAX;
suma_mejor_solucion_eras = 0;
maximo_J = media_J = desviacion_J = 0;
// Se reserva memoria para la lista de las mejores soluciones de las eras
if (lista_mejores_soluciones_eras) free(lista_mejores_soluciones_eras);
lista_mejores_soluciones_eras = malloc(sizeof(float) * ERAS);
// Se inicializa la mejor solucin de la generacin actual y anterior
mejor_solucion_gen = -FLT_MAX;
mejor_solucion_gen_ant = -FLT_MAX;
}
/*
Genera POP_SIZES cromosomas poblacionales aleatoriamente, realiza la evaluacin en
funcin de J para cada cromosoma y obtiene el mejor cromosoma poblacional
*/
void generar_poblacion_aleatoria()
{
int i, j;
float v;
for (i = 0; i <POP_SIZE; i++)
{
// PASO 1: GENERACIN ALEATORIA de los Genes de cada cromosoma
for (j = 0; j <nGenes; j++)
{
v = aleatorio(J.valor_min_parametro[j], J.valor_max_parametro[j]);
// Redondeo a PRECISION cifras decimales
cromosoma[i].x[j] = floor(v * pow(10, PRECISION));
}
// PASO 2: EVALUACIN del cromosoma
cromosoma[i].fitness = eval(J.funcion, precision_decimal(cromosoma[i].x));
}
}
/*
Seleccin de cromosomas mediante el mtodo de la RULETA
*/
void seleccion_cromosomas()
{

99

C.2. Fichero ag.c

100

int i, j;
float r, F = 0;
// 1) Se calcula la suma total de los F valores de la funcin de coste J
// asociada a cada cromosoma i
for (i = 0; i <POP_SIZE; i++)
{
F += cromosoma[i].fitness;
}
// 2) Se calcula la probabilidad de seleccin p para cada cromosoma i
for (i = 0; i <POP_SIZE; i++)
{
cromosoma[i].p = cromosoma[i].fitness / F;
}
// 3) Se calcula la probabilidad acumulada q para cada cromosoma i como la suma de
// las probabilidades q de los cromosomas anteriores.
for (i = 0; i <POP_SIZE; i++)
{
for (j = 0; j <= i; j++)
{
cromosoma[i].q += cromosoma[j].p;
}
}
// 4) Se gira la ruleta POP_SIZE veces.
for (j = 0; j <POP_SIZE; j++)
{
// 4.1) Se genera un nmero real aleatorio r dentro del rango [0,1]
r = aleatorio(0, 1);
// 4.2) Recorremos los cromosomas de forma que si r <q(1) se selecciona
// el cromosoma 1 (ndice 0), en caso contrario se selecciona el cromosoma
// i-simo (2 <= i <= POP_SIZE) tal que q(i-1) <r <= q(i)
for (i = 0; i <POP_SIZE; i++)
{
if (r <cromosoma[i].q)
{
copiar_cromosoma(&nueva_poblacion[j], &cromosoma[i]);
i = POP_SIZE + 1;
}
}
}
// Se copia la nueva_poblacin al array cromosoma, como poblacin actual
for (i = 0; i <POP_SIZE; i++)
{
copiar_cromosoma(&cromosoma[i], &nueva_poblacion[i]);
}
}
/*
Cruce de dos cromosomas en un solo punto

C. Cdigo del AG de SIGENOF


*/
void cruce_cromosomas()
{
int i, pos, seleccionados = 0;
for (i = 0; i <POP_SIZE; i++)
{
// 1) Se genera un nmero aleatorio [0,1] para la seleccin aleatoria
// de cromosomas para el cruce. Si r <pc se selecciona el cromosoma
if (aleatorio(0,1) <pc)
{
cromosoma[i].seleccionado = 1;
seleccionados++;
}
}
// Si el nmero de cromosomas seleccionados es impar se opta por seleccionar,
// aleatoriamente, otro cromosoma de la poblacin
if ((seleccionados % 2) != 0 && seleccionados <POP_SIZE)
{
do
{
pos = (int) floor(aleatorio(0, POP_SIZE));
}
while (cromosoma[pos].seleccionado);
cromosoma[pos].seleccionado = 1;
seleccionados++;
}
// 2) Se realiza la operacin de CRUCE EN UN SOLO PUNTO entre parejas de
// individuos seleccionados.
int k;
int padre1;
int padre2 = -1;
for (k = 0; k <(seleccionados / 2); k++)
{
for (padre1 = padre2 + 1; !(cromosoma[padre1].seleccionado); padre1++)
; // 1er. cromosoma padre de la pareja
for (padre2 = padre1 + 1; !(cromosoma[padre2].seleccionado); padre2++)
; // 2 cromosoma padre de la pareja
// Cruce: Se realiza la operacin cruce en un solo punto elegido al azar
pos = (int) floor(aleatorio(1, nGenes));
// Se copia el cromosoma padre a un cromosoma auxiliar de trabajo para
// no perder informacin durante el cruce
copiar_cromosoma(&cromosoma_aux, &cromosoma[padre1]);
// Se realiza el cruce mediante el intercambio de informacin gentica
copiar_genes(&cromosoma[padre1], pos, &cromosoma[padre2], pos, nGenes);
copiar_genes(&cromosoma[padre2], pos, &cromosoma_aux, pos, nGenes);
}
}

101

C.2. Fichero ag.c

102

/*
Mutacin uniforme
*/
void mutacion_uniforme()
{
int i, j;
for (i = 0; i <POP_SIZE; i++)
{
for (j = 0; j <nGenes; j++)
{
if (aleatorio(0,1) <pm)
{
cromosoma[i].x[j] = aleatorio(J.valor_min_parametro[j],
J.valor_max_parametro[j]);
}
}
}
}
/*
Elitismo
*/
void elitismo()
{
int i;
int mejor_actual = 0;
int peor_actual = 0;
for (i = 1; i <POP_SIZE; i++)
{
mejor_actual = (cromosoma[mejor_actual].fitness <cromosoma[i].fitness) ?
i :
mejor_actual;
peor_actual = (cromosoma[peor_actual].fitness >cromosoma[i].fitness) ?
i :
peor_actual;
}
// Se guarda la mejor solucin de la generacin anterior (i-1)
mejor_solucion_gen_ant = mejor_solucion_gen;
// Se guarda la mejor solucin de la generacin
mejor_solucion_gen = cromosoma[mejor_actual].fitness;
// Mecanismo de Elitismo si el usuario as lo ha seleccionado en el GUI
// Se compara el valor del mejor cromosoma de la poblacin actual
// con el mejor de la anterior. Si el mejor_actual >= mejor_cromosoma,
// se considera como mejor_cromosoma al mejor_actual. En caso contrario
// (ELITISMO), se sustituye el peor_actual por el mejor_cromosoma.
if (cromosoma[mejor_actual].fitness >= mejor_cromosoma.fitness)
{
copiar_cromosoma(&mejor_cromosoma, &cromosoma[mejor_actual]);

C. Cdigo del AG de SIGENOF


}
else
{
// ELITISMO: Se sustituye el peor_actual por el mejor_cromosoma
if (ELITISMO)
{
copiar_cromosoma(&cromosoma[peor_actual], &mejor_cromosoma);
}
}
}
/*
Evaluacin de la poblacin en funcin de J (fitness de cada cromosoma)
*/
void evaluacion_poblacion()
{
int i;
for (i = 0; i <POP_SIZE; i++)
{
// Evaluacin
cromosoma[i].fitness = eval(J.funcion, precision_decimal(cromosoma[i].x));
// Se inicializan los atributos de los cromosomas p, q y seleccionado
// que ya no son de utilidad en la siguiente vuelta
cromosoma[i].p = cromosoma[i].q = cromosoma[i].seleccionado = 0;
}
}
/*
Intercambio de informacin gentica del cromosoma origen al cromosoma destino
en la posicion apuntada por pos1.
Los genes copiados del origen son los apuntados desde la pos2 hasta la pos3.
*/
void copiar_genes(Tipo_cromosoma *destino, int pos1,
Tipo_cromosoma *origen, int pos2, int pos3)
{
int i;
// Copia los valores primitivos x (genes) referenciado por puntero
for (i = pos2; i <pos3; i++, pos1++)
{
*(destino->x + pos1) = *(origen->x + i);
}
}
/*
Copia el valor de un cromosoma a otro.
Estructura del cromosoma:
long *x; // Vector de parmetros de la funcin J
float fitness; // Fitness del resultado de la evaluacin de J

103

C.2. Fichero ag.c

104

float p; // Probabilidad de seleccin p para cada cromosoma


float q; // Probabilidad acumulada q para cada cromosoma
int seleccionado; // Cromosoma seleccionado para cruce
*/
void copiar_cromosoma(Tipo_cromosoma *destino, Tipo_cromosoma *origen)
{
int i;
// Copia valores primitivos
destino->fitness = origen->fitness;
destino->p = origen->p;
destino->q = origen->q;
destino->seleccionado = origen->seleccionado;
// Copia los valores primitivos x (genes) referenciado por puntero
for (i = 0; i <nGenes; i++)
{
*(destino->x + i) = *(origen->x + i);
}
}
/*
Convierte cromosomas de LONG ->FLOAT, para evaluar la funcin de coste J
*/
float *precision_decimal(long *x)
{
int i;
for (i = 0; i <nGenes; i++)
{
x_dec[i] = x[i] / pow(10, PRECISION);
}
return x_dec;
}
/*
Cancela la ejecucin del AG, a peticin del usuario
*/
void cancel_ag()
{
cancelado = 1;
}
/*
Dibujar la mejor solucin en el GUI
*/
void gui_mejor_solucion(int tiempo)
{
// Datos estadsticos entre eras
if (tiempo == 2)
{

C. Cdigo del AG de SIGENOF


maximo_J = mejor_solucion_eras;
suma_mejor_solucion_eras += mejor_cromosoma.fitness;
media_J = suma_mejor_solucion_eras / era;
lista_mejores_soluciones_eras[era - 1] = mejor_cromosoma.fitness;
// Inicializar mejor_soluci3 n generacional
mejor_solucion_gen = -FLT_MAX;
mejor_solucion_gen_ant = -FLT_MAX;
}
else
{
// Graficar mejor solucin de cada generacin
dibujar_solucion(mejor_solucion_gen);
}
// Datos estadsticos
escribir_datos_estadisticos(maximo_J, media_J, -FLT_MAX,
str_tiempo_transcurrido());
}
/*
Calcula la desviacin estndar del proceso una vez finalizado
*/
float calculo_desviacion_estandar()
{
int i;
float numerador = 0;
for (i = 0; i <(era-1); i++)
{
numerador += pow( (lista_mejores_soluciones_eras[i] - media_J), 2 );
}
desviacion_J = sqrt( numerador / (era-1) );
return desviacion_J;
}
/*
Verifica la condicin epsilon: J(k+1) - J(k) <= EPSILON
*/
int condicion_epsilon()
{
if (EPSILON >0)
{
if ( fabs(mejor_solucion_gen - mejor_solucion_gen_ant) <= EPSILON )
{
return TRUE;
}
}
return FALSE;
}

105

C.2. Fichero ag.c

106

/*
======================================================================================
Funcin principal del AG
======================================================================================
*/
void init_ag(int arg_ERAS, int arg_MAXGENS, int arg_POP_SIZE,
float arg_pc, float arg_pm,
int precision, float epsilon, int elitismo)
{
/*
Parmeteros del AG
*/
ERAS = arg_ERAS;
MAXGENS = arg_MAXGENS;
POP_SIZE = arg_POP_SIZE;
pc= arg_pc;
pm = arg_pm;
cancelado = 0;
era_inicial = 1;
PRECISION = precision;
EPSILON = epsilon;
ELITISMO = elitismo;
/* Paso INICIAL -------------------------------------------------------Se establece la funcin J a optimizar
-----------------------------------------------------------------------*/
establecer_J();
/* Incializacin de cromosomas y Reserva de memoria -------------------Necesaria para la nueva_poblacion y el mejor_cromosoma
-----------------------------------------------------------------------*/
inicializar_cromosomas();
// Se ejecuta el bucle principal del AG
bucle_ag();
}
/*
Bucle principal del AG
*/
void bucle_ag()
{
// Se ejecuta el algoritmo ERAS veces
for (era = era_inicial; era <= ERAS; era++)
{
// Si se ha pulsado el botn cancelado se sale del bucle de ERAS
if (cancelado)
{
break;

C. Cdigo del AG de SIGENOF


}
// Inicializa el grfico de soluciones en cada era
inicia_graph("drawingarea1");
/* PASO 1, PASO 2 y PASO 3 ----------------------------------------PASO 1: Se genera la poblacin inicial de forma aleatoria
PASO 2: Se evala cada cromosoma de la funcin inicial sobre J
PASO 3: Se obtiene el mejor individuo de la poblacin inicial
-------------------------------------------------------------------*/
generar_poblacion_aleatoria();
/* PASO 4 ---------------------------------------------------------Bucle de ejecucin hasta MAXGENS (Pasos 1..6)
PASO 4.1: Incrementar el contador de generaciones
PASO 4.2: Aplicar el operador de seleccin
PASO 4.3: Aplicar el operador de cruce en un solo punto
PASO 4.4: Aplicar el operador de mutacin uniforme
PASO 4.5: Evaluacin de la poblacin actual
PASO 4.6: Elitismo
--------------------------------------------------------------------*/
// Bucle generacional de ejecucin hasta MAXGENS veces
for (generacion = 1; generacion <= MAXGENS; generacion++)
{
// PASO 4.1: Incrementar el contador de generaciones (en bucle)
actualiza_barra_progreso();
// PASO 4.2: Aplicar el operador de seleccin (MTODO DE LA RULETA)
seleccion_cromosomas();
// PASO 4.3: Aplicacin del operador de CRUCE EN UN SOLO PUNTO
cruce_cromosomas();
// PASO 4.4: Se aplica el operador de mutacin UNIFORME
// Se genera, PARA CADA GEN, un nmero aleatorio [0,1]
// para la seleccin aleatoria de cromosomas para la mutacin.
// Si r <pm se muta el cromosoma, es decir, se reemplaza EL GEN por
// un nmero real aleatorio
mutacion_uniforme();
// PASO 4.5: EVALUACIN de la poblacin actual
evaluacion_poblacion();
// PASO 4.6: ELITISMO
// 1) Se localizan el mejor y peor cromosoma de la poblacin actual
elitismo();
// Escribir en fichero de salida la mejor solucin de la generacin
escribir_fichero("\t* ", FICHERO_SOLUCIONES);
sprintf(str_gui, "ERA %i - Generacin %i: Mejor Solucin %f\n", era,
generacion, mejor_solucion_gen);
escribir_fichero(str_gui, FICHERO_SOLUCIONES);
// Graficar en el GUI la mejor solucin de la GENERACIN
gui_mejor_solucion(1);
// Condicin adicional (epsilon)

107

C.2. Fichero ag.c

108

if (generacion >1 && condicion_epsilon())


{
epsilon_alcanzado = TRUE;
int pr;
for (pr = generacion; pr <MAXGENS; pr++)
{
actualiza_barra_progreso();
}
break;
}
else
{
epsilon_alcanzado = FALSE;
}
} // ################## Fin bucle generacional #####################
/*
Salida a GUI
*/
strcpy(str_aux, "ERA %i: MEJOR SOLUCION ( %.");
sprintf(str_gui, " %if", PRECISION);
strcat(str_aux, str_gui);
sprintf(str_gui, str_aux, era, mejor_cromosoma.x[0]/pow(10, PRECISION));
int i;
char *str_aux2 = malloc(sizeof(char)*100);
for (i = 1; i <nGenes; i++)
{
strcpy(str_aux, " %.");
sprintf(str_aux2, " %if", PRECISION);
strcat(str_aux, str_aux2);
sprintf(str_aux2, str_aux, mejor_cromosoma.x[i]/pow(10, PRECISION));
strcat(str_gui, str_aux2);
}
strcpy(str_aux, ") = %5.");
sprintf(str_aux2, " %if", PRECISION);
if (epsilon_alcanzado)
{
if (generacion >MAXGENS) generacion = MAXGENS;
char *str_aux3 = malloc(sizeof(char) * 50);
sprintf(str_aux3, " :: (epsilon en generacion %i)\n", generacion);
strcat(str_aux2, str_aux3);
}
else
{
strcat(str_aux2, "\n");
}
strcat(str_aux, str_aux2);
sprintf(str_aux2, str_aux, mejor_cromosoma.fitness);
strcat(str_gui, str_aux2);

C. Cdigo del AG de SIGENOF


/*
Salida a Fichero
*/
escribir_fichero("\t* ", FICHERO_SALIDA);
escribir_fichero(str_gui, FICHERO_SALIDA);
escribir_fichero("\n", FICHERO_SOLUCIONES);
// Se guarda el mejor cromosoma de la ERA
mejor_solucion_eras = (mejor_solucion_eras <mejor_cromosoma.fitness) ?
mejor_cromosoma.fitness :
mejor_solucion_eras;
// Imprimir salida en GUI
salida_gui(str_gui);
// Graficar en el GUI la mejor solucin de la ERA
gui_mejor_solucion(2);
// Se inicializa el mejor cromosoma
mejor_cromosoma.fitness = -FLT_MAX;
mejor_cromosoma.p = mejor_cromosoma.q = mejor_cromosoma.seleccionado = 0;
// Siguiente era
era_inicial++;
// Controla la pausa entre eras
if (getPausar_grafico())
{
habilita("continuar_btn", TRUE);
break;
}
} // ################## Fin bucle eras #####################
// Fin del AG cuando se alcanza la ltima era o es cancelado por usuario
if (era >= ERAS || cancelado)
{
if (cancelado)
{
sprintf(str_aux, "*** Proceso cancelado por el usuario ***");
salida_gui(str_aux);
sprintf(str_aux, "\n\t*** Proceso cancelado por el usuario ***\n");
escribir_fichero(str_aux, FICHERO_SALIDA);
escribir_fichero(str_aux, FICHERO_SOLUCIONES);
}
// Se escriben datos estadsticos en el GUI y en el fichero de salida
escribir_datos_estadisticos(-FLT_MAX, -FLT_MAX,
calculo_desviacion_estandar(), NULL);
escribir_resultados_en_salida();
// Notificacin de finalizacin del AG al GUI
fin_gui();
}
}

109

110

C.2. Fichero ag.c

Apndice D

Ficheros de salida de SIGENOF


D.1. Descripcin de las salidas
En este apndice se muestra el formato de los dos cheros de salida del AG
tras una ejecucin. En el primero de ellos,
guarda informacin de la funcin

./salida_ag_DD.MM.AAAA_HH.MM.SS, se

que ha sido optimizada, los parmetros intro-

ducidos por el usuario para dicha ejecucin, el detalle de las mejores soluciones de
cada era, y un resumen con los resultados del proceso en trminos de tiempo de
ejecucin, valor mximo, medio y desviacin estndar de las soluciones entre eras,
mientras que en el segundo,

./soluciones_ag_DD.MM.AAAA_HH.MM.SS, se muestran

las mejores soluciones obtenidas por el AG en cada generacin y era.

D.2. Fichero salida_ag


------------------------------------------------------------------------------------S I G E N O F
Mon Sep 26 23:14:55 2005
------------------------------------------------------------------------------------1. FUNCIN J A OPTIMIZAR:
J = 21,5 + x[0] * sin(4 * pi * x[0]) + x[1] * sin(4 * pi * x[1])
con,
x[0] entre [12,10, -3,00]
x[1] entre [ 5,80, 4,10]
2. PARMETROS DEL AG:
111

D.3. Fichero soluciones_ag

112

* No de ERAS: 5
* No de GENERACIONES: 100
* INDIVIDUOS de la Poblacin: 100
* Probabilidad de Cruce: 0,8000
* Probabilidad de Mutacin: 0,1050
* Precisin decimal: 3
* Condicin adicional (epsilon): 0,000000
* ELITISMO: SI

3. MEJORES SOLUCIONES EN CADA ERA:


* ERA 1: MEJOR SOLUCION (9,598 5,615) = 36,122
* ERA 2: MEJOR SOLUCION (11,134 5,631) = 38,178
* ERA 3: MEJOR SOLUCION (11,639 5,583) = 37,783
* ERA 4: MEJOR SOLUCION (11,603 5,093) = 37,349
* ERA 5: MEJOR SOLUCION (10,137 5,609) = 37,018

4. RESULTADOS DE LA EJECUCIN:
* Mximo Valor: 38,178
* Media Aritmtica 37,290
* Desviacin Estndar: 0,703
* Tiempo de Ejecucin: 00:02 seg.

D.3. Fichero soluciones_ag


------------------------------------------------------------------------------------S I G E N O F
Mon Sep 26 23:14:55 2005
------------------------------------------------------------------------------------* ERA 1 - Generacin 1: Mejor Solucin 36,078178
* ERA 1 - Generacin 2: Mejor Solucin 35,150215
* ERA 1 - Generacin 3: Mejor Solucin 35,358189
* ERA 1 - Generacin 4: Mejor Solucin 36,121540
* ERA 1 - Generacin 5: Mejor Solucin 36,121540
* ERA 1 - Generacin 6: Mejor Solucin 36,078178
* ERA 1 - Generacin 7: Mejor Solucin 36,078178
* ERA 1 - Generacin 8: Mejor Solucin 36,078178
* ERA 1 - Generacin 9: Mejor Solucin 36,121540
* ERA 1 - Generacin 10: Mejor Solucin 36,121540

D. Ficheros de salida de SIGENOF


...

* ERA 2 - Generacin 1: Mejor Solucin 35,296928


* ERA 2 - Generacin 2: Mejor Solucin 35,781898
* ERA 2 - Generacin 3: Mejor Solucin 38,177864
* ERA 2 - Generacin 4: Mejor Solucin 38,177864
* ERA 2 - Generacin 5: Mejor Solucin 37,936325
* ERA 2 - Generacin 6: Mejor Solucin 38,177864
* ERA 2 - Generacin 7: Mejor Solucin 37,155708
* ERA 2 - Generacin 8: Mejor Solucin 38,177864
* ERA 2 - Generacin 9: Mejor Solucin 38,177864
* ERA 2 - Generacin 10: Mejor Solucin 38,177864
...

113

114

D.3. Fichero soluciones_ag

Referencias Bibliogrcas
[Chen89]

Mitsuo Gen and Runwei Cheng -

Genetic Algorithms & Engineering De-

sign, 1989
[Davis91] Lawrence Davis -

[Gold89]

Handbook of Genetic Algorithms, 1991

David E. Goldberg -

Genetic Algorithms in Search, Optimization and

Machine Learning, 1989


[Mich99]

Zbigniew Michalewicz -

Genetic Algorithms + Data Structures = Evolu-

tion Programs, 1999


[Holl92]

John H. Holland -

Algoritmos Genticos. Investinacin y Ciencia, 1992.

[Perez96] Anselmo Prez Serrada -

Una Introduccin a la Computacin Evolutiva,

1996
[Kern91]

Brian W. Kernighan & Dennis M. Ritchie -

El lenguaje de programacin

C, 2a Edicin 1991
[UNav98] Universidad de Navarra -

Aprenda el lenguaje ANSI C como si estuviera

en primero, 1998
[Dom03]

Francisco Domnguez-Adame - UCM -

Desarrollo de aplicaciones cient-

cas con Glade, 2003


[Recip88] Cambridge University Press -

Numerical Recipes in C: The art of Scien-

tic Computing, 1988

115

S-ar putea să vă placă și