Está en la página 1de 12

INTELIGENCIA ARTIFICIAL

MANUAL DE ALGORITMO GENTICO

Introduccin
Los Algoritmos Genticos (AGs) son mtodos adaptativos que pueden
usarse para resolver problemas de bsqueda y optimizacin. Estn
basados en el proceso gentico de los organismos vivos. A lo largo de las

INTELIGENCIA ARTIFICIAL

generaciones, las poblaciones evolucionan en la naturaleza de acorde


con los principios de la seleccin natural y la supervivencia de los ms
fuertes.
Por imitacin de este proceso, los Algoritmos Genticos son capaces de
ir creando soluciones para problemas del mundo real.
Los

Algoritmos

Genticos

usan

una

anloga

directa

con

el

comportamiento natural. Trabajan con una poblacin de individuos, cada


uno de los cuales representa una solucin factible a un problema dado. A
cada individuo se le asigna un valor _o puntuacin, relacionado con la
bondad de dicha solucin. En la naturaleza esto equivaldr al grado de
efectividad de un organismo para competir por unos determinados
recursos. Cuanto mayor sea la adaptacin de un individuo al problema,
mayor ser la probabilidad de que el mismo sea seleccionado para
reproducirse,

cruzando

su

material

gentico

con

otro

individuo

seleccionado de igual forma. Este cruce producir nuevos individuos


descendientes de los anteriores

los cuales comparten algunas de las

caractersticas de sus padres. Cuanto menor sea la adaptacin de un


individuo, menor ser la probabilidad de que dicho individuo sea
seleccionado para la reproduccin, y por tanto de que su material
gentico se propague en sucesivas generaciones.

INTELIGENCIA ARTIFICIAL

FUNCIONAMIENTO DE UN ALGORITMO GENETICO


Vamos a partir de una funcin f(x) muy sencilla:
f(x) =x2
(es decir, x al cuadrado).
Imagina que deseas encontrar el valor de x que hace que la funcin f(x)
alcance su valor mximo, pero restringiendo a la variable x a tomar
valores comprendidos entre 0 y 31. An ms, a x slo le vamos a
permitir tomar valores enteros, es decir: 0,1, 2, 3,..., 30, 31. Obviamente
el mximo se tiene para x = 31, donde f vale 961. No necesitamos saber
algoritmos genticos para resolver este problema, pero su sencillez hace
que el algoritmo sea ms fcil de comprender.
Lo primero que debemos hacer es encontrar una manera de codificar las
posibles soluciones (posible valores de x). Una manera de hacerlo es con
la codificacin binaria. Con esta codificacin un posible valor de x es (0,
1, 0, 1, 1).
Cmo se interpreta esto? Muy sencillo: multiplica la ltima componente
(un 1) por 1, la penltima (un 1) por 2, la anterior (un 0) por 4, la
segunda (un 1) por 8 y la primera (un 0) por 16 y a continuacin haz la
suma: 11. Observa que (0, 0, 0, 0, 0) equivale a x = 0 y que (1, 1, 1, 1,
1) equivale a x = 31. A cada posible valor de la variable x en
representacin binaria le vamos a llamar individuo. Una coleccin de
individuos constituye lo que se denomina poblacin y el nmero de
individuos que la componen es el tamao de la poblacin.
Una vez que tenemos codificada la solucin, debemos escoger un
tamao de poblacin. Para este ejemplo ilustrativo vamos a escoger 6
individuos.
Debemos partir de una poblacin inicial. Una manera de generarla es
aleatoriamente: coge una moneda y lnzala al aire; si sale cara, la
primera componente del primer individuo es un 0 y en caso contrario un
1. Repite el lanzamiento de la moneda y tendremos la segunda
componente del primer individuo (un 0 si sale cara y un 1 si sale cruz).
As hasta 5 veces y obtendrs el primer individuo. Repite ahora la
secuencia anterior para generar los individuos de la poblacin restantes.
En total tienes que lanzar 5 * 6 = 30 veces la moneda.

INTELIGENCIA ARTIFICIAL

Nuestro siguiente paso es hacer competir a los individuos entre s. Este


proceso se conoce como seleccin. La tabla 1 resume el proceso.

Cada fila en la tabla 1 est asociada a un individuo de la poblacin


inicial. El significado de cada columna de la tabla es el siguiente:
(1)
(2)
(3)
(4)

=
=
=
=

Nmero que le asignamos al individuo.


Individuo en codificacin binaria.
Valor de x.
Valor de f(x).

Observa que el mejor individuo es el 5 con f = 676. Calcula la media de f


y obtendrs fmed =324.3.
En cuanto a la columna (5) ahora te lo explico. Una manera de realizar el
proceso de seleccin es mediante un torneo entre dos. A cada individuo
de la poblacin se le asigna una pareja y entre ellos se establece un
torneo: el mejor genera dos copias y el peor se desecha. La columna (5)
indica la pareja asignada a cada individuo, lo cual se ha realizado
aleatoriamente. Existen muchas variantes de este proceso de seleccin,
aunque este mtodo nos vale para ilustrar el ejemplo.
Despus de realizar el proceso de seleccin, la poblacin que tenemos
es la mostrada en la columna (2) de la tabla 2. Observa, por ejemplo,
que en el torneo entre el individuo 1 y el 6 de la poblacin inicial, el
primero de ellos ha recibido dos copias, mientras que el segundo cae en
el olvido.

INTELIGENCIA ARTIFICIAL

Tras realizar la seleccin, se realiza el cruce. Una manera de hacerlo es


mediante el cruce 1X: se forman parejas entre los individuos
aleatoriamente de forma similar a la seleccin. Dados dos individuos
pareja se establece un punto de cruce aleatorio, que no es ms que un
nmero aleatorio entre 1 y 4 (la longitud del individuo menos 1). Por
ejemplo, en la pareja 2-3 el punto de cruce es 3, lo que significa que un
hijo de la pareja conserva los tres primeros bits del padre y hereda los
dos ltimos de la madre, mientras que el otro hijo de la pareja conserva
los tres primeros bits de la madre y hereda los dos ltimos del padre. La
poblacin resultante se muestra en la columna (2) de la tabla 3.

En la columna (3) tienes el valor de x; en la siguiente tienes el valor de f


correspondiente.
Fjate en que ahora el valor mximo de f es 784 (para el individuo 2),
mientras que antes de la seleccin y el cruce era de 676. Adems fmed
ha subido de
324.3 a 389.3. Qu quiere decir esto? Simplemente que los individuos
despus de la seleccin y el cruce son mejores que antes de estas
transformaciones.
El siguiente paso es volver a realizar la seleccin y el cruce tomando
como poblacin inicial la de la tabla 3. Esta manera de proceder se
repite tantas veces como nmero de iteraciones t fijes. Y cul es el
ptimo? En realidad un algoritmo gentico no te garantiza la obtencin
del ptimo pero, si est bien construido, te proporcionar una solucin

INTELIGENCIA ARTIFICIAL

razonablemente buena. Puede que obtengas el ptimo, pero el algoritmo


no te confirma que lo sea. As que qudate con la mejor solucin de la
ltima iteracin. Tambin es buena idea ir guardando la mejor solucin
de todas las iteraciones anteriores y al final quedarte con la mejor
solucin de las exploradas.
CONSIDERACIONES ADICIONALES
En problemas reales en los que se aplican los algoritmos genticos,
existe la tendencia a la homogenizacin de la poblacin, es decir a que
todos los individuos de la misma sean idnticos. Esto impide que el
algoritmo siga explorando nuevas soluciones, con lo que podemos
quedar estancados en un mnimo local no muy bueno.
Existen tcnicas para contrarrestar esta "deriva gentica". El mecanismo
ms elemental, aunque no siempre suficientemente eficaz, es introducir
una mutacin tras la seleccin y el cruce. Una vez que has realizado la
seleccin y el cruce escoges un nmero determinado de bits de la
poblacin y los alteras aleatoriamente. En nuestro ejemplo consiste
simplemente en cambiar algunos(s) bit(s) de 1 a 0 de 0 a 1.

INTELIGENCIA ARTIFICIAL

PRACTICA DE CANBALES Y MISIONEROS:


En el siguiente ejercicio existen las siguientes reglas:
1. No dejar en ninguno de los dos lados mayor cantidad de canbales
que de misioneros.
2. Pasar todos los misioneros y canbales al otro lado del rio.
DESCRIPCIN DEL ALGORITMO
Para la creacin del algoritmo gentico primero separamos el ejercicio
genticamente:

1 individuo = 2 cromosomas
1 cromosoma = 2 genes
1 individuo = 4 genes

Se tomara cada movimiento del barco como individuo, cada lado del rio
como cromosoma y cada grupo de misioneros y canbales de cada lado
como los 4 genes como se lo detalla a continuacin en el grfico:
JUEGO MISIONEROS Y CANIBALES

INTELIGENCIA ARTIFICIAL

Gen

Gen

Cromosoma

Individuo

FUNCIONAMIENTO DEL ALGORITMO

Gen

Gen

Cromosoma

Para poder llegar a la solucin final del juego que es pasar a todos los
misioneros y canbales de un lado del rio hacia el otro, se toara en
cuenta que el algoritmo gentico estar compuesto de tantos individuos
sean necesarios.
El algoritmo iniciara con 3 misioneros y 3 canbales del lado derecho del
rio, luego se realizar el cruce o seleccin de los 4 genes indicados para
realizar el primer movimiento que ser el nmero de canbales y
misioneros que pasaran hacia el otro lado del rio y el nmero de
canbales y misioneros que se quedaran en el mismo lado, este
movimiento ser el primer individuo como ya se mencion
anteriormente.
El algoritmo generar individuos a partir del resultado del individuo
anterior hasta que el algoritmo como tal logre cruzar a todos los
misioneros y canbales hacia el otro lado, obviamente respetando todas
las reglas anteriormente planteadas.

INTELIGENCIA ARTIFICIAL

DIAGRAMA DE FLUJO DEL ALGORITMO


Inicio
Seleccin de la mejor generacin:
Cromosoma2
Cromosoma1
Gen1=MLB
|
Gen3=MLA

Canbales <= Misioneros


Canb-LadoB==3
&
Misio-LadoB==3
SI
Presentar movimiento (Individuo)
NO

Fin
SI

NO

INTELIGENCIA ARTIFICIAL

CODIGO MISIONEROS Y CANIBALES


//inicio del algoritmo
Random rnd = new Random();
boolean seguir = true;
System.out.println("--M0 -C0 --__________|<.....>|_-- M3- C3--");
//Cromosoma 1
int LadoACanivales = 3;
int LadoAMisioneros = 3;
//Cromosoma 2
int LadoBCanibales = 0;
int LadoBMisioneros = 0;
//Genes
int Gen1=0;
int Gen2=0;
int Gen3=0;
int Gen4=0;

INTELIGENCIA ARTIFICIAL

boolean
boolean
boolean
boolean

cruce1 = true;
cruce2 = true;
vivo1 = true;
vivo2 = true;

while(seguir){
//inicio de eleccion de primeros 2 genes
while(vivo1){
//si es que todo esta bien se de tiene el primer
cromosoma
vivo1=false;
cruce1 = true;
//primer cruce //eleccin random
while(cruce1){
cruce1 = false;
Gen1 = (int)(rnd.nextDouble()*3+0);//canivales
Gen2 = (int)(rnd.nextDouble()*3+0);//misioneros
if(Gen1>LadoACanivales){
cruce1 = true;
}
if(Gen2>LadoAMisioneros){
cruce1 = true;
}
if(!((Gen1+Gen2)>=1)){
cruce1 = true;
}
if(!((Gen1+Gen2)<=2)){
cruce1 = true;
}
}
//preguntar si es valido el cruce o no
LadoACanivales = LadoACanivales - Gen1;
LadoAMisioneros = LadoAMisioneros - Gen2;
LadoBCanibales = LadoBCanibales + Gen1;
LadoBMisioneros = LadoBMisioneros + Gen2;
if(LadoBMisioneros!=0){
//no es igual a cero - hay misioneros
if(LadoAMisioneros!=0){
//hay misioneros de ambos lados
if(LadoACanivales>LadoAMisioneros){

INTELIGENCIA ARTIFICIAL

//hay mas misioneros que canbales en lado A


vivo1 = true;
//se devuelve y regresa al cruce hasta que est
bien
LadoACanivales = LadoACanivales + Gen1;
LadoAMisioneros = LadoAMisioneros + Gen2;
LadoBCanibales = LadoBCanibales - Gen1;
LadoBMisioneros = LadoBMisioneros - Gen2;
}else{
//no hay mas misioneros que canbales en el
lado A
if(LadoBCanibales>LadoBMisioneros){
//hay mas misioneros que canbales en el
lado B
vivo1 = true;
//se devuelve
LadoACanivales = LadoACanivales + Gen1;
LadoAMisioneros = LadoAMisioneros + Gen2;
LadoBCanibales = LadoBCanibales - Gen1;
LadoBMisioneros = LadoBMisioneros - Gen2;
}//no hay mas misioneros que canbales en
ninguno de los dos lados
}
}//pasaron todos los misioneros
}//no hay misioneros... no pasa nada
}

También podría gustarte