Documente Academic
Documente Profesional
Documente Cultură
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-,
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,
consist in
iii
iv
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
1. Introduccin
15
1.1.
Preliminares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
1.2.
Computacin Evolutiva
. . . . . . . . . . . . . . . . . . . . . . . . .
16
1.3.
Algoritmos Genticos . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
1.4.
. . . . . . . .
18
1.5.
19
1.6.
20
1.7.
Funcionamiento de un AG bsico . . . . . . . . . . . . . . . . . . . .
20
1.8.
23
1.9.
Herramienta SIGENOF
. . . . . . . . . . . . . . . . . . . . . . . . .
24
25
26
. . . . . . . . . . . . . . . . . . . . . . . .
29
2.1.
. . . . . . . . . . . . . . . . .
29
2.2.
Estructuras de datos . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
2.3.
. . . . . . . . . . . . . . .
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
37
2.4.1.
Paso 1. Inicializacin . . . . . . . . . . . . . . . . . . . . . . .
37
2.4.2.
Paso 2. Evaluacin . . . . . . . . . . . . . . . . . . . . . . . .
39
2.4.3.
39
2.4.4.
40
2.4.5.
45
47
3.1.
47
3.2.
Visin general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
3.3.
48
3.3.1.
. . . . . . . . . . . . . . .
50
3.3.2.
. . . . . . . . . . . . . . . . .
50
3.3.3.
. . . . . . . . . . . . . . .
50
3.3.4.
51
3.3.5.
Panel 5: Funcin
3.3.6.
3.3.7.
3.3.8.
3.4.
a Optimizar . . . . . . . . . . . . . . . . .
. . . . . . . . .
52
55
. . . . . .
55
. . . . . . . . . . . .
55
. . . . . . . . . . . . . . . . . . . . . . . . .
56
3.4.1.
. . . . . . . . . . . . . . . . . . . .
3.4.2.
3.4.3.
3.4.4.
. . . . .
60
3.4.5.
61
3.4.6.
62
3.4.7.
63
3.4.8.
. . . . . .
63
3.4.9.
. . . . . . . . . . . . . . .
64
64
J
J
a optimizar
57
. . . . . . . . . . . .
58
. . . . . . . . . . . . . . . . .
59
y su espacio
denido.
NDICE GENERAL
67
4.1.
Caso particular 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
4.2.
Caso particular 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
68
4.3.
69
4.4.
70
4.5.
Caso particular 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
4.6.
Caso particular 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
4.7.
. . . . . . . . . . . . . . . . . . . . . . . . .
74
4.7.1.
75
4.7.2.
75
4.7.3.
. . .
cin 3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.4.
4.7.5.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Variacin del n
cucin 5)
4.7.6.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
80
Variacin del n
80
4.7.8.
78
cin 6) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.7.
77
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
83
5. Conclusiones
85
87
B. Funcin ran2
89
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
93
93
95
10
NDICE GENERAL
111
. . . . . . . . . . . . . . . . . . . . . . . . 111
Referencias Bibliogrcas
. . . . . . . . . . . . . . . . . . . . . . . . . .
112
115
ndice de guras
1.1.
1.2.
1.3.
2.1.
2.2.
. . . . . . . . . . . . .
38
2.3.
. . . . . . . . . . . . .
39
2.4.
Mtodo de la Ruleta
. . . . . . . . . . . . . . . . . . . . . . . . . . .
41
2.5.
2.6.
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.
3.5.
3.6.
Parmetros poblacionales
3.7.
Parmetros naturales
3.8.
Otros parmetros
3.9.
3.10.
3.11.
3.12.
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.
. . . . . . . . . . . . . . . . . . . . . . .
72
4.5.
. . . . . . . . . . . . . . . . . . . . . . .
72
4.6.
Caso Particular 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
4.7.
4.8.
4.9.
4.10.
4.11.
4.12.
4.13.
4.14.
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . .
76
77
78
. . . . . . . . . . . .
79
. . . . . . . . . . . . . .
81
. . . . . . . . . . . . . . .
82
. . . . . . . . . . . .
83
84
ndice de cuadros
2.1.
2.2.
2.3.
2.4.
4.1.
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
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 :
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.
Aptitud :
16
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.
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. Introduccin
17
La Programacin Evolutiva . Hacen evolucionar a una poblacin de mquinas de estados nitos sometindolas a transformaciones unitarias.
(x1 , x2 . . . , xn )
F (x1 , x2 . . . , xn ).
En un algoritmo gentico el problema se parametriza en un conjunto de variables
(x1 , x2 . . . , xn )
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:
Como se puede apreciar en la gura 1.1, las soluciones, codicadas en los cromosomas (
solucin al problema (
S1 , S2, ..., Sn ),
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. Introduccin
19
Codicada, puesto que no se trabaja directamente sobre el dominio del problema, sino sobre representaciones de sus elementos.
Todas las caractersticas enumeradas se introducen deliberadamente para proporcionar ms robustez a la bsqueda.
1.
Mtodos Indirectos :
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 :
2.
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.
2.
3.
4.
Estas cuatro propiedades contribuyen a que los AG sean ms robustos que los
mtodos tradicionalmente usados.
1. Introduccin
21
Figura 1.2:
22
Los criterios de terminacin empleados en implementaciones de AGs son bsicamente dos [Mich99]:
1.
2.
g M AXGEN S .
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:
1 Sistema
Pop,
que consta
1. Introduccin
de
23
intermedia
AuxPop
de
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
n+s
f(x)
u(x),
del problema.
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.
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
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.
4.
5.
vector de parmetr os :
= [x1 , . . . , xn ]
xi
S.
max
S = {x1 [xmin
, xmax
], x2 [xmin
, xmax
], . . . , xn [xmin
]}
1
1
2
2
n , xn
26
xmin
i
xi
xmax
.
i
J : Rn R
J = f ()
J >0
para cualquier
considerado.
opt S
Jopt
de la funcin
J.
Jopt = J(opt ) = maxS (J())
1. Introduccin
27
28
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:
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.
de la funcin
particular para el cromosoma. Este vector de parmetros representa una solucin particular al problema. Estos parmetros, tambin denominados
estn acotados al espacio
Un valor
genes,
J.
tness
reproduccin.
Un valor
31
Estructura CROMOSOMA
La funcin
pop_size
cro-
se describe en el Apndice A.
xi que contiene
0 i numero_parametros 1.
Un vector de valores de coma otante que establece el valor mnimo que cada
variable
de la funcin
J.
Un vector de valores de coma otante que establece el valor mximo que cada
variable
funcin
xi
xmax
del espacio
de la
J.
La denicin de la funcin
32
Estructura FUNCIN
*x),
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
1 y
valores en coma otante, son redondeados, por defecto, a tres cifras decimales
tness
1 Aunque el nmero de cifras decimales es un valor que, como se ver posteriormente, puede ser
denido por el usuario de la herramienta.
33
Probabilidad de cruce
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.
se muestra en el cuadro
2.3.
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
Cuadro 2.3:
34
da funcin
variables
xi
con
0 j n 1.
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],
Constantes predenidas:
1. Constante (pi ): Establece
el cual se dene de
como
se redene como
2 pi.
como ocurre en
Constantes numricas:
1. Constantes Enteras:
2e
se redene como
2 e.
2, -5
125.
Se
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.
2E + 3, 2E3
2.05E 5.
x[0] + x[1].
x (y z)
se redene como
b.
Una
35
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].
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].
seno(2.5), coseno(x)
tangente(1 z)
re-
tan(1 x[2]).
Obtiene el valor de
arcoseno(2.5), arcocoseno(x)
x[2]).
3.
cosenoHiperbolico(x)
mo
tangenteHiperbolica(1 z),
senoHiperbolico(2.5),
htan(1 x[2]).
2,
redenin-
sqrt(2).
exp(x[0]).
e^x[0].
Funciones logartmicas:
1. Logaritmo en base 10 (log(a)):
36
argumento
2.
a.
ln e
|x|
se redene como
ln(e).
se redene como
a.
Una
abs(x[0]).
Suma
Parntesis
Parntesis.
Negacin unaria.
Suma y Resta.
denida como,
37
Cuadro 2.4:
Figura 2.1:
aleatoriamente
la poblacin inicial
38
pseudoaleatorios 2
sea
ran2,
perfecta, consi-
...
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],
[1000, 1000].
ran2
se muestra en el Apndice B.
Figura 2.2:
2 El
Figura 2.3:
39
POP_SIZE
tness
de la poblacin inicial de
o adaptacin al problema.
que
mejor_cromosoma.
Tipo_cromosoma
llamada
40
Mtodo de la Ruleta
1.
Se suman los
tness
se le denominar
Ji .
A esta suma
F, denindose como:
P OP _SIZE
F =
Ji
i=1
2.
como:
pi =
3.
Ji
F
como:
P OP _SIZE
qi =
pk
k=1
4.
Se gira la ruleta
siguiente:
POP_SIZE
Si
r < q1
se selecciona el cromosoma
cromosoma i-simo
C1 ,
41
[0, 1].
para una
nueva poblacin.
POP_SIZE
POP_SIZE
cro-
Figura 2.4:
Mtodo de la Ruleta
42
[0, 1],
pc
1.
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
2.
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
(xi , . . . , xn ), el intercambio
i)
[0, n 1]
xi
(gen
lores enteros que representan valores reales, entre la pareja de cromosomas. Este
funcionamiento puede apreciarse en la gura 2.6.
Figura 2.5:
Figura 2.6:
43
44
xk
POP_SIZE
comprendido entre
de cada
[0, 1],
de forma que si
r < pm
el cromosoma
xk
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
1.
2.
3.
mejor_actual )
individuos
mejor_actual.
POP_SIZE
POP_SIZE
individuos y
peor_actual.
tness
me-
jor_cromosoma ).
Si el mejor cromosoma de la poblacin actual (
mejor_actual )
es mejor que
tness
mejor_cromosoma = mejor_actual.
45
peor_actual = mejor_cromosoma.
generacin
MAXGENS
por el usuario
log
./salida_ag_DD.MM.AAAA_HH.MM.SS.txt y ./soluciones_ag_DD.MM.AAAA
_HH.MM.SS.txt
respectivamente, donde
DD, MM
AAAA
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.
2.
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
46
1.
2.
Seccin con los mejores valores de la funcin de adaptacin para cada una de
las generaciones de las que consta cada era.
Captulo 3
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
48
front-end
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.
1.
2.
3.
4.
Figura 3.1:
5.
49
GUI de SIGENOF
mienta.
6.
7.
8.
A continuacin se detallarn las funcionalidades aportadas por cada uno de los ocho
paneles anteriormente enumerados.
50
Ayuda
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]
Ayuda
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]
51
Cifras decimales de precisin del AG: Nmero de cifras decimales con las que
el AG trabajar para representar las soluciones.
k+1 )
a partir del
de la generacin
aunque no se
| Jk+1 Jk | .
Se proporciona un botn
Ayuda
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:
Epsilon
[1, 6]
J,
xk
que la
52
Si se ha establecido un valor
Pregunta
subpaneles:
Botn
Abrir
favoritas
rapidez.
Botn
Guardar
xk
[xmin
, xmax
]
k
k
del chero que se desea almacenar, as como su ubicacin que puede ser local
Abrir
53
favoritas
. Estas ubicaciones
de la misma manera a
favoritas
son compartidas
Botn
Pregunta
las funciones
xk
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:
x1
de la funcin:
x1
de la funcin:
x10 .
x10 .
x,
de forma que
n 10,
no es necesario
declarar
parmetros
54
Variable de la Funcin
Valor Mn. Valor Mx.
diferentes variables
xk
xk .
, as como
55
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
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
J,
su Media Aritmtica
Botn
Empezar
56
Figura 3.2:
Botn
Cancelar
Funcin de ejemplo
en curso.
Botn
Acerca De
f (x1 , x2 )
en el espacio
tal y como se
muestra seguidamente.
f (x1 , x2 ) =
2 2
2)
2x1 +x
2
sin(
x1 +x2
f (x1 , x2 )
en
la gura 3.2.
En dicha representacin grca se puede observar que el mximo de esta funcin
para el espacio
(0, 0)
57
a optimizar
S
y su espacio
denido
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.
58
Figura 3.3:
Inicio de SIGENOF
f (x1 , x2 ) =
Esta funcin
mizar
2 2
2)
2x1 +x
2
sin(
x1 +x2
Funcin J a opti-
siguiente expresin:
59
para la funcin
f (x1 , x2 )
se dene como:
Variable de la Funcin .
En este rea existen tres elementos para la denicin de los distintos valores que
componen el espacio
xk
de la funcin:
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.
x1
funcin:
Variable
x1
Variable
Variable
x[0]
en la lista desplegable.
x2
Variable
x[1]
en la lista desplegable.
en la gura 3.4.
x2
de la
60
Figura 3.4:
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
Figura 3.5:
desplegar la opcin
61
+ Aadir
rutas favoritas ,
del dilogo
Guardar Funcin ,
se pueden
62
Figura 3.6:
Parmetros poblacionales
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:
Figura 3.7:
Parmetros naturales
Figura 3.8:
63
Otros parmetros
Criterio de terminacin adicional (epsilon): Para este ejemplo se decidi no aplicar el criterio de terminacin adicional
epsilon,
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.
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
de forma
que al nalizar una era su ejecucin, quede sta suspendida hasta que el usuario
pulse el botn
Continuar
64
Figura 3.9:
Empezar
Figura 3.10:
Figura 3.11:
Figura 3.12:
65
J = 1, 0.
66
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)
68
Figura 4.1:
Caso Particular 1
f (x1 , x2 )
en
en la gura 4.1.
x1 = 12
x2 = 5.6,
prximo a
39.
x2 = 5.629,
de
x1 = 11.6
38.682.
S=
69
xi = 0,
con
1 i 6,
de
100.
2,5 % (0,025)
precisin. De esta forma SIGENOF coincidi con la solucin real obteniendo puntos
prximos a cero
(xi = 0),
de
100.
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
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
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.
70
Figura 4.2:
Caso Particular
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.
x1 = x2 = 0
de
100.
x1
x2
cercanos a
entorno a
x1 = 0.002
x1 = 0.001
x2 = 0.000
x2 = 0.002
con
con
f = 99.944.
f = 99.968.
99.9.
Ejemplos de
Figura 4.3:
71
Caso Particular 4
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
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
72
Figura 4.4:
Figura 4.5:
Figura 4.6:
73
Caso Particular 6
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.
f (x1 , x2 ) = 0.5
sin2
(1+0,001(x21 +x22 ))
f (x1 , x2 )
en
en la gura 4.6.
x1 = x2 = 0,
de
1.0.
74
En este caso SIGENOF tambin coincidi con la solucin real obteniendo puntos
prximos a cero con un valor para
1.0,
como se puede
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.
equivalente a
(0, 0, 0, 0, 0, 0),
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=
enorme, a pesar de que la desviacin estndar entre sucesivas eras para una ejecucin
determinada no resultaban ser tan marcadas.
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.
punto (
f = 97.900 en el
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
76
Figura 4.7:
Elitismo: S
El resultado obtenido por SIGENOF en la primera era tras esta variacin fue
100
en el punto
f =
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,
Figura 4.8:
77
0,2
hasta un
0,015
20 %,
anterior, a un valor de
parmetros:
No de Generaciones: 100
No de Individuos de la Poblacin: 100
0.000 0.000).
78
Figura 4.9:
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
80 %,
soluciones que pudieran estar muy alejadas de la solucin real y que podan dar
lugar a soluciones ms adaptadas al problema.
25
100
Figura 4.10:
79
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 =
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.
80
25
generaciones. El resto
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
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.
400
No de Generaciones: 400
Figura 4.11:
81
El resultado obtenido por SIGENOF en la primera era tras esta variacin coincidi
con la solucin real con un valor para
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.
82
Figura 4.12:
400
No de Generaciones: 100
f = 98.144
en el punto
(0.001 0.002
Figura 4.13:
83
seleccin-cruce-reproduccin.
400
1,5 % (0,015 ).
84
Figura 4.14:
No de Generaciones: 400
f = 100
en el punto
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.
buena solucin
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
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.
J.
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 ),
siempre y cuando se realice bajo los trminos de esta misma licencia y no se vulnere
ningn otro derecho o norma.
Apndice A
<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>
<functName>:= sin
| cos
| tan | sqrt
| abs
| pi
| log
<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
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.
90
/*
Prototipos de las funciones que generan nmeros seudoaleatorios
*/
float ran2(long *);
float aleatorio(float, float);
// 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--)
{
B. Funcin ran2
91
}
iy = iv[0];
}
k = (*idum) / IQ1;
iy = iv[j] - idum2;
92
Apndice C
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);
95
96
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");
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));
99
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
101
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]);
103
104
105
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;
107
108
109
110
Apndice D
./salida_ag_DD.MM.AAAA_HH.MM.SS, se
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
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
4. RESULTADOS DE LA EJECUCIN:
* Mximo Valor: 38,178
* Media Aritmtica 37,290
* Desviacin Estndar: 0,703
* Tiempo de Ejecucin: 00:02 seg.
113
114
Referencias Bibliogrcas
[Chen89]
sign, 1989
[Davis91] Lawrence Davis -
[Gold89]
David E. Goldberg -
Zbigniew Michalewicz -
John H. Holland -
1996
[Kern91]
El lenguaje de programacin
C, 2a Edicin 1991
[UNav98] Universidad de Navarra -
en primero, 1998
[Dom03]
115