Este documento describe el uso de algoritmos genéticos para predecir los cuatro posibles equipos ganadores de la Copa Mundial de Fútbol de 2014 en Brasil sobre la base de factores como el ranking FIFA, el grupo, el número de copas obtenidas y los últimos tres partidos. Los autores desarrollaron una aplicación en Java que utiliza algoritmos genéticos para pronosticar los equipos campeones basándose en estos factores.
UC Fundamentos de tuberías en equipos de refrigeración m.pdf
Algotitmos geneticos mundial
1. 1
“Predicción de los Cuatro Posibles Ganadores de la
Copa Mundial de Fútbol BRASIL 2014 a través de
Algoritmos Genéticos”
L. Bravo, K. Herrera, J. Martínez, H. Paz,
Resumen—A pocos días de aproximarse el mundial de fútbol
BRASIL 2014 y como aplicación de las técnicas de inteligencia
artificial, específicamente de los algoritmos genéticos, se ha
propuesto desarrollar una aplicación bajo el lenguaje de pro-
gramación Java, la cuál pretende pronosticar los cuatro posibles
equipos que pueden consagrarse como el campeón mundial de
Fútbol en base a distintos factores tales como el ranking de la
Federación Internacional de Fútbol Asociada (FIFA) , el grupo en
el que se encuentra ubicado, el número de copas obtenidas y los
últimos tres partidos jugados que tenga cada equipo clasificado.
Palabras Claves—Algoritmos genéticos, fútbol, optimización,
mundial, java, JGAP
I. INTRODUCCIÓN
Los Algoritmos Genéticos surgieron con la necesidad de
optimizar los procesos de búsqueda basada en la teoría de la
evolución planteada por Charles Darwin, siendo esta técnica
de inteligencia artificial una de las mas aceptadas para resolver
problemas de búsqueda. Los algoritmos genéticos emplean di-
ferentes criterios de selección que ayudan a que una población
evolucione de forma más optima para obtener resultados mas
exactos para un problema específico.
En el presente trabajo se pretende crear una aplicación ba-
sada en algoritmos genéticos que permita predecir los cuatro
equipos que pudieran obtener la copa mundial de fútbol. Para
alcanzar la solución al problema planteado se parte de un
conjunto inicial de individuos(Equipos), llamado población,
generado de manera aleatoria. Cada uno de estos individuos
representa una posible solución al problema y se adaptarán en
mayor medida tras el paso de cada generación a la solución
requerida.
II. ESTADO DEL ARTE
II-A. HISTORIA DE LOS ALGORITMOS GENÉTICOS
El desarrollo de los Algoritmos Genéticos(AGs) se debe a
gran medida a John Holland, investigador de la Universidad
de Michigan. A finales de la década de los 60 desarrolló
una técnica que imitaba en su funcionamiento a la selección
natural.
L. Bravo , Estudiante de la Universidad Nacional de Loja, Loja, Ecua-
dor, E-mail: lfbravoe@unl.edu.ec
K. Herrera,Estudiante de la Universidad Nacional de Loja, Loja, Ecua-
dor, E-mail: kkherrerap@unl.edu.ec
J. Martínez,Estudiante de la Universidad Nacional de Loja, Loja, Ecua-
dor, E-mail: jamartinezg@unl.edu.ec
H. Paz, Docente de la Universidad Nacional de Loja, Loja, Ecua-
dor, E-mail: hpaz@unl.edu.ec
Finales de los 59 y principios de los 60.- Algoritmos
Genéticos programados en computadoras por biólogos
evolutivos que buscaban explícitamente realizar modelos
de aspectos de la evolución natural.
En 1962, investigadores como G.E.P. Box, G.J. Fried-
man, W.W. Bledsoe y H.J. Bremermann habían desa-
rrollado independientemente algoritmos inspirados en la
evolución para optimización de funciones y aprendizaje
automático, pero sus trabajos generaron poca reacción.
En 1965 surgió un desarrollo más exitoso, cuando Ingo
Rechenberg, entonces de la Universidad Técnica de Ber-
lín, introdujo una técnica que llamó estrategia evolutiva.
En 1975 apareció el trabajo fundamental en el campo
de los algoritmos genéticos con la publicación del libro
“Adaptación en Sistemas Naturales y Artificiales” de
John Holland’.
A finales de 1980s la General Electric comenzó a vender
el primer producto de Algoritmo Genético para solucio-
nar problemas de procesos industriales.
En 1989 se creó el producto Evolver que fue el pri-
mer producto de Algoritmo Genético para Computadoras
personales.[1]
II-B. DEFINICIÓN DE ALGORITMOS GENÉTICOS
“Los Algoritmos Genéticos(AGs) son algoritmos de
búsqueda basados en la mecánica de la selección natural
y de la genética natural. Combinan la supervivencia del
más apto entre estructuras de secuencias con intercambio
de información estructurado, aunque aleatorizado, para
constituir así un algoritmo de búsqueda que tenga algo de las
genialidades de las búsquedas humanas”.
Un algoritmo genético consiste en una población de
soluciones codificadas de forma similar a cromosomas.
Cada uno de estos cromosomas tendrá asociado un ajuste
o valor de bondad que cuantifica su validez como solución
del problema. En función de este valor se le darán más o
menos oportunidades de reproducción. Además, con cierta
probabilidad se realizarán mutaciones de estos cromosomas.[1]
Cuando el Algoritmo Genético es implementado, se hace de
forma que involucre el siguiente ciclo:
Generación de una población inicial de manera aleatoria.
Evaluar el desempeño de todos los individuos de la
población, tomando en cuenta alguna función objetivo.
2. 2
Crear una nueva población mediante la ejecución de
operaciones como el cruce y mutación sobre individuos
cuyo desempeño haya sido evaluado.
Descartar la población vieja e iterar usando la nueva,
hasta que el número de generaciones alcanza al criterio
de terminación.
Figura 1. Implementación de un Algoritmo Genético
II-C. CLASIFICACIÓN DE LOS ALGORITMOS GENÉTI-
COS
II-C1. Algoritmo Genético Simple: El Algoritmo
Genético Simple, también denominado Canónico, se necesita
una codificación o representación del problema, que resulte
adecuada al mismo. Además se requiere una función de
ajuste o adaptación al problema, la cual asigna un número
real a cada posible solución codificada. Durante la ejecución
del algoritmo, los padres deben ser seleccionados para la
reproducción, a continuación dichos padres seleccionados
se cruzarán generando dos hijos, sobre cada uno de los
cuales actuará un operador de mutación. El resultado de la
combinación de las anteriores funciones será un conjunto de
individuos (posibles soluciones al problema), los cuales en
la evolución del Algoritmo Genético formarán parte de la
siguiente población.
II-C2. Algoritmos Genéticos de Estado Fijo: Utilizan el
esquema generacional de los mamíferos y otros animales
de vida larga,donde coexisten padres y sus descendientes,
En este modelo,no solo se deben seleccionar los dos
individuos a ser padres sino también cuales de la población
anterior serán eliminados para dar espacio a los descendientes.
II-C3. Algoritmos Genéticos Paralelos: Son aquellos
donde al evolucionar se recorren simultáneamente muchas
soluciones.cada una representada por un individuo de la
población.
II-C4. Modelo de Islas: Si se tiene una población de
individuos, esta se divide en subpoblaciones que evolucionan
independientemente como un Algoritmo Genético normal.
II-C5. Modelo Celular: Coloca cada individuo en una
matriz, dónde cada uno solo podrá reproducirse con los
individuos que tenga a su alrededor, escogiendo al azar o al
mejor adaptado.
II-D. ELEMENTOS DE LOS ALGORITMOS GENÉTICOS
II-D1. Individuo : Un individuo es un ser que caracteriza
su propia especie. El individuo es un cromosoma y es el
código de información sobre el cual opera el algoritmo. Cada
solución parcial del problema a optimizar está codificada en
forma de cadena o String en un alfabeto determinado, que
puede ser binario.
II-D2. Población : A un conjunto de individuos
(Cromosomas) se le denomina población. El método de
Algoritmos Genéticos consiste en ir obteniendo de forma
sucesiva distintas poblaciones. Por otra parte un Algoritmo
Genético trabaja con un conjunto de puntos representativos
de diferentes zonas del espacio de búsqueda y no con un solo
punto (como lo hace Hillclimbing).
II-D3. Función Fitness : La única restricción para usar
un algoritmo genético es que exista una función llamada
fitness, que le informe de cuan bueno es un individuo dado
en la solución deun problema. Esta función fitness o de
evaluación es el principal enlace entre el Algoritmo Genético
a un problema real, es la efectividad y eficiencia de la función
fitness que se tome, por lo tanto debe procurarse que la función
fitness sea similar. [2]
II-E. ESTRUCTURA DE LOS ALGORITMOS GENÉTICOS
II-E1. Tipos de Representación : Una representación
debe identificar las características constituyentes del conjunto
a estudiar, de forma que distintas representaciones dan lugar
a distintas perspectivas y por tanto distintas soluciones.
Tipos básicos de representaciones:
Representación binaria: Cada gen es un valor 1 ó 0.
Figura 2. Representación Binaria
3. 3
Representación entera: Cada gen es un valor entero.
Figura 3. Representación Entera
Representación real: Cada gen es un valor real.
Figura 4. Representación Real
II-E2. Población Inicial : Una cuestión que se puede
plantear es la relacionada con el tamaño idóneo de la
población. Parece intuitivo que las poblaciones pequeñas
corren el riesgo de no cubrir adecuadamente el espacio
de búsqueda, mientras que el trabajar con poblaciones de
gran tamaño puede acarrear problemas relacionados con el
excesivo costo computacional.
II-E3. Función Objetivo : El resultado al cual se desea
llegar.
II-E4. Operador de Selección : El operador de
Selección es el encargado de transmitir y conservar aquellas
características de las soluciones que se consideran valiosas
a lo largo de las generaciones. El principal medio para que
la información útil se transmita es que aquellos individuos
mejor adaptados tengan más probabilidades de reproducirse.
Selección directa: Toma elementos de acuerdo a un
criterio objetivo, como son los x mejores,los x peores,
los del tipo el cuarto individuo a partir del último
escogido son empleados con mucha frecuencia cuando
se quieren seleccionar dos individuos distintos.
Selección aleatoria: Puede ser realizado por selección
equiprobable o selección estocástica.
Selección equiprobable: Todos tienen la misma
probabilidad de ser escogidos.
Selección estocástica: La probabilidad de que un
individuo sea escogido depende de una heurística.
• Selección por sorteo: Cada individuo de la
población tiene asignado un rango proporcional
oinversamente proporcional.
• Selección por escaños: Se divide el rango del
número aleatorio en un número predeterminado de
escaños.
• Selección por restos estocásticos: Igual que el
método de selección de escaños, sólo que los
escaños no asignados directamente.
Selección por Ruleta: Con este método la probabilidad
que tiene un individuo de reproducirse es proporcional
a su valor de función de evaluación, es decir, a su
adaptación. En este método se define un rango con las
características de la selección por sorteo. El número al
azar será un número aleatorio forzosamente menor que
el tamaño del rango. El elemento escogido será aquel
en cuyo rango esté el número resultante de sumar el
número aleatorio con el resultado total que sirvió para
escoger el elemento anterior.
Selección por Ranking: Desarrollado por Whitley(1989)
consiste en calcular las probabilidades de reproducción
atendiendo a la ordenación de la población por el valor
de adaptación en vez de atender simplemente a su valor
de adecuación. Estas probabilidades se pueden calcular
de diversas formas, aunque el método habitual es el
ranking lineal.
Selección por Torneo: En este caso dos individuos
son elegidos al azar de la población actual y el mejor
o más apto de los dos se coloca en la generación
siguiente. Esto continúa hasta que se complete la nueva
población. Basado en el rango. En este esquema se
mantiene un porcentaje de la población, generalmente la
mayoría, para la siguiente generación.Se coloca toda la
población por orden de aptitud, y los M menos dignos
son eliminados y sustituidos por la descendencia de
alguno de los M mejores con algún otro individuo de la
población.[3]
II-E5. Operador de Cruce : El operador de Cruce permite
realizar una exploración de toda la información almacenada
hasta el momento en la población y combinarla para crear
mejores individuos. Dentro de los métodos habituales
destacamos los siguientes:
Cruce de un punto: Es el método de cruce más
sencillo. Se selecciona una posición en las cadenas
de los progenitores, y se intercambian los genes a la
izquierda de esta posición.
4. 4
Figura 5. Cruce por un punto
Cruce de n puntos: Es una generalización del método
anterior. Se seleccionan varias posiciones (n) en las
cadenas de los progenitores y se intercambian los genes
a ambos lados de estas posiciones.
Figura 6. Cruce por n puntos
Cruce Uniforme: Se realiza un test aleatorio para decidir
de cual de los progenitores se toma cada posición de la
cadena.[4]
Figura 7. Cruce uniforme
Cruces para permutación: Existe una familia de cruces
específicas para los problemas de permutación, siendo
algunos de ellos:
• Cruce de mapeamiento parcial: Toma una
subsecuencia del genoma del padre y procura
preservar el orden absoluto de los fenotipos - es
decir, orden y posición en el genoma- del resto del
genoma lo más parecido posible de la madre.
• Cruce de orden: Toma una subsecuencia del
genoma del padre y procura preservar el orden
relativo de los fenotipos del resto del genoma lo
más parecido posible de la madre.
II-E6. Operador de Mutación: La mutación se considera
un operador básico, que proporciona un pequeño elemento de
aleatoriedad en el entorno de los individuos de la población.
Si bien el operador de cruce es el responsable de efectuar la
búsqueda a lo largo del espacio de posibles soluciones, el
operador de mutación va ganando en importancia a medida
que la población de individuos va convergiendo. Existen
varias técnicas distintas de mutación. Algunas de éstas son:
Mutación de bit: Existe una única probabilidad de que
se produzca una mutación de algún bit. De producirse,
el algoritmo toma aleatoriamente un bit.
Mutación de gen: Igual que la mutación de bit,
solamente que, en vez de cambiar un bit, cambia un gen
completo.
Mutación multigen: Igual que la mutación de multibit,
solamente que, en vez de cambiar un conjunto de
bits, cambia un conjunto de genes. Puede sumar un
valor aleatorio, un valor constante, o introducir un gen
aleatorio nuevo.
II-F. ¿QUÉ PROBLEMAS PODEMOS RESOLVER CON
ALGORITMOS GENÉTICOS?
La aplicación más común de los AGs ha sido la solución
de problemas de optimización en donde han mostrado ser
eficientes y confiables.
Sin embargo, no todos los problemas pudieran ser apropiados
para la técnica y se recomienda en general tomar en cuenta
las siguientes características del mismo antes de usarla:
Su espacio de búsqueda o sus posibles soluciones debe
de estar delimitado dentro de un cierto rango.
Debe permitir la definición de una función de aptitud
que nos indique que tan buena o mala es cierta respuesta.
Las soluciones deben programarse de una forma
que resulte relativamente fácil de implementar en el
computador.[5]
II-G. ÁREA DE APLICACIÓN DE LOS ALGORITMOS GE-
NÉTICOS
II-G1. Optimización : Se trata de un campo especialmente
abonado para el uso de los AG, por las características
intrínsecas de estos problemas. No en vano fueron la fuente
de inspiración para los creadores de estos algoritmos. Los
AG se han utilizado en numerosas tareas de optimización,
incluyendo la optimización numérica, y los problemas de
optimización combinatoria.
II-G2. Programación automática : Los AG se han
empleado para desarrollar programas para tareas específicas,
y para diseñar otras estructuras computacionales tales como
el autómata celular, y las redes de clasificación.
5. 5
II-G3. Aprendizaje máquina : Los AG se han utilizado
también en muchas de estas aplicaciones , tales como la
predicción del tiempo o la estructura de una proteína. Han
servido asimismo para desarrollar determinados aspectos
de sistemas particulares de aprendizaje, como puede ser el
de los pesos de una red neuronal, las reglas para sistemas
de clasificación de aprendizaje o sistemas de producción
simbólica y los sensores para los robots.
II-G4. Economía : En este caso, se ha hecho uso de estos
Algoritmos para modelar procesos de innovación, el desarrollo
de estrategias de puja, y la aparición de mercados económicos.
II-G5. Sistemas inmunes : Al momento de modelar
varios aspectos de los sistemas inmunes naturales, incluyendo
la mutación somática durante la vida de un individuo y el
descubrimiento de familias de genes múltiples en tiempo
evolutivo, ha resultado útil el empleo de esta técnica.
II-G6. Genética de poblaciones : En el estudio de
preguntas del tipo "¿ Bajo qué condiciones será viable
evolutivamente un gen para la recombinación?".
II-G7. Evolución y aprendizaje: Los AG se han utilizado
en el estudio de las relaciones entre el aprendizaje individual
y la evolución de la especie.
II-G8. Sistemas sociales: En el estudio de aspectos
evolutivos de los sistemas sociales, tales como la evolución
del comportamiento social en colonias de insectos, y la
evolución de la cooperación y la comunicación en sistemas
multiagentes.[6]
II-H. LIBRERÍA JGAP
Figura 8. Librería JGAP
JGAP son las siglas de Java Genetic Algorithms Package
(paquete de algoritmos genéticos para Java). Es un
componente de programación de algoritmos genéticos
que se utiliza como un framework.
JGAP es software libre y se puede distribuir bajo la GNU
Lesser PublicLicense 2.1 o posterior. Las aplicaciones
comerciales que no publiquen sucódigo fuente deben
distribuirse bajo la Mozilla Public License.[7]
II-H1. Interfaces, Clases y Excepciones de la Librería
JGAP: JGAP nos proporciona las siguientes interfaces:
Figura 9. Interfaces de la librería JGAP
JGAP cuenta con las siguientes clases:
Figura 10. Clases de la librería JGAP
JGAP tiene las siguientes excepciones:
Figura 11. Excepciones de la librería JGAP
Se trata de una solución genérica, sin relación alguna con
un problema particular. Por esa razón se deben crear nuevas
clases que heredan o implementan las clases e interfaces
6. 6
mencionadas. Así se adapta JGAP al problema específico que
se quiere solucionar.
II-H2. Motor Genético: El “motor genético” crea
varias soluciones (individuos) aleatoriamente con el
método randomInitialGenotype().Aplica operadores genéticos
(mutación y combinación) para que surjan nuevas soluciones
con el método evolve (). Pone a prueba cada solución
con la función de ajuste evaluate(). Y por último
retorna el cromosoma del individuo mejor adaptado con
getFittestChromosome().
III. IMPLEMENTACIÓN
Código de la Clase TestEquipoFitness en la que definimos
a través de la utilización de algoritmos genéticos las caracte-
rístcas de que va a tener la solución:
%CODIGO DE LA CLASE TestEquipoFitness
package ec.unl.edu.ag;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.jgap.Chromosome;
import org.jgap.Configuration;
import org.jgap.DefaultFitnessEvaluator;
import org.jgap.Gene;
import org.jgap.Genotype;
import org.jgap.IChromosome;
import org.jgap.impl.DefaultConfiguration;
import org.jgap.impl.IntegerGene;
import org.jgap.impl.SwappingMutationOperator;
import ec.unl.edu.clases.Equipo;
import ec.unl.edu.operaciones.Operaciones;
public class TestEquipoFitness {
String respuesta = "";
String fitnessValor = "";
public String getRespuesta() {
return respuesta;
}
public void setRespuesta(
String respuesta) {
this.respuesta = respuesta;
}
private ArrayList<String> respuestaVista=
new ArrayList<String>();
public ArrayList<String> getRespuestaVista() {
return respuestaVista;
}
public void setRespuestaVista(
ArrayList<String> respuestaVista) {
this.respuestaVista = respuestaVista;
}
private Configuration configuracion;
private SwappingMutationOperator
operadorMutacion;
private EquipoFitnessFunction
equipoFitness = null;
public ArrayList<Equipo> equipos =
new ArrayList<Equipo>();
public List genes = new ArrayList();
public ArrayList<String> listaRespuesta =
new ArrayList<String>();
Operaciones operaciones = new Operaciones();
private static final int MAX_ALLOWED_EVOLUTIONS =
2000;
private Chromosome equipoCromosoma = null;
public void inicializar(String tipo)
throws Exception {
StringTokenizer st =
new StringTokenizer(tipo);
while (st.hasMoreElements()) {
String gen = st.nextToken();
genes.add(gen);
}
equipos = operaciones.recuperarEquipos();
configuracion = new DefaultConfiguration();
Configuration.resetProperty(
Configuration.PROPERTY_FITEVAL_INST);
configuracion.setFitnessEvaluator(
new DefaultFitnessEvaluator());
configuracion.getGeneticOperators().clear();
operadorMutacion =
new SwappingMutationOperator(configuracion);
configuracion.addGeneticOperator(operadorMutacion);
configuracion.setPreservFittestIndividual(true);
configuracion.setPopulationSize(1000);
configuracion.setKeepPopulationSizeConstant(false);
equipoFitness = new EquipoFitnessFunction(
equipos, genes);
configuracion.setFitnessFunction(equipoFitness);
Gene[] equiposGenes = new Gene[4];
equiposGenes[0] = new IntegerGene(
configuracion, 0,equipos.size()-1);
equiposGenes[1] = new IntegerGene(
configuracion, 0,equipos.size()-1);
equiposGenes[2] = new IntegerGene(
configuracion, 0,equipos.size()-1);
equiposGenes[3] = new IntegerGene(
configuracion, 0,equipos.size()-1);
equipoCromosoma = new Chromosome(
configuracion, equiposGenes);
equiposGenes[0].setAllele(0);
equiposGenes[1].setAllele(1);
equiposGenes[2].setAllele(2);
equiposGenes[3].setAllele(3);
7. 7
configuracion.setSampleChromosome(
equipoCromosoma);
}
public void pruebaSeleccionarMejoresEquipos()
throws Exception {
equipos = operaciones.recuperarEquipos();
Genotype poblacion =
Genotype.randomInitialGenotype(
configuracion);
IChromosome mejorSolucionHastaAqui =
equipoCromosoma;
for (int i=0;i<MAX_ALLOWED_EVOLUTIONS;i++) {
// evolucionar poblacion
poblacion.evolve();
IChromosome candidatoAMejorSolucion =
poblacion.getFittestChromosome();
if (candidatoAMejorSolucion.getFitnessValue() >
mejorSolucionHastaAqui.getFitnessValue()) {
mejorSolucionHastaAqui =
candidatoAMejorSolucion;
}
}
this.setRespuestaVista(
retornarSolucionFinal(
mejorSolucionHastaAqui,equipos));
}
public ArrayList<String> retornarSolucionFinal(
IChromosome solution,
ArrayList<Equipo> equipos) {
fitnessValor =
String.valueOf(
solution.getFitnessValue());
for (int i=0;i<solution.size(); i++) {
int index =
(Integer) solution.getGene(i).getAllele();
Equipo equipo = (Equipo) equipos.get(index);
listaRespuesta.add(
equipo.getNombre().toString());
}
return listaRespuesta;
}
public String presentarRespuesta()
throws Exception {
equipos =
operaciones.recuperarEquipos();
Genotype poblacion =
Genotype.randomInitialGenotype(configuracion);
String salida = "";
IChromosome mejorSolucionHastaAqui =
equipoCromosoma;
for (int i=0; i<MAX_ALLOWED_EVOLUTIONS;i++){
// evolucionar poblacion
poblacion.evolve();
IChromosome candidatoAMejorSolucion =
poblacion.getFittestChromosome();
salida = salida
+ candidatoAMejorSolucion
+"n";
}
salida = salida
+ "n >>> Valor Fitness: "
+ fitnessValor;
return salida;
}
}
La clase EquipoFitnessFunction es la que trataremos las condi-
ciones de entrada que tendrá nuestro algoritmo: el número de
copa, el ranking en la FIFA y el resultado de sus tres últimos
partidos:
%CODIGO DE LA CLASE EquipoFitnessFunction
package ec.unl.edu.ag;
import java.util.ArrayList;
import java.util.List;
import org.jgap.FitnessFunction;
import org.jgap.IChromosome;
import org.jgap.impl.IntegerGene;
import ec.unl.edu.clases.Equipo;
public class EquipoFitnessFunction
extends FitnessFunction {
ArrayList<Equipo> equipos =
new ArrayList<Equipo>();
List genes =
new ArrayList();
public EquipoFitnessFunction(
ArrayList<Equipo> equipos,
List genes) {
this.equipos = equipos;
this.genes = genes;
}
@Override
protected double evaluate(
IChromosome icromosoma) {
double puntuacion = 0;
List dups = new ArrayList();
int malaSolucion = 1;
for(int i=0;i<icromosoma.size();i++) {
IntegerGene un_gen =
(IntegerGene) icromosoma.getGene(i);
int indice =
(Integer) icromosoma.getGene(i).getAllele();
8. 8
if (dups.contains(indice)) {
malaSolucion = 0;
} else {
dups.add(indice);
}
Equipo equipo = equipos.get(indice);
double puntuacionGenes =
this.obtenerPuntuacionGenes(equipo);
if(puntuacionGenes == 0){
malaSolucion = 0;
}
double resultado1 =
equipo.getAntepenultimo_partido();
double resultado2 =
equipo.getPenultimo_partido();
double resultado3 =
equipo.getUltimo_partido();
puntuacion =
(puntuacion
+ resultado1
+ resultado2
+ resultado3
+ puntuacionGenes);
}
return (
puntuacion*malaSolucion);
}
private int obtenerPuntuacionGenes(
Equipo equipo) {
int _ranking=0;
int _partido_antepenultimo=0;
int _partido_penultimo=0;
int _partido_ultimo=0;
int total=0;
int numero_copas =
equipo.getNumero_copas();
int ranking_fifa =
equipo.getRanking();
int antepenultimo =
equipo.getAntepenultimo_partido();
int penultimo =
equipo.getPenultimo_partido();
int ultimo =
equipo.getUltimo_partido();
if (antepenultimo == 1) {
_partido_antepenultimo = 1;
}
if (antepenultimo == 0) {
_partido_antepenultimo = 0;
}
if (antepenultimo == -1) {
_partido_antepenultimo = -1;
}
if (penultimo == 1) {
_partido_penultimo = 1;
}
if (penultimo == 0) {
_partido_penultimo = 0;
}
if (penultimo == -1) {
_partido_penultimo = -1;
}
if (ultimo == 1) {
_partido_ultimo = 1;
}
if (ultimo == 0) {
_partido_ultimo = 0;
}
if (ultimo == -1) {
_partido_ultimo = -1;
}
if ((ranking_fifa >= 1)
&& (ranking_fifa <= 10)) {
_ranking = 12;
}
if ((ranking_fifa >= 11)
&& (ranking_fifa <= 20)) {
_ranking = 11;
}
if ((ranking_fifa >= 21)
&& (ranking_fifa <= 30)) {
_ranking = 10;
}
if ((ranking_fifa >= 31)
&& ((ranking_fifa) <= 40)) {
_ranking = 9;
}
if ((ranking_fifa >= 41)
&& (ranking_fifa <= 50)) {
_ranking = 8;
}
if ((ranking_fifa >= 51)
&& (ranking_fifa <= 60)) {
_ranking = 7;
}
if ((ranking_fifa >= 61)
&& (ranking_fifa <= 70)) {
_ranking = 6;
}
if ((ranking_fifa >= 71)
&& (ranking_fifa <= 80)) {
_ranking = 5;
}
if ((ranking_fifa >= 81)
&& (ranking_fifa <= 90)) {
_ranking = 4;
}
if ((ranking_fifa >= 91)
&& (ranking_fifa <= 100)) {
_ranking = 3;
}
if ((ranking_fifa >= 101)
&& (ranking_fifa <= 110)) {
_ranking = 2;
}
9. 9
if ((ranking_fifa >= 111)) {
_ranking = 1;
}
total =
numero_copas
+ _ranking
+ _partido_antepenultimo
+ _partido_penultimo
+ _partido_ultimo;
return total;
}
}
Como se ha propuesto obtener los cuatro mejores candidatos
a ganar el Mundial tenemos, la clase en la cual se ejecuta el
algoritmo genético la cual es la siguiente:
/** Evento dentro del boton Obtener
* para ejecutar el Algoritmo
* Genetico
*/
btnObtener.addActionListener(
new ActionListener() {
public void actionPerformed(
ActionEvent arg0) {
/** llamado a la clase TestEquipoFitness
* para obtener los resultados
*/
TestEquipoFitness test =
new TestEquipoFitness();
try {
test.inicializar(" ");
test.pruebaSeleccionarMejoresEquipos();
String valorConsola =
test.presentarRespuesta();
txtAreaConsola.setText(valorConsola);
/** obtiene la lista de resultados
* y los presenta en los
* cuadros de texto
* correspondientes
*/
ArrayList<String> resultados =
test.getRespuestaVista();
txtEquipo1.setText(
resultados.get(0));
txtEquipo2.setText(
resultados.get(1));
txtEquipo3.setText(
resultados.get(2));
txtEquipo4.setText(
resultados.get(3));
Configuration.reset();
} catch (Exception e) {
e.printStackTrace();
}
}
});
IV. RESULTADOS
En esta figura 12 podemos observar de manera general
la aplicación:
Figura 12. Aplicación para el Mundial 2014 en base a AG
En la figura 13 podemos ver como es presentado un
seleccionado:
Figura 13. Presentación de un Equipo
En la figura 14 podemos ver como se puede ser
modificar a un seleccionado:
10. 10
Figura 14. Modificación de un Equipo
En la figura 15 podemos ver cual es el resultado, luego
de la ejecución del AG:
Figura 15. Presentación de Resultado:Cuatro posibles equipos ganadores
El código de la aplicación estará disponible en la siguiente
dirección:
github.com/JhymerMartinez/AlgoritmosGeneticosMundial.git
V. CONCLUSIONES Y RECOMENDACIONES
Como podemos comprobar los algoritmos genéticos
sirven para problemas de optimización de recursos,
en este caso nos permite obtener los mejores equipos
candidatos a ganar el mundial.
El mejor resultado que podemos obtener, dependerá de
la ubicación que tenga el equipo en el ranking dentro
de la clasificación, el número de copas ganadas, así
como se pueden agregar otros factores que permitan
determinar con más exactitud el resultado.
La utilización de una librería como JGAP en nuestra
aplicación permite una mejor implementación de los
algoritmos genéticos en aplicaciones con lenguaje JAVA.
Los algoritmos genéticos utilizan una simulación de los
procesos genéticos que se realizan en los genomas del
ser humano, su implementación y uso es cada vez más
aceptada en la comunidad científica.
Es importante considerar la utilización de una librería de
algoritmos genéticos como JGAP, la cual nos permitirá
aplicar los conocimientos de algoritmos genéticos en la
programación utilizando lenguaje JAVA.
Este tipo de aplicaciones prácticas permiten mejorar la
comprensión de los conocimientos teóricos referentes a
la técnica de algoritmos genéticos.
REFERENCIAS
[1] HERNANDEZ. LYDY,LOPEZ. RICARDO,MENDIOLA.ROSA
Algoritmos Genéticos, Ingeniería Cibernética y en Sistemas
Computacionales, Universidad de la Salle: Bogotá, 2011.[En línea].
Available:http://www.maestrosilvestre.aprenderapensar.net/files/2011/05/02-
AG.doc.[Último acceso: 27 de Mayo 2014].
[2] RAMIREZ.CAMILO, Algoritmos Genéticos,, Bogotá, 2013.[En
línea]. Available:http://camilortte.blogspot.com/2013/04/algoritmos-
geneticos.html.[Último acceso: 27 de Mayo 2014].
[3] GIL.NATHYELEM, Algoritmos Genéticos,Universidad Nacional
de Colombia,2006. [En línea]. Available: http://www.trabajos-
pdf/algoritmos-geneticos/algoritmos-geneticos.pdf. [Último acceso:
27 de Mayo 2014].
[4] GESTAL. MARCOS, Introducción a los Algoritmos Ge-
néticos,Universidad de Coruña,2006.[En línea]. Available:
http://sabia.tic.udc.es/mgestal/cv/aaggtutorial/node14.html. [Último
acceso: 27 de Mayo 2014].
[5] Algoritmos Genéticos,[En línea]. Available:
http://www.sc.ehu.es/ccwbayes/docencia/mmcc/docs/temageneticos.pdf
[Último acceso: 27 de Mayo 2014].
[6] Algoritmos Genéticos,[En línea]. Availa-
ble:http://users.exa.unicen.edu.ar/ icompevol/filminasenpdf/tercera-
clase.pdf. [Último acceso: 27 de Mayo 2014].
[7] Package org.jgap,[En línea]. Availa-
ble:http://jwork.org/scavis/api/doc.php/ org/jgap/package-
summary.html[Último acceso: 27 de Mayo 2014].
11. 11
Luis Bravo
Estudiante de la Carrera de Ingeniería en Sistemas de la
Universidad Nacional de Loja, Nivel Medio en Software Libre, Redes
y Mantenimiento, Provincia de Loja, Ciudad Loja, Ecuador, 2014.
Karla Herrera
Estudiante de la Carrera de Ingeniería en Sistemas de la
Universidad Nacional de Loja, Programador Senior en Java, Analista
de Sistemas nivel medio, Provincia de Loja, Ciudad Loja, Ecuador,
2014.
Jhymer Martínez
Estudiante de la Carrera de Ingeniería en Sistemas de la
Universidad Nacional de Loja, Programador Senior en Java, Analista
de Sistemas nivel medio,Provincia de Loja, Ecuador, 2014.