1
Algoritmos gen´eticos aplicados en la predicci´on del
mundial 2014
G. Rodr´ıguez, B. Lima,
Tutor: H. Paz.
Abstract—In this paper we consider the genetic algorithms,
since its inception in 1950, also includes the application thereof
to the prediction of the four best teams world in football 2014,
using the library JGAP.
Index Terms—chromosome, gene, crossover, mutation, fitness
function.
I. INTRODUCCI ´ON
Los algoritmos gen´eticos son m´etodos adaptativos,
generalmente usados en problemas de b´usqueda y
optimizaci´on de par´ametros, basados en la reproducci´on y el
principio de supervivencia del mas apto.
Mas formalmente, y siguiendo una definici´on de Goldberg,
”Los Algoritmos Gen´eticos son algoritmos de b´usqueda
basados en la mec´anica de selecci´on natural y de la gen´etica
natural. Combinan la supervivencia del mas apto entre
estructuras de secuencias con un intercambio de informaci´on
estructurado, aunque aleatorizado, para constituir as´ı un
algoritmo de b´usqueda que tenga algo de genialidades de
las b´usquedas humanas” Para alcanzar la soluci´on a un
problema se parte de un conjunto inicial de individuo,
llamado poblaci´on, generado de manera aleatoria. Cada
uno de estos individuos representa una posible soluci´on al
problema. Estos individuos evolucionan tomando como base
los esquemas propuestos por Darwin, sobre la selecci´on
natural, y se adaptaran en mayor medida tras el paso de cada
generaci´on a la soluci´on requerida. [1].
II. ALGORITMOS GEN ´ETICOS
A. Historia de los algoritmos gen´eticos
La primera menci´on del t´ermino, y la primera publicaci´on
sobre una aplicaci´on del mismo, se deben a Bagley (1967),
que dise˜n´o algoritmos gen´eticos para buscar conjuntos de
par´ametros en funciones de evaluaci´on de juegos, y los com-
par´o con los algoritmos de correlaci´on, procedimientos de
aprendizaje modelizados despu´es de los algoritmos de pesos
variantes de ese periodo. Pero es otro cient´ıfico el considerado
creador de los Algoritmos Gen´eticos: John Holland, que
los desarroll´o, junto a sus alumnos y colegas, durante las
d´ecadas de 1960 y 1970. En contraste con las estrategias
evolutivas y la programaci´on evolutiva, el prop´osito original
G. Rodr´ıguez, UNL, Loja, Ecuador, E-mail: gmrodriguezp@unl.edu.ec
B. Lima, UNL, Loja, Ecuador, E-mail: bvlimar@unl.edu.ec
H. Paz, UNL, Loja, Ecuador, E-mail: hpaz@unl.edu.ec
de Holland no era dise˜nar algoritmos para resolver problemas
concretos, sino estudiar, de un modo formal, el fen´omeno de
la adaptaci´on tal y como ocurre en la naturaleza, y desarrollar
v´ıas de extrapolar esos mecanismos de adaptaci´on natural a
los sistemas computacionales. El libro que Holland escribi´o
en 1975 Adaptaci´on en Sistemas Naturales y Artificiales
presentaba el algoritmo gen´etico como una abstracci´on de
la evoluci´on biol´ogica, y proporcionaba el entramado te´orico
para la adaptaci´on bajo el algoritmo gen´etico. El Algoritmo
Gen´etico de Holland era un m´etodo para desplazarse, de
una poblaci´on de cromosomas (bits) a una nueva poblaci´on,
utilizando un sistema similar a la “selecci´on natural” junto con
los operadores de cruces, mutaciones e inversi´on inspirados
en la gen´etica. En este primitivo algoritmo, cada cromosoma
consta de genes (bits), y cada uno de ellos es una muestra
de un alelo particular (0 o 1). El operador de selecci´on
escoge, entre los cromosomas de la poblaci´on, aquellos con
capacidad de reproducci´on, y entre ´estos, los que sean m´as
“compatibles”, producir´an m´as descendencia que el resto. El
de cruce extrae partes de dos cromosomas, imitando la com-
binaci´on1 biol´ogica de dos cromosomas aislados (gametos).
La mutaci´on se encarga de cambiar, de modo aleatorio, los
valores del alelo en algunas localizaciones del cromosoma;
y, por ´ultimo, la inversi´on, invierte el orden de una secci´on
contigua del cromosoma , recolocando por tanto el orden en el
que se almacenan los genes. La mayor innovaci´on de Holland
fue la de introducir un algoritmo basado en poblaciones con
cruces, mutaciones e inversiones2 Es m´as, Holland fue el
primero en intentar colocar la computaci´on evolutiva sobre
una base te´orica firme (Holland, 1975). Hasta hace poco, esta
base te´orica, fundamentada en la noci´on de “esquemas”, fue
la estructura sobre la que se edificaron la mayor´ıa de los
trabajos te´oricos sobre algoritmos gen´eticos en las d´ecadas
siguientes. En estos ´ultimos a˜nos se ha generado una amplia
interacci´on entre los investigadores de varios m´etodos de com-
putaci´on evolutiva, rompi´endose las fronteras entre algoritmos
gen´eticos, estrategias evolutivas y programaci´on evolutiva.
Como consecuencia, en la actualidad, el t´ermino “algoritmo
gen´etico” se utiliza para designar un concepto mucho m´as
amplio del que concibi´o Holland.[2]
B. Principales caracter´ısticas de los algoritmos gen´eticos
• Son algoritmos estoc´asticos. Dos ejecuciones distintas
pueden dar dos soluciones distintas.
• Son algoritmos de b´usqueda m´ultiple, luego dan varias
soluciones. Realizan la b´usqueda mediante toda una gen-
eraci´on objetos, no buscan un ´unico elemento.
2
• Es una b´usqueda param´etricamente robusta. Por lo tanto,
tiende a converger a medida que se realizan las genera-
ciones.
• No trabajan directamente con los objetos, sino con la
codificaci´on de esos objetos, que pueden ser un n´umero,
un conjunto de par´ametros, etc. A esta codificaci´on la
llamamos cromosoma.
• Utilizan una funci´on objetivo que da la informaci´on de
lo adaptados que est´an los individuos, y no las derivadas
u otra informaci´on auxiliar.
• Las reglas de transici´on son probabil´ısticas, no deter-
min´ısticas.
• Los mecanismos de los algoritmos gen´eticos simples son
sorprendentemente f´aciles, dado que los mecanismos que
utiliza son el mecanismo de copia y el de intercambio
de partes de las cadenas de cromosomas.[2]
C. Representaci´on
Todos los organismos vivos est´an constituidos por c´elulas, y
cada c´elula contiene uno o m´as cromosomas. Un cromosoma
puede ser conceptualmente dividido en genes cada uno de
los cuales codifica una prote´ına. En t´erminos generales, se
puede decir que cada gen se codifica como si fuera un rasgo
especifico. Cada gen se encuentra en una posici´on particular
del cromosoma, y est´a formado por alelos. [3]
Fig. 1. Cromosoma
Se supone que los individuos (posibles soluciones del prob-
lema), pueden representarse como un conjunto de par´ametros
(que denominaremos genes), los cuales agrupados forman una
ristra de valores, a menudo referida como cromosoma.
Fig. 2. Cromosoma de representaci´on binaria
D. Algoritmo
Desarrollado por John H. Holland [Holland, 1975], el al-
goritmo gen´etico opera entonces a nivel de genotipo de las
soluciones mediante la siguiente secuencia:
1) Comenzar con una poblaci´on inicial, la cual puede ser
generada de manera aleatoria.
2) Calcular el fitness (aptitud) de cada individuo.
3) Aplicar el operador de selecci´on con base en el fitness
de la poblaci´on.
4) Aplicar los operadores gen´eticos de reproducci´on, cruce
y mutaci´on a la poblaci´on actual para generar a la
poblaci´on de la siguiente generaci´on.
5) Ir al paso 2 hasta que la condici´on de parada se satisfaga.
6) Cuando se cumple la condici´on de parada, se devuelve al
mejor individuo encontrado (bien el mejor de todas las
generaciones, bien el mejor de la ´ultima generaci´on).[4]
Fig. 3. Algoritmo de John H. Holland
E. Funci´on de evaluaci´on y Funci´on de aptitud(fitness)
La funci´on de evaluaci´on generalmente es la funci´on
objetivo, es decir, es lo que se quiere llegar a optimizar. Es
necesario decodificar la soluci´on presente en el cromosoma
para evaluarla.
La funci´on de aptitud (fitness) es la que permite valorar
la aptitud de los individuos y debe tomar siempre valores
positivos.
Ambas funciones suelen ser iguales, pero puede ser que la
funci´on objetivo sea muy compleja, tome valores negativos, o
no proporcione un valor num´erico y, por lo tanto, sea necesario
definir una funci´on de aptitud diferente.
F. Operadores Gen´eticos
En su forma m´as simple, un algoritmo gen´etico consta de
los siguientes operadores gen´eticos: selecci´on, reproducci´on,
cruce (crossover) y mutaci´on. [5]
1) Selecci´on: El proceso de selecci´on sirve para escoger
a los individuos de la poblaci´on mejor adaptados, para que
act´uen de progenitores de la siguiente generaci´on. En la
naturaleza existen varios factores que intervienen para que un
individuo pueda tener descendencia:
• Consiga sobrevivir, ya sea porque no es devorado por
depredadores, o porque sea capaz de procurarse alimento.
• Encuentre pareja para reproducirse.
• El ´ultimo factor es que la combinaci´on de ambos indi-
viduos sea apta para crear un nuevo individuo.
Sin embargo, en la realidad es posible que “el mejor”
individuo no pueda reproducirse,pero otro individuo de
“peor calidad” pueda conseguirlo. Aunque este hecho es
menos probable, sigue siendo posible. En los algoritmos
gen´eticos, la selecci´on es un conjunto de reglas que sirven
para elegir a los progenitores de la siguiente generaci´on.
Estos progenitores se reproducir´an (cruzamiento gen´etico) y
generar´an descendencia.
Un sistema muy utilizado en los algoritmos gen´eticos es la
selecci´on por torneo (la utilizada para este proyecto). Este
3
sistema consiste en escoger aleatoriamente de la poblaci´on
un cierto n´umero de individuos. De esos individuos se escoge
el mejor de todos para ser el padre. Para escoger la madre se
repite el proceso: se escoge aleatoriamente a un n´umero de
individuos de la poblaci´on y se elige al individuo con mejor
calidad. Este sistema garantiza un m´ınimo de diversidad, ya
que no siempre se elegir´a al mejor individuo de la poblaci´on
para tener descendencia.
2) Reproducci´on: En este contexto, se entender´a por
“reproducci´on” la clonaci´on de un individuo. Es decir, un
individuo pasar´a a la siguiente generaci´on sin modificaci´on.
De esta manera, la reproducci´on es un operador gen´etico
que se contrapone al cruce y la mutaci´on, puesto que estos
´ultimos modifican los individuos que pasan a la siguiente
generaci´on. El objetivo de la reproducci´on es mantener en
la siguiente generaci´on a individuos con fitness alta de la
presente generaci´on.
Relacionado con el concepto de reproducci´on est´a el de
“elitismo”, el cual mantiene a los mejores individuos de
una generaci´on a la siguiente, para que no se pierda su
informaci´on.
3) Cruce: Durante esta fase se cruzan o mezclan los
individuos seleccionados en la fase anterior.Es decir, los
genes de los dos padres se mezclan entre s´ı para dar lugar a
los diferentes hijos. Existen diversos m´etodos de cruce, pero
los m´as utilizados son los siguientes:
• Cruce basado en un punto: los dos individuos selec-
cionados para jugar el papel de padres, son recombinados
por medio de la selecci´on de un punto de corte, para
posteriormente intercambiar las secciones que se encuen-
tran a la derecha de dicho punto. Es decir, los genes del
padre1 a la izquierda del punto de corte forman parte del
hijo1 y los situados a la derecha formaran parte del hijo2,
mientras que con el padre2 suceder´a lo contrario.
Fig. 4. Ejemplo de cruce por un punto
• Cruce multipunto: en este tipo de cruce se selecciona
aleatoriamente la cantidad de puntos que se van a utilizar
para el cruce. De esta forma, y de manera an´aloga al
anterior cruce, se ir´an intercambiando los genes para
formar los dos nuevos hijos.
Fig. 5. Ejemplo de cruce multipunto de dos puntos
• Cruce Uniforme:Se utiliza una m´ascara de cruce gener-
ada aleatoriamente.
Fig. 6. Ejemplo de cruce uniforme
4) Mutaci´on: La mutaci´on se considera un operador
b´asico, que proporciona un peque˜no elemento de aleatoriedad
en los individuos de la poblaci´on. Si bien se admite que el
operador de cruce es el responsable de efectuar la b´usqueda
a lo largo del espacio de posibles soluciones, el operador
de mutaci´on es el responsable del aumento o reducci´on del
espacio de b´usqueda dentro del algoritmo gen´etico y del
fomento de la variabilidad gen´etica de los individuos de la
poblaci´on. Existen varios m´etodos para aplicar la mutaci´on
a los individuos de una poblaci´on, pero el m´as com´unmente
utilizado es el de mutar un porcentaje de los genes totales de
la poblaci´on.
Este porcentaje de genes a mutar se puede seleccionar de dos
maneras:
• Forma fija.- Especificando el mismo porcentaje de mu-
taci´on a todas las generaciones del algoritmo gen´etico.
• Forma variable.- Modificando el porcentaje de mutaci´on
de una generaci´on a otra, por ejemplo reduci´endolo.
De esta manera, se consigue hacer una b´usqueda m´as amplia
y global al principio e ir reduci´endola en las siguientes
generaciones.
Fig. 7. Ejemplo de mutaci´on
III. APLICACI ´ON DE ALGORITMOS GEN ´ETICOS EN JAVA
A. Interfaz gr´afica
La Interfaz gr´afica queda de la siguiente manera:
Fig. 8. Interfaz ”Pron´ostico de ganadores mundial 2014”
4
B. C´odigo en Java
El siguiente c´odigo esta hecho con java, utilizando la libreria
JGpa.
Clase EquiposFitnessFunction:
1 public c l a s s E q u i p o s F i t n e s s F u n c t i o n extends
F i t n e s s F u n c t i o n {
2
3 L i s t equipos = new A r r a y L i s t ( ) ;
4 L i s t ranking = new A r r a y L i s t ( ) ;
5
6 public E q u i p o s F i t n e s s F u n c t i o n ( L i s t equipos , L i s t
ranking ) {
7 t h i s . equipos = equipos ;
8 t h i s . ranking = ranking ;
9 }
10
11 @Override
12 protected double e v a l u a t e ( IChromosome chromosome
) {
13 double score = 0;
14 double imdbScore = 0;
15
16 L i s t dups = new A r r a y L i s t ( ) ;
17 i n t badSolution = 1;
18
19 for ( i n t i = 0; i < chromosome . s i z e ( ) ; i ++)
{
20
21 IntegerGene agene = ( IntegerGene )
chromosome . getGene ( i ) ;
22 i n t index = ( I n t e g e r ) chromosome . getGene
( i ) . g e t A l l e l e ( ) ;
23 / / para ver que equpio pasa y cual noo van l o s
valore o b t e n i d o s numcopas ranking f i f a
24 i f ( dups . c o n t a i n s ( index ) ) {
25 badSolution = 0;
26 } e l s e {
27 dups . add ( index ) ;
28 }
29
30 Equipos equipo = ( Equipos ) equipos . get (
index ) ;
31 double genreScore = getGenreScore ( equipo
) ;
32 i f ( genreScore == 0) {
33 badSolution = 0;
34 }
35 score = ( score + I n t e g e r . p a r s e I n t ( equipo
. g e t P a r t i d o 1 ( ) ) + I n t e g e r . p a r s e I n t (
equipo . g e t P a r t i d o 2 ( ) ) ) +
I n t e g e r .
p a r s e I n t ( equipo . g e t P a r t i d o 3 ( ) ) + (
genreScore ) ;
36
37 }
38 return ( score ∗ badSolution ) ;
39 }
40
41 private i n t getGenreScore ( Equipos equipo ) {
42 i n t copas = 0;
43 i n t contadorR = 0;
44 i n t t o t a l = 0;
45
46 i f ( ( I n t e g e r . p a r s e I n t ( equipo . getNumCopas ( ) ) )
> 0) {
47 copas = I n t e g e r . p a r s e I n t ( equipo .
getNumCopas ( ) ) ∗ 2;
48 / / }
49 }
50 / / ranking 1 − 10 = 12
51 / / ranking 11 − 20 = 10
52 / / ranking 21 − 30 = 8
53 / / ranking 31 − 40 = 6
54 / / ranking 41 − 50 = 4
55 / / ranking 51 − 60 = 2
56
57 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) )
>= 1) && ( ( I n t e g e r . p a r s e I n t ( equipo .
getRanking ( ) ) ) <=10) ) {
58 contadorR = contadorR + 12;
59
60 }
61
62 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) )
>= 11) && ( ( I n t e g e r . p a r s e I n t ( equipo .
getRanking ( ) ) <=20) ) ) {
63 contadorR = contadorR + 10;
64 }
65
66 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) )
>= 21) && ( ( I n t e g e r . p a r s e I n t ( equipo .
getRanking ( ) ) ) <=30) ) {
67 contadorR = contadorR + 8;
68 }
69
70 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) )
>= 31) && ( ( I n t e g e r . p a r s e I n t ( equipo .
getRanking ( ) ) ) <=40) ) {
71 contadorR = contadorR + 6;
72 }
73
74 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) )
>= 41) && ( ( I n t e g e r . p a r s e I n t ( equipo .
getRanking ( ) ) ) <=50) ) {
75 contadorR = contadorR + 4;
76 }
77
78 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) )
>= 51) && ( ( I n t e g e r . p a r s e I n t ( equipo .
getRanking ( ) ) ) <=60) ) {
79 contadorR = contadorR + 2;
80 }
81
82 t o t a l = I n t e g e r . p a r s e I n t ( equipo . getNumCopas
( ) ) + contadorR ;
83
84 return t o t a l ;
85 }
86 }
Clase TestEquiposFitness:
1 public c l a s s T e s t E q u i p o s F i t n e s s {
2
3 private C o n f i g u r a t i o n conf ;
4 private SwappingMutationOperator swapper ;
5 private E q u i p o s F i t n e s s F u n c t i o n f i t n e s s F u n c t i o n =
null ;
6 public L i s t equipos = new A r r a y L i s t ( ) ;
7 public L i s t ranking = new A r r a y L i s t ( ) ;
8 public List <Equipos> eq02 = new ArrayList <>() ;
9
10 public List <Equipos> eq04 ( ) {
11 return eq02 ;
12 }
13 private s t a t i c f i n a l i n t MAX ALLOWED EVOLUTIONS
= 1000;
14 private Chromosome equipoChromosome = null ;
15 public S t r i n g f i t n e s s 0 1 ;
16 public S t r i n g pequipos01 = ” ” ;
17 public S t r i n g valor1 = ” ” ;
18 public S t r i n g valor2 = ” ” ;
19 public S t r i n g valor3 = ” ” ;
20
21 public void i n i t i a l i z e ( S t r i n g tipoEquipo ) throws
Exception {
22 S t r i n g T o k e n i z e r s t = new S t r i n g T o k e n i z e r (
tipoEquipo ) ;
23
24 while ( s t . hasMoreElements ( ) ) {
25 S t r i n g genre = s t . nextToken ( ) ;
26 ranking . add ( genre ) ;
5
27 }
28
29 equipos = t h i s . cargarEquipos ( ) ;
30
31 conf = new D e f a u l t C o n f i g u r a t i o n ( ) ;
32 C o n f i g u r a t i o n . r e s e t P r o p e r t y ( C o n f i g u r a t i o n .
PROPERTY FITEVAL INST) ;
33 conf . s e t F i t n e s s E v a l u a t o r ( new
D e f a u l t F i t n e s s E v a l u a t o r ( ) ) ;
34 conf . g e t G e n e t i c O p e r a t o r s ( ) . c l e a r ( ) ;
35
36 swapper = new SwappingMutationOperator ( conf ) ;
37 conf . addGeneticOperator ( swapper ) ;
38 conf . s e t P r e s e r v F i t t e s t I n d i v i d u a l ( true ) ;
39 conf . s e t P o p u l a t i o n S i z e (1000) ;
40 conf . s e t K e e p P o p u l a t i o n S i z e C o n s t a n t ( f a l s e ) ;
41
42 f i t n e s s F u n c t i o n = new E q u i p o s F i t n e s s F u n c t i o n (
equipos , ranking ) ;
43
44 conf . s e t F i t n e s s F u n c t i o n ( f i t n e s s F u n c t i o n ) ;
45
46 / / cuatro s e l e c c i o n a d o s para e l mundial
47
48 Gene [ ] equiposGenes = new Gene [ 4 ] ;
49
50
51 equiposGenes [ 0 ] = new IntegerGene ( conf , 0 ,
equipos . s i z e ( ) − 1) ;
52 equiposGenes [ 1 ] = new IntegerGene ( conf , 0 ,
equipos . s i z e ( ) − 1) ;
53 equiposGenes [ 2 ] = new IntegerGene ( conf , 0 ,
equipos . s i z e ( ) − 1) ;
54 equiposGenes [ 3 ] = new IntegerGene ( conf , 0 ,
equipos . s i z e ( ) − 1) ;
55
56 equipoChromosome = new Chromosome ( conf ,
equiposGenes ) ;
57 equiposGenes [ 0 ] . s e t A l l e l e ( new I n t e g e r ( 0 ) ) ;
58 equiposGenes [ 1 ] . s e t A l l e l e ( new I n t e g e r ( 1 ) ) ;
59 equiposGenes [ 2 ] . s e t A l l e l e ( new I n t e g e r ( 2 ) ) ;
60 equiposGenes [ 3 ] . s e t A l l e l e ( new I n t e g e r ( 3 ) ) ;
61
62 conf . setSampleChromosome ( equipoChromosome ) ;
63 }
64 private L i s t cargarEquipos ( ) {
65
66 List <Equipos> l = new ArrayList <Equipos >() ;
67 LeerArchivos ac = new LeerArchivos ( ) ;
68
69 try {
70 ac . l e e r d a t o s ( ) ;
71 for ( i n t i = 0; i < 32; i ++) {
72 l . add ( ac . p a i s e s . get ( i ) ) ;
73 }
74
75
76 } catch ( FileNotFoundException ex ) {
77 / / Logger . getLogger ( CrearGenotype . c l a s s .
getName ( ) ) . log ( Level . SEVERE , null ,
ex ) ;
78 }
79 return l ;
80
81 }
82
83 public void t e s t S e l e c t F i t t e s t E q u i p o s ( ) throws
Exception {
84
85 equipos = t h i s . cargarEquipos ( ) ;
86
87 Genotype p o p u l a t i o n = Genotype .
randomInitialGenotype ( conf ) ;
88
89 IChromosome b e s t S o l u t i o n S o F a r =
equipoChromosome ;
90
91 for ( i n t i = 0; i < MAX ALLOWED EVOLUTIONS;
i ++) {
92 p o p u l a t i o n . evolve ( ) ;
93 IChromosome c a n d i d a t e B e s t S o l u t i o n =
p o p u l a t i o n . getFittestChromosome ( ) ;
94
95 i f ( c a n d i d a t e B e s t S o l u t i o n .
g e t F i t n e s s V a l u e ( ) >
b e s t S o l u t i o n S o F a r . g e t F i t n e s s V a l u e ( ) )
{
96 b e s t S o l u t i o n S o F a r =
c a n d i d a t e B e s t S o l u t i o n ;
97
98 }
99 }
100 p r i n t S o l u t i o n ( bestSolutionSoFar , equipos ) ;
101 valor1 = valor1 + b e s t S o l u t i o n S o F a r ;
102
103 }
104
105 public void p r i n t S o l u t i o n ( IChromosome s o l u t i o n ,
L i s t equipos ) {
106
107 f i t n e s s 0 1 = S t r i n g . valueOf ( s o l u t i o n .
g e t F i t n e s s V a l u e ( ) ) ;
108 System . out . p r i n t l n ( s o l u t i o n . s i z e ( ) ) ;
109
110 for ( i n t i = 0; i < s o l u t i o n . s i z e ( ) ; i ++) {
111 i n t index = ( I n t e g e r ) s o l u t i o n . getGene ( i
) . g e t A l l e l e ( ) ;
112 Equipos equipo02 = ( Equipos ) equipos . get
( index ) ;
113 eq02 . add ( equipo02 ) ;
114 / / System . out . p r i n t l n ( equipo02 . t o S t r i n g ( )
) ;
115 pequipos01 = pequipos01 +equipo02 .
t o S t r i n g ( ) ;
116 }
117 System . out . p r i n t l n ( ”n =========” ) ;
118 }
119 }
Bot´on Realizar Pron´ostico:
1 private void jButton1MouseClicked ( java . awt . event .
MouseEvent evt ) {
2 / / TODO add your handling code here :
3 try {
4 T e s t E q u i p o s F i t n e s s t e s t = new T e s t E q u i p o s F i t n e s s
( ) ;
5 t e s t . i n i t i a l i z e ( ” ” ) ;
6 t e s t . t e s t S e l e c t F i t t e s t E q u i p o s ( ) ;
7 S t r i n g r e s u l t a d o = ”Nombre tRanking tGrupo
tNumCopas t P a r t i d o 1 t P a r t i d o 2 t P a r t i d o 3 nn
” ;
8 t x t F i t 0 1 . s e t T e x t ( t e s t . f i t n e s s 0 1 ) ;
9 t x t g a n a d o r e s 0 1 . s e t T e x t ( r e s u l t a d o + t e s t .
pequipos01 ) ;
10 t x t c o n s o l a . s e t T e x t ( ” F i t n e s s : ” + t e s t . f i t n e s s 0 1 +
”nMejor s o l u c i n : ” + t e s t . valor1 + ”
nEquipos Mejores
11 p o s i c i o n a d o s : n” + t e s t . pequipos01 ) ;
12
13 } catch ( Exception ex ) {
14
15 ex . p r i n t S t a c k T r a c e ( ) ;
16 }
17 C o n f i g u r a t i o n . r e s e t ( ) ;
18 p a r t i d o s . equipos . c l e a r ( ) ;
19 }
Bot´on Guardar Cambio:
1 private void btnguardarActionPerformed ( java . awt .
event . ActionEvent evt ) {
2
3 Equipos e q u i p o a e d i t a r = new Equipos ( ) ;
6
4
5 e q u i p o a e d i t a r . setNombre ( tfnombre . getText ( ) ) ;
6 e q u i p o a e d i t a r . setRanking ( t f r a n k i n g . getText ( ) ) ;
7 e q u i p o a e d i t a r . setGrupo ( t f g r u p o . getText ( ) ) ;
8 e q u i p o a e d i t a r . setNumCopas ( t f c o p a s . getText ( ) ) ;
9 e q u i p o a e d i t a r . s e t P a r t i d o 1 ( t f 0 1 . getText ( ) ) ;
10 e q u i p o a e d i t a r . s e t P a r t i d o 2 ( t f 0 2 . getText ( ) ) ;
11 e q u i p o a e d i t a r . s e t P a r t i d o 3 ( t f 0 3 . getText ( ) ) ;
12
13 F i l e archivoEquipos = new F i l e ( System .
g e t P r o p e r t y ( ” user . d i r ” ) + ” / s r c / a r c h i v o s /
Mundial . csv ” ) ;
14
15 / / actualizamos v a l o r e s nuevos
16 i n t a = l i s t E q u i p o s . g e t S e l e c t e d I n d e x ( ) ;
17 System . out . p r i n t l n ( ”AAAAAA ” + a ) ;
18 equipos . s e t ( a , e q u i p o a e d i t a r ) ;
19
20 try {
21 F i l e W r i t e r w = new F i l e W r i t e r (
archivoEquipos ) ;
22 BufferedWriter bw = new BufferedWriter (w) ;
23 P r i n t W r i t e r wr = new P r i n t W r i t e r (bw) ;
24 System . out . p r i n t l n ( ”TOTAL EQUIPO ” + equipos .
s i z e ( ) ) ;
25 for ( i n t i = 0; i < equipos . s i z e ( ) ; i ++) {
26 / / en caso de ser la ultima l i n e a no agregar
s a l t o de l i n e a
27 i f ( i == ( equipos . s i z e ( ) − 1) ) {
28 System . out . p r i n t l n ( ”−−−−−−−−−− EQUIPO ”
+ i + ” SI ” + equipos . get ( i ) .
getNombre ( ) ) ;
29 wr . w r i t e ( equipos . get ( i ) . getNombre ( ) + ” ,
”
30 + equipos . get ( i ) . getRanking ( ) + ” , ”
31 + equipos . get ( i ) . getGrupo ( ) + ” , ”
32 + equipos . get ( i ) . getNumCopas ( ) + ” , ”
33 + equipos . get ( i ) . g e t P a r t i d o 1 ( )
34 + ” , ” + equipos . get ( i ) . g e t P a r t i d o 2 ( )
35 + ” , ” + equipos . get ( i ) . g e t P a r t i d o 3 ( )
) ;
36
37 } e l s e {
38 System . out . p r i n t l n ( ”−−−−−−−−−− EQUIPO ”
+ i + ” NO ” + equipos . get ( i ) .
getNombre ( ) ) ;
39
40 wr . w r i t e ( equipos . get ( i ) . getNombre ( )
+ ” , ”
41 + equipos . get ( i ) . getRanking ( ) + ” , ”
42 + equipos . get ( i ) . getGrupo ( ) + ” , ”
43 + equipos . get ( i ) . getNumCopas ( ) + ” ,
”
44 + equipos . get ( i ) . g e t P a r t i d o 1 ( )
45 + ” , ” + equipos . get ( i ) . g e t P a r t i d o 2
( )
46 + ” , ” + equipos . get ( i ) . g e t P a r t i d o 3
( )
47 + ”n” ) ;
48 }
49 }
50 wr . c l o s e ( ) ;
51 bw . c l o s e ( ) ;
52
53 } catch ( IOException e ) {
54 e . p r i n t S t a c k T r a c e ( ) ;
55 }
56
57 / / TODO add your handling code here :
58 }
El c´odigo realizado se encuentra en: https://github.com/
byrvin17/MundialAG
REFERENCIAS
[1] G. Herrera, E. Carri´on,Una soluci´on no simetrica aplicando un
algoritmo gen´etico con cruzamiento natural para la optimizaci´on
estructural de armaduras, UNAM. [En l´ınea] http://www.ingenieria.
unam.mx/∼revistafi/ejemplares/V13N3/V13N3 art07.pdf ,consulta
realizada 21-May-14.
[2] J. L´opez., Un algoritmo gen´etico con codificaci´on real para la evoluci´on
de transformaciones lineales,Universidad Carlos III de Madrid. [En
l´ınea] http://e-archivo.uc3m.es/bitstream/handle/10016/10214/PFC
JOSE CARLOS LOPEZ DIAZ.pdf?sequence=1 ,consulta realizada
21-May-14.
[3] Algoritmos Gen´eticos ,Curso de Postgrado-Universidad Carlos III de
Madrid [En l´ınea] http://www.exa.unicen.edu.ar/escuelapav/cursos/bio/l3.
pdf ,consulta realizada 22-May-14.
[4] J. Arranz, A.Parra, Algoritmos Gen´eticos,Universidad Carlos III de
Madrid [En l´ınea] http://www.it.uc3m.es/jvillena/irc/practicas/06-07/05.
pdf ,consulta realizada 22-May-14.
[5] A. Andaluz., Inteligencia en Redes de Comunicaciones, Universidad
Carlos III de Madrid. [En l´ınea] http://www.it.uc3m.es/jvillena/irc/
practicas/estudios/aeag.pdf ,consulta realizada 22-May-14.
Gabriela Rodr´ıguez
Estudiante de la Carrera de Ingenier´ıa en Sistemas de la
Universidad Nacional de Loja, conocedora de Redes y Telecomuni-
caciones, Provincia de Loja, Ciudad Loja, Ecuador, 2014.
Byron Lima
Estudiante de la Carrera de Ingenier´ıa en Sistemas de la
Universidad Nacional de Loja, Conocedor de An´alisis y dise˜no de
Sistemas, Redes y Telecomunicaciones, Provincia de Loja, Ciudad
Loja, Ecuador, 2014.
Henry Paz Arias
Ing. Mgs. Especialista en Inteligencia Artificial, Provincia
de Loja, Ciudad Loja, Ecuador, 2014.

Algoritmos Genéticos_Inteligencia Artificial

  • 1.
    1 Algoritmos gen´eticos aplicadosen la predicci´on del mundial 2014 G. Rodr´ıguez, B. Lima, Tutor: H. Paz. Abstract—In this paper we consider the genetic algorithms, since its inception in 1950, also includes the application thereof to the prediction of the four best teams world in football 2014, using the library JGAP. Index Terms—chromosome, gene, crossover, mutation, fitness function. I. INTRODUCCI ´ON Los algoritmos gen´eticos son m´etodos adaptativos, generalmente usados en problemas de b´usqueda y optimizaci´on de par´ametros, basados en la reproducci´on y el principio de supervivencia del mas apto. Mas formalmente, y siguiendo una definici´on de Goldberg, ”Los Algoritmos Gen´eticos son algoritmos de b´usqueda basados en la mec´anica de selecci´on natural y de la gen´etica natural. Combinan la supervivencia del mas apto entre estructuras de secuencias con un intercambio de informaci´on estructurado, aunque aleatorizado, para constituir as´ı un algoritmo de b´usqueda que tenga algo de genialidades de las b´usquedas humanas” Para alcanzar la soluci´on a un problema se parte de un conjunto inicial de individuo, llamado poblaci´on, generado de manera aleatoria. Cada uno de estos individuos representa una posible soluci´on al problema. Estos individuos evolucionan tomando como base los esquemas propuestos por Darwin, sobre la selecci´on natural, y se adaptaran en mayor medida tras el paso de cada generaci´on a la soluci´on requerida. [1]. II. ALGORITMOS GEN ´ETICOS A. Historia de los algoritmos gen´eticos La primera menci´on del t´ermino, y la primera publicaci´on sobre una aplicaci´on del mismo, se deben a Bagley (1967), que dise˜n´o algoritmos gen´eticos para buscar conjuntos de par´ametros en funciones de evaluaci´on de juegos, y los com- par´o con los algoritmos de correlaci´on, procedimientos de aprendizaje modelizados despu´es de los algoritmos de pesos variantes de ese periodo. Pero es otro cient´ıfico el considerado creador de los Algoritmos Gen´eticos: John Holland, que los desarroll´o, junto a sus alumnos y colegas, durante las d´ecadas de 1960 y 1970. En contraste con las estrategias evolutivas y la programaci´on evolutiva, el prop´osito original G. Rodr´ıguez, UNL, Loja, Ecuador, E-mail: gmrodriguezp@unl.edu.ec B. Lima, UNL, Loja, Ecuador, E-mail: bvlimar@unl.edu.ec H. Paz, UNL, Loja, Ecuador, E-mail: hpaz@unl.edu.ec de Holland no era dise˜nar algoritmos para resolver problemas concretos, sino estudiar, de un modo formal, el fen´omeno de la adaptaci´on tal y como ocurre en la naturaleza, y desarrollar v´ıas de extrapolar esos mecanismos de adaptaci´on natural a los sistemas computacionales. El libro que Holland escribi´o en 1975 Adaptaci´on en Sistemas Naturales y Artificiales presentaba el algoritmo gen´etico como una abstracci´on de la evoluci´on biol´ogica, y proporcionaba el entramado te´orico para la adaptaci´on bajo el algoritmo gen´etico. El Algoritmo Gen´etico de Holland era un m´etodo para desplazarse, de una poblaci´on de cromosomas (bits) a una nueva poblaci´on, utilizando un sistema similar a la “selecci´on natural” junto con los operadores de cruces, mutaciones e inversi´on inspirados en la gen´etica. En este primitivo algoritmo, cada cromosoma consta de genes (bits), y cada uno de ellos es una muestra de un alelo particular (0 o 1). El operador de selecci´on escoge, entre los cromosomas de la poblaci´on, aquellos con capacidad de reproducci´on, y entre ´estos, los que sean m´as “compatibles”, producir´an m´as descendencia que el resto. El de cruce extrae partes de dos cromosomas, imitando la com- binaci´on1 biol´ogica de dos cromosomas aislados (gametos). La mutaci´on se encarga de cambiar, de modo aleatorio, los valores del alelo en algunas localizaciones del cromosoma; y, por ´ultimo, la inversi´on, invierte el orden de una secci´on contigua del cromosoma , recolocando por tanto el orden en el que se almacenan los genes. La mayor innovaci´on de Holland fue la de introducir un algoritmo basado en poblaciones con cruces, mutaciones e inversiones2 Es m´as, Holland fue el primero en intentar colocar la computaci´on evolutiva sobre una base te´orica firme (Holland, 1975). Hasta hace poco, esta base te´orica, fundamentada en la noci´on de “esquemas”, fue la estructura sobre la que se edificaron la mayor´ıa de los trabajos te´oricos sobre algoritmos gen´eticos en las d´ecadas siguientes. En estos ´ultimos a˜nos se ha generado una amplia interacci´on entre los investigadores de varios m´etodos de com- putaci´on evolutiva, rompi´endose las fronteras entre algoritmos gen´eticos, estrategias evolutivas y programaci´on evolutiva. Como consecuencia, en la actualidad, el t´ermino “algoritmo gen´etico” se utiliza para designar un concepto mucho m´as amplio del que concibi´o Holland.[2] B. Principales caracter´ısticas de los algoritmos gen´eticos • Son algoritmos estoc´asticos. Dos ejecuciones distintas pueden dar dos soluciones distintas. • Son algoritmos de b´usqueda m´ultiple, luego dan varias soluciones. Realizan la b´usqueda mediante toda una gen- eraci´on objetos, no buscan un ´unico elemento.
  • 2.
    2 • Es unab´usqueda param´etricamente robusta. Por lo tanto, tiende a converger a medida que se realizan las genera- ciones. • No trabajan directamente con los objetos, sino con la codificaci´on de esos objetos, que pueden ser un n´umero, un conjunto de par´ametros, etc. A esta codificaci´on la llamamos cromosoma. • Utilizan una funci´on objetivo que da la informaci´on de lo adaptados que est´an los individuos, y no las derivadas u otra informaci´on auxiliar. • Las reglas de transici´on son probabil´ısticas, no deter- min´ısticas. • Los mecanismos de los algoritmos gen´eticos simples son sorprendentemente f´aciles, dado que los mecanismos que utiliza son el mecanismo de copia y el de intercambio de partes de las cadenas de cromosomas.[2] C. Representaci´on Todos los organismos vivos est´an constituidos por c´elulas, y cada c´elula contiene uno o m´as cromosomas. Un cromosoma puede ser conceptualmente dividido en genes cada uno de los cuales codifica una prote´ına. En t´erminos generales, se puede decir que cada gen se codifica como si fuera un rasgo especifico. Cada gen se encuentra en una posici´on particular del cromosoma, y est´a formado por alelos. [3] Fig. 1. Cromosoma Se supone que los individuos (posibles soluciones del prob- lema), pueden representarse como un conjunto de par´ametros (que denominaremos genes), los cuales agrupados forman una ristra de valores, a menudo referida como cromosoma. Fig. 2. Cromosoma de representaci´on binaria D. Algoritmo Desarrollado por John H. Holland [Holland, 1975], el al- goritmo gen´etico opera entonces a nivel de genotipo de las soluciones mediante la siguiente secuencia: 1) Comenzar con una poblaci´on inicial, la cual puede ser generada de manera aleatoria. 2) Calcular el fitness (aptitud) de cada individuo. 3) Aplicar el operador de selecci´on con base en el fitness de la poblaci´on. 4) Aplicar los operadores gen´eticos de reproducci´on, cruce y mutaci´on a la poblaci´on actual para generar a la poblaci´on de la siguiente generaci´on. 5) Ir al paso 2 hasta que la condici´on de parada se satisfaga. 6) Cuando se cumple la condici´on de parada, se devuelve al mejor individuo encontrado (bien el mejor de todas las generaciones, bien el mejor de la ´ultima generaci´on).[4] Fig. 3. Algoritmo de John H. Holland E. Funci´on de evaluaci´on y Funci´on de aptitud(fitness) La funci´on de evaluaci´on generalmente es la funci´on objetivo, es decir, es lo que se quiere llegar a optimizar. Es necesario decodificar la soluci´on presente en el cromosoma para evaluarla. La funci´on de aptitud (fitness) es la que permite valorar la aptitud de los individuos y debe tomar siempre valores positivos. Ambas funciones suelen ser iguales, pero puede ser que la funci´on objetivo sea muy compleja, tome valores negativos, o no proporcione un valor num´erico y, por lo tanto, sea necesario definir una funci´on de aptitud diferente. F. Operadores Gen´eticos En su forma m´as simple, un algoritmo gen´etico consta de los siguientes operadores gen´eticos: selecci´on, reproducci´on, cruce (crossover) y mutaci´on. [5] 1) Selecci´on: El proceso de selecci´on sirve para escoger a los individuos de la poblaci´on mejor adaptados, para que act´uen de progenitores de la siguiente generaci´on. En la naturaleza existen varios factores que intervienen para que un individuo pueda tener descendencia: • Consiga sobrevivir, ya sea porque no es devorado por depredadores, o porque sea capaz de procurarse alimento. • Encuentre pareja para reproducirse. • El ´ultimo factor es que la combinaci´on de ambos indi- viduos sea apta para crear un nuevo individuo. Sin embargo, en la realidad es posible que “el mejor” individuo no pueda reproducirse,pero otro individuo de “peor calidad” pueda conseguirlo. Aunque este hecho es menos probable, sigue siendo posible. En los algoritmos gen´eticos, la selecci´on es un conjunto de reglas que sirven para elegir a los progenitores de la siguiente generaci´on. Estos progenitores se reproducir´an (cruzamiento gen´etico) y generar´an descendencia. Un sistema muy utilizado en los algoritmos gen´eticos es la selecci´on por torneo (la utilizada para este proyecto). Este
  • 3.
    3 sistema consiste enescoger aleatoriamente de la poblaci´on un cierto n´umero de individuos. De esos individuos se escoge el mejor de todos para ser el padre. Para escoger la madre se repite el proceso: se escoge aleatoriamente a un n´umero de individuos de la poblaci´on y se elige al individuo con mejor calidad. Este sistema garantiza un m´ınimo de diversidad, ya que no siempre se elegir´a al mejor individuo de la poblaci´on para tener descendencia. 2) Reproducci´on: En este contexto, se entender´a por “reproducci´on” la clonaci´on de un individuo. Es decir, un individuo pasar´a a la siguiente generaci´on sin modificaci´on. De esta manera, la reproducci´on es un operador gen´etico que se contrapone al cruce y la mutaci´on, puesto que estos ´ultimos modifican los individuos que pasan a la siguiente generaci´on. El objetivo de la reproducci´on es mantener en la siguiente generaci´on a individuos con fitness alta de la presente generaci´on. Relacionado con el concepto de reproducci´on est´a el de “elitismo”, el cual mantiene a los mejores individuos de una generaci´on a la siguiente, para que no se pierda su informaci´on. 3) Cruce: Durante esta fase se cruzan o mezclan los individuos seleccionados en la fase anterior.Es decir, los genes de los dos padres se mezclan entre s´ı para dar lugar a los diferentes hijos. Existen diversos m´etodos de cruce, pero los m´as utilizados son los siguientes: • Cruce basado en un punto: los dos individuos selec- cionados para jugar el papel de padres, son recombinados por medio de la selecci´on de un punto de corte, para posteriormente intercambiar las secciones que se encuen- tran a la derecha de dicho punto. Es decir, los genes del padre1 a la izquierda del punto de corte forman parte del hijo1 y los situados a la derecha formaran parte del hijo2, mientras que con el padre2 suceder´a lo contrario. Fig. 4. Ejemplo de cruce por un punto • Cruce multipunto: en este tipo de cruce se selecciona aleatoriamente la cantidad de puntos que se van a utilizar para el cruce. De esta forma, y de manera an´aloga al anterior cruce, se ir´an intercambiando los genes para formar los dos nuevos hijos. Fig. 5. Ejemplo de cruce multipunto de dos puntos • Cruce Uniforme:Se utiliza una m´ascara de cruce gener- ada aleatoriamente. Fig. 6. Ejemplo de cruce uniforme 4) Mutaci´on: La mutaci´on se considera un operador b´asico, que proporciona un peque˜no elemento de aleatoriedad en los individuos de la poblaci´on. Si bien se admite que el operador de cruce es el responsable de efectuar la b´usqueda a lo largo del espacio de posibles soluciones, el operador de mutaci´on es el responsable del aumento o reducci´on del espacio de b´usqueda dentro del algoritmo gen´etico y del fomento de la variabilidad gen´etica de los individuos de la poblaci´on. Existen varios m´etodos para aplicar la mutaci´on a los individuos de una poblaci´on, pero el m´as com´unmente utilizado es el de mutar un porcentaje de los genes totales de la poblaci´on. Este porcentaje de genes a mutar se puede seleccionar de dos maneras: • Forma fija.- Especificando el mismo porcentaje de mu- taci´on a todas las generaciones del algoritmo gen´etico. • Forma variable.- Modificando el porcentaje de mutaci´on de una generaci´on a otra, por ejemplo reduci´endolo. De esta manera, se consigue hacer una b´usqueda m´as amplia y global al principio e ir reduci´endola en las siguientes generaciones. Fig. 7. Ejemplo de mutaci´on III. APLICACI ´ON DE ALGORITMOS GEN ´ETICOS EN JAVA A. Interfaz gr´afica La Interfaz gr´afica queda de la siguiente manera: Fig. 8. Interfaz ”Pron´ostico de ganadores mundial 2014”
  • 4.
    4 B. C´odigo enJava El siguiente c´odigo esta hecho con java, utilizando la libreria JGpa. Clase EquiposFitnessFunction: 1 public c l a s s E q u i p o s F i t n e s s F u n c t i o n extends F i t n e s s F u n c t i o n { 2 3 L i s t equipos = new A r r a y L i s t ( ) ; 4 L i s t ranking = new A r r a y L i s t ( ) ; 5 6 public E q u i p o s F i t n e s s F u n c t i o n ( L i s t equipos , L i s t ranking ) { 7 t h i s . equipos = equipos ; 8 t h i s . ranking = ranking ; 9 } 10 11 @Override 12 protected double e v a l u a t e ( IChromosome chromosome ) { 13 double score = 0; 14 double imdbScore = 0; 15 16 L i s t dups = new A r r a y L i s t ( ) ; 17 i n t badSolution = 1; 18 19 for ( i n t i = 0; i < chromosome . s i z e ( ) ; i ++) { 20 21 IntegerGene agene = ( IntegerGene ) chromosome . getGene ( i ) ; 22 i n t index = ( I n t e g e r ) chromosome . getGene ( i ) . g e t A l l e l e ( ) ; 23 / / para ver que equpio pasa y cual noo van l o s valore o b t e n i d o s numcopas ranking f i f a 24 i f ( dups . c o n t a i n s ( index ) ) { 25 badSolution = 0; 26 } e l s e { 27 dups . add ( index ) ; 28 } 29 30 Equipos equipo = ( Equipos ) equipos . get ( index ) ; 31 double genreScore = getGenreScore ( equipo ) ; 32 i f ( genreScore == 0) { 33 badSolution = 0; 34 } 35 score = ( score + I n t e g e r . p a r s e I n t ( equipo . g e t P a r t i d o 1 ( ) ) + I n t e g e r . p a r s e I n t ( equipo . g e t P a r t i d o 2 ( ) ) ) + I n t e g e r . p a r s e I n t ( equipo . g e t P a r t i d o 3 ( ) ) + ( genreScore ) ; 36 37 } 38 return ( score ∗ badSolution ) ; 39 } 40 41 private i n t getGenreScore ( Equipos equipo ) { 42 i n t copas = 0; 43 i n t contadorR = 0; 44 i n t t o t a l = 0; 45 46 i f ( ( I n t e g e r . p a r s e I n t ( equipo . getNumCopas ( ) ) ) > 0) { 47 copas = I n t e g e r . p a r s e I n t ( equipo . getNumCopas ( ) ) ∗ 2; 48 / / } 49 } 50 / / ranking 1 − 10 = 12 51 / / ranking 11 − 20 = 10 52 / / ranking 21 − 30 = 8 53 / / ranking 31 − 40 = 6 54 / / ranking 41 − 50 = 4 55 / / ranking 51 − 60 = 2 56 57 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) >= 1) && ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) <=10) ) { 58 contadorR = contadorR + 12; 59 60 } 61 62 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) >= 11) && ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) <=20) ) ) { 63 contadorR = contadorR + 10; 64 } 65 66 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) >= 21) && ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) <=30) ) { 67 contadorR = contadorR + 8; 68 } 69 70 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) >= 31) && ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) <=40) ) { 71 contadorR = contadorR + 6; 72 } 73 74 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) >= 41) && ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) <=50) ) { 75 contadorR = contadorR + 4; 76 } 77 78 i f ( ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) >= 51) && ( ( I n t e g e r . p a r s e I n t ( equipo . getRanking ( ) ) ) <=60) ) { 79 contadorR = contadorR + 2; 80 } 81 82 t o t a l = I n t e g e r . p a r s e I n t ( equipo . getNumCopas ( ) ) + contadorR ; 83 84 return t o t a l ; 85 } 86 } Clase TestEquiposFitness: 1 public c l a s s T e s t E q u i p o s F i t n e s s { 2 3 private C o n f i g u r a t i o n conf ; 4 private SwappingMutationOperator swapper ; 5 private E q u i p o s F i t n e s s F u n c t i o n f i t n e s s F u n c t i o n = null ; 6 public L i s t equipos = new A r r a y L i s t ( ) ; 7 public L i s t ranking = new A r r a y L i s t ( ) ; 8 public List <Equipos> eq02 = new ArrayList <>() ; 9 10 public List <Equipos> eq04 ( ) { 11 return eq02 ; 12 } 13 private s t a t i c f i n a l i n t MAX ALLOWED EVOLUTIONS = 1000; 14 private Chromosome equipoChromosome = null ; 15 public S t r i n g f i t n e s s 0 1 ; 16 public S t r i n g pequipos01 = ” ” ; 17 public S t r i n g valor1 = ” ” ; 18 public S t r i n g valor2 = ” ” ; 19 public S t r i n g valor3 = ” ” ; 20 21 public void i n i t i a l i z e ( S t r i n g tipoEquipo ) throws Exception { 22 S t r i n g T o k e n i z e r s t = new S t r i n g T o k e n i z e r ( tipoEquipo ) ; 23 24 while ( s t . hasMoreElements ( ) ) { 25 S t r i n g genre = s t . nextToken ( ) ; 26 ranking . add ( genre ) ;
  • 5.
    5 27 } 28 29 equipos= t h i s . cargarEquipos ( ) ; 30 31 conf = new D e f a u l t C o n f i g u r a t i o n ( ) ; 32 C o n f i g u r a t i o n . r e s e t P r o p e r t y ( C o n f i g u r a t i o n . PROPERTY FITEVAL INST) ; 33 conf . s e t F i t n e s s E v a l u a t o r ( new D e f a u l t F i t n e s s E v a l u a t o r ( ) ) ; 34 conf . g e t G e n e t i c O p e r a t o r s ( ) . c l e a r ( ) ; 35 36 swapper = new SwappingMutationOperator ( conf ) ; 37 conf . addGeneticOperator ( swapper ) ; 38 conf . s e t P r e s e r v F i t t e s t I n d i v i d u a l ( true ) ; 39 conf . s e t P o p u l a t i o n S i z e (1000) ; 40 conf . s e t K e e p P o p u l a t i o n S i z e C o n s t a n t ( f a l s e ) ; 41 42 f i t n e s s F u n c t i o n = new E q u i p o s F i t n e s s F u n c t i o n ( equipos , ranking ) ; 43 44 conf . s e t F i t n e s s F u n c t i o n ( f i t n e s s F u n c t i o n ) ; 45 46 / / cuatro s e l e c c i o n a d o s para e l mundial 47 48 Gene [ ] equiposGenes = new Gene [ 4 ] ; 49 50 51 equiposGenes [ 0 ] = new IntegerGene ( conf , 0 , equipos . s i z e ( ) − 1) ; 52 equiposGenes [ 1 ] = new IntegerGene ( conf , 0 , equipos . s i z e ( ) − 1) ; 53 equiposGenes [ 2 ] = new IntegerGene ( conf , 0 , equipos . s i z e ( ) − 1) ; 54 equiposGenes [ 3 ] = new IntegerGene ( conf , 0 , equipos . s i z e ( ) − 1) ; 55 56 equipoChromosome = new Chromosome ( conf , equiposGenes ) ; 57 equiposGenes [ 0 ] . s e t A l l e l e ( new I n t e g e r ( 0 ) ) ; 58 equiposGenes [ 1 ] . s e t A l l e l e ( new I n t e g e r ( 1 ) ) ; 59 equiposGenes [ 2 ] . s e t A l l e l e ( new I n t e g e r ( 2 ) ) ; 60 equiposGenes [ 3 ] . s e t A l l e l e ( new I n t e g e r ( 3 ) ) ; 61 62 conf . setSampleChromosome ( equipoChromosome ) ; 63 } 64 private L i s t cargarEquipos ( ) { 65 66 List <Equipos> l = new ArrayList <Equipos >() ; 67 LeerArchivos ac = new LeerArchivos ( ) ; 68 69 try { 70 ac . l e e r d a t o s ( ) ; 71 for ( i n t i = 0; i < 32; i ++) { 72 l . add ( ac . p a i s e s . get ( i ) ) ; 73 } 74 75 76 } catch ( FileNotFoundException ex ) { 77 / / Logger . getLogger ( CrearGenotype . c l a s s . getName ( ) ) . log ( Level . SEVERE , null , ex ) ; 78 } 79 return l ; 80 81 } 82 83 public void t e s t S e l e c t F i t t e s t E q u i p o s ( ) throws Exception { 84 85 equipos = t h i s . cargarEquipos ( ) ; 86 87 Genotype p o p u l a t i o n = Genotype . randomInitialGenotype ( conf ) ; 88 89 IChromosome b e s t S o l u t i o n S o F a r = equipoChromosome ; 90 91 for ( i n t i = 0; i < MAX ALLOWED EVOLUTIONS; i ++) { 92 p o p u l a t i o n . evolve ( ) ; 93 IChromosome c a n d i d a t e B e s t S o l u t i o n = p o p u l a t i o n . getFittestChromosome ( ) ; 94 95 i f ( c a n d i d a t e B e s t S o l u t i o n . g e t F i t n e s s V a l u e ( ) > b e s t S o l u t i o n S o F a r . g e t F i t n e s s V a l u e ( ) ) { 96 b e s t S o l u t i o n S o F a r = c a n d i d a t e B e s t S o l u t i o n ; 97 98 } 99 } 100 p r i n t S o l u t i o n ( bestSolutionSoFar , equipos ) ; 101 valor1 = valor1 + b e s t S o l u t i o n S o F a r ; 102 103 } 104 105 public void p r i n t S o l u t i o n ( IChromosome s o l u t i o n , L i s t equipos ) { 106 107 f i t n e s s 0 1 = S t r i n g . valueOf ( s o l u t i o n . g e t F i t n e s s V a l u e ( ) ) ; 108 System . out . p r i n t l n ( s o l u t i o n . s i z e ( ) ) ; 109 110 for ( i n t i = 0; i < s o l u t i o n . s i z e ( ) ; i ++) { 111 i n t index = ( I n t e g e r ) s o l u t i o n . getGene ( i ) . g e t A l l e l e ( ) ; 112 Equipos equipo02 = ( Equipos ) equipos . get ( index ) ; 113 eq02 . add ( equipo02 ) ; 114 / / System . out . p r i n t l n ( equipo02 . t o S t r i n g ( ) ) ; 115 pequipos01 = pequipos01 +equipo02 . t o S t r i n g ( ) ; 116 } 117 System . out . p r i n t l n ( ”n =========” ) ; 118 } 119 } Bot´on Realizar Pron´ostico: 1 private void jButton1MouseClicked ( java . awt . event . MouseEvent evt ) { 2 / / TODO add your handling code here : 3 try { 4 T e s t E q u i p o s F i t n e s s t e s t = new T e s t E q u i p o s F i t n e s s ( ) ; 5 t e s t . i n i t i a l i z e ( ” ” ) ; 6 t e s t . t e s t S e l e c t F i t t e s t E q u i p o s ( ) ; 7 S t r i n g r e s u l t a d o = ”Nombre tRanking tGrupo tNumCopas t P a r t i d o 1 t P a r t i d o 2 t P a r t i d o 3 nn ” ; 8 t x t F i t 0 1 . s e t T e x t ( t e s t . f i t n e s s 0 1 ) ; 9 t x t g a n a d o r e s 0 1 . s e t T e x t ( r e s u l t a d o + t e s t . pequipos01 ) ; 10 t x t c o n s o l a . s e t T e x t ( ” F i t n e s s : ” + t e s t . f i t n e s s 0 1 + ”nMejor s o l u c i n : ” + t e s t . valor1 + ” nEquipos Mejores 11 p o s i c i o n a d o s : n” + t e s t . pequipos01 ) ; 12 13 } catch ( Exception ex ) { 14 15 ex . p r i n t S t a c k T r a c e ( ) ; 16 } 17 C o n f i g u r a t i o n . r e s e t ( ) ; 18 p a r t i d o s . equipos . c l e a r ( ) ; 19 } Bot´on Guardar Cambio: 1 private void btnguardarActionPerformed ( java . awt . event . ActionEvent evt ) { 2 3 Equipos e q u i p o a e d i t a r = new Equipos ( ) ;
  • 6.
    6 4 5 e qu i p o a e d i t a r . setNombre ( tfnombre . getText ( ) ) ; 6 e q u i p o a e d i t a r . setRanking ( t f r a n k i n g . getText ( ) ) ; 7 e q u i p o a e d i t a r . setGrupo ( t f g r u p o . getText ( ) ) ; 8 e q u i p o a e d i t a r . setNumCopas ( t f c o p a s . getText ( ) ) ; 9 e q u i p o a e d i t a r . s e t P a r t i d o 1 ( t f 0 1 . getText ( ) ) ; 10 e q u i p o a e d i t a r . s e t P a r t i d o 2 ( t f 0 2 . getText ( ) ) ; 11 e q u i p o a e d i t a r . s e t P a r t i d o 3 ( t f 0 3 . getText ( ) ) ; 12 13 F i l e archivoEquipos = new F i l e ( System . g e t P r o p e r t y ( ” user . d i r ” ) + ” / s r c / a r c h i v o s / Mundial . csv ” ) ; 14 15 / / actualizamos v a l o r e s nuevos 16 i n t a = l i s t E q u i p o s . g e t S e l e c t e d I n d e x ( ) ; 17 System . out . p r i n t l n ( ”AAAAAA ” + a ) ; 18 equipos . s e t ( a , e q u i p o a e d i t a r ) ; 19 20 try { 21 F i l e W r i t e r w = new F i l e W r i t e r ( archivoEquipos ) ; 22 BufferedWriter bw = new BufferedWriter (w) ; 23 P r i n t W r i t e r wr = new P r i n t W r i t e r (bw) ; 24 System . out . p r i n t l n ( ”TOTAL EQUIPO ” + equipos . s i z e ( ) ) ; 25 for ( i n t i = 0; i < equipos . s i z e ( ) ; i ++) { 26 / / en caso de ser la ultima l i n e a no agregar s a l t o de l i n e a 27 i f ( i == ( equipos . s i z e ( ) − 1) ) { 28 System . out . p r i n t l n ( ”−−−−−−−−−− EQUIPO ” + i + ” SI ” + equipos . get ( i ) . getNombre ( ) ) ; 29 wr . w r i t e ( equipos . get ( i ) . getNombre ( ) + ” , ” 30 + equipos . get ( i ) . getRanking ( ) + ” , ” 31 + equipos . get ( i ) . getGrupo ( ) + ” , ” 32 + equipos . get ( i ) . getNumCopas ( ) + ” , ” 33 + equipos . get ( i ) . g e t P a r t i d o 1 ( ) 34 + ” , ” + equipos . get ( i ) . g e t P a r t i d o 2 ( ) 35 + ” , ” + equipos . get ( i ) . g e t P a r t i d o 3 ( ) ) ; 36 37 } e l s e { 38 System . out . p r i n t l n ( ”−−−−−−−−−− EQUIPO ” + i + ” NO ” + equipos . get ( i ) . getNombre ( ) ) ; 39 40 wr . w r i t e ( equipos . get ( i ) . getNombre ( ) + ” , ” 41 + equipos . get ( i ) . getRanking ( ) + ” , ” 42 + equipos . get ( i ) . getGrupo ( ) + ” , ” 43 + equipos . get ( i ) . getNumCopas ( ) + ” , ” 44 + equipos . get ( i ) . g e t P a r t i d o 1 ( ) 45 + ” , ” + equipos . get ( i ) . g e t P a r t i d o 2 ( ) 46 + ” , ” + equipos . get ( i ) . g e t P a r t i d o 3 ( ) 47 + ”n” ) ; 48 } 49 } 50 wr . c l o s e ( ) ; 51 bw . c l o s e ( ) ; 52 53 } catch ( IOException e ) { 54 e . p r i n t S t a c k T r a c e ( ) ; 55 } 56 57 / / TODO add your handling code here : 58 } El c´odigo realizado se encuentra en: https://github.com/ byrvin17/MundialAG REFERENCIAS [1] G. Herrera, E. Carri´on,Una soluci´on no simetrica aplicando un algoritmo gen´etico con cruzamiento natural para la optimizaci´on estructural de armaduras, UNAM. [En l´ınea] http://www.ingenieria. unam.mx/∼revistafi/ejemplares/V13N3/V13N3 art07.pdf ,consulta realizada 21-May-14. [2] J. L´opez., Un algoritmo gen´etico con codificaci´on real para la evoluci´on de transformaciones lineales,Universidad Carlos III de Madrid. [En l´ınea] http://e-archivo.uc3m.es/bitstream/handle/10016/10214/PFC JOSE CARLOS LOPEZ DIAZ.pdf?sequence=1 ,consulta realizada 21-May-14. [3] Algoritmos Gen´eticos ,Curso de Postgrado-Universidad Carlos III de Madrid [En l´ınea] http://www.exa.unicen.edu.ar/escuelapav/cursos/bio/l3. pdf ,consulta realizada 22-May-14. [4] J. Arranz, A.Parra, Algoritmos Gen´eticos,Universidad Carlos III de Madrid [En l´ınea] http://www.it.uc3m.es/jvillena/irc/practicas/06-07/05. pdf ,consulta realizada 22-May-14. [5] A. Andaluz., Inteligencia en Redes de Comunicaciones, Universidad Carlos III de Madrid. [En l´ınea] http://www.it.uc3m.es/jvillena/irc/ practicas/estudios/aeag.pdf ,consulta realizada 22-May-14. Gabriela Rodr´ıguez Estudiante de la Carrera de Ingenier´ıa en Sistemas de la Universidad Nacional de Loja, conocedora de Redes y Telecomuni- caciones, Provincia de Loja, Ciudad Loja, Ecuador, 2014. Byron Lima Estudiante de la Carrera de Ingenier´ıa en Sistemas de la Universidad Nacional de Loja, Conocedor de An´alisis y dise˜no de Sistemas, Redes y Telecomunicaciones, Provincia de Loja, Ciudad Loja, Ecuador, 2014. Henry Paz Arias Ing. Mgs. Especialista en Inteligencia Artificial, Provincia de Loja, Ciudad Loja, Ecuador, 2014.