Sei sulla pagina 1di 30

Facultad de Ingeniera

75.39 Aplicaciones Informticas


Algoritmos Genticos
JGAP
1er. Cuatrimestre 2009
Nombres:
Veloso Gabriel Alejandro 82626
Arce Rubn 76908
Pgina 1
ndice
Introduccin!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "
Instalacin # con$i%uracin del entorno!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&
Descarga e instalacin de la maquina virtual de java............................................................4
Descarga e instalacin del Eclipse para desarrollo en java....................................................4
Descarga e instalacin de JGAP............................................................................................5
Agregar las libreras a una aplicacin....................................................................................5
'todos de (eleccin!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 12
ueda de ruleta.................................................................................................................... !"
#eleccin por torneo ...........................................................................................................!"
$asado en el rango .............................................................................................................!"
%&todo Estoc'stico ............................................................................................................!"
'todos de Re)roduccin!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1&
(ru)a #imple....................................................................................................................... !4
(ru)a de dos puntos............................................................................................................!4
(ru)a %ultipunto................................................................................................................ !4
(ru)a binomial ................................................................................................................... !4
%utacin............................................................................................................................. !5
*jem)lo de a)licacin:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 16
Im)lementacin de ejem)lo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!17
*uncin Aptitud.................................................................................................................. !+
AN*+, I: -di%o $uente -ambio '.nimo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!20
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 28
I! AN*+, II: *jem)lo de *jecuciones # Resultados!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!29
Para +, centavos.................................................................................................................. -+
Para !-5 (entavos...............................................................................................................-+
Para ./ (entavos ................................................................................................................ -+
AN*+, III: /icencia!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "0
INTRODUCCIN
0GA1 es un $rame2or3 libre 45er ane6o licencia )ara mas in$ormacin7 basado
en la tecnolo%.a 0AVA! *l mismo )ro5ee mecanismos )ara a)licar )rinci)ios
e5oluti5os en la resolucin de )roblemas! Al momento de escribir este documento la
8ltima 5ersin estable de este $rame2or3 es la "!&!"
Nuestro trabajo se $ocali9a en )robar este $rame2or3 # reali9ar un manual
detallado con ejem)los did:cticos ;ue )ermitan a)render a utili9arlo <aciendo mas
le5e su cur5a de a)rendi9aje! Incluiremos =srceen s<ots> )ara <acer esta tarea mas
sim)le!
*n el cd entre%ado con este manual deben encontrarse los si%uientes arc<i5os
adem:s de este documento:
ecli)se?ja5a?%alileo?2in"2!9i)
jd3?6u1&?2indo2s?i@86!e6e
j%a)A"!&!"A$ull!9i)
j%a)A"!&!"Asrc!9i)
INSTAACI!N " C#N$IG%&ACI!N '( (NT#&N#
*n )rimer lu%ar debe dis)onerse de una <erramienta de desarrollo de
a)licaciones ja5a! /ue%o es necesario descar%ar las librer.as 0GA1 #
a%re%arlas a una a)licacin!
Descarga e instalacin de la maquina virtual de java
Antes de descar%ar el *cli)se es necesario dis)oner de la ma;uina 5irtual de
ja5a )ara )oder com)ilar las a)licaciones! *sto lo <ace autom:ticamente el
ecli)se )ero debe tenerse instalada )re5iamente! (e )uede obtener en este
sitio o en el cd!
)tt*+,,-a.a.sun.com,-a.ase,do/nloads,inde0.-s*
Descarga e instalacin del Eclipse para desarrollo en java
0unto con este manual se adjunta la 8ltima 5ersin <asta el d.a de <o# del
*cli)se 4Galileo7 )ara )oder utili9ar el $rame2or3! Be todas $ormas se )uede
bajar de Internet del sitio <tt):CC222!ecli)se!or%Cdo2nloadsC
-omo se muestra en la si%uiente ima%en!
una 5e9 descar%ado el arc<i5o o co)iado desde el cdD debe descom)rimirse en
un directorio a eleccin ejem)lo c:E 0GA1Eecli)se # #a esta listo )ara utili9ar
Descarga e instalacin de JGAP
(e deben descar%ar las librer.as de 0GA1 desde el sitio o$icial <a# un lin3 a la
ultima 5ersin! Fasta el d.a de <o# es la "!&!"! Gambin se inclu#e este arc<i5o
en el cd
<tt):CCsource$or%e!netC)rojectsCj%a)C$ilesC
*n este arc<i5o se encuentran las librer.as # al%unos ejem)los de a)licacin
com)iladosD el arc<i5o j%a)A"A&A"Asrc!9i) contiene todos los cdi%os $uentes!
Bescom)rimir el arc<i5o j%a)A"A&A$ull!9i) en c:Ej%a)Ej%a)$ull
Agregar las libreras a una aplicacin
Hna 5e9 descom)rimido el ecli)se en c:Ej%a)Eecli)se # el $rame2or3 en
c:Ej%a)Ej%a)$ull debemos crear un )ro#ecto en el ecli)se!
*ntramos al ecli)se # creamos un nue5o )ro#ecto ja5a:
1ara esto <acemos clic3 derec<o como se muestra en la ima%en
*scribimos el nombre del )ro#ecto # <acemos clic en $inis< # crea
autom:ticamente un )ro#ecto nue5o
Hna 5e9 creado el )ro#ecto se debe con$i%urar el Iuild 1at< )ara incluir las
librer.as de j%a)! Faciendo clic derec<o en el )ro#ecto # seleccionando Iuild
1at< ?J con$i%ure Iuild 1at<
/ue%o se debe seleccionar la )estaKa /ibrer.as # <acer clic en Add *6ternal
0ars
Iuscar en c:Ej%a)Ej%a)A"!&!"A$ull los si%uientes jars # <acer clic3 en Abrir
reali9ar lo mismo con el directorio c:Ej%a)Ej%a)A"!&!"A$ullElib
Hna 5e9 reali9ado esto #a se )ueden utili9ar las librer.as desde una clase ja5a
de ese )ro#ecto!
INT&#'%CCI!N A #S AG#&IT1#S
G(N2TIC#S
/os al%oritmos %enticos buscan imitar los )rocesos e5oluti5os de la
naturale9a )ara resol5er )roblemas! *n la naturale9a los indi5iduos de una
)oblacin se re)roducen entre si # de esta $orma nacen nue5os indi5iduos!
Godos se someten a una seleccin natural durante sus 5idas en la ;ue los mas
a)tos tienen mas )robabilidades de sobre5i5irD de esta $orma las )oblaciones
e5olucionanD mejoran constantemente # se ada)tan a los nue5os medios!
1ara los al%oritmos %enticos los indi5iduos se denominan cromosomas!
-ada cromosoma es una solucin a un )roblema es)ec.$ico! /as
caracter.sticas de un cromosoma se denominan %enes! Gambin e6iste una
$uncin de a)titudD la cual a)licada a cada cromosoma de5uel5e un 5alor ;ue
indica cuan a)to es # )ermite com)ararlos entre ellos!
Antes de comen9arD es necesario tener una )oblacin inicial! /o ;ue
suele <acerse es crear una )oblacin de cromosomas al a9ar!
Hna 5e9 ;ue se tiene una )oblacin se re)roducen los indi5iduos )ara
obtener ma#or 5ariedadD tal como en la naturale9a! /ue%oD es necesario
seleccionar los mejoresD )ara ir e5olucionando! Fa# 5arios mtodos de
seleccin )ero en %eneral lo ;ue se busca es ;ue los mejores )asen a la
)r6ima %eneracin # al%unos no tan a)tos tambinD #a ;ue la 5ariedad a#uda
a ;ue en la re)roduccin se %eneren cromosomas m:s a)tos aun ;ue sus
)adres! 1uede ;ue de la cru9a de un cromosoma mu# a)to # otro no tanto
resulte uno muc<o mejor a sus )adres!
*n la naturale9a al%unas 5eces sucede un $enmeno llamado mutacin!
*ste es un )e;ueKo cambio en la in$ormacin %entica )roducido
es)or:dicamenteD ;ue )ro5oca un cambio en un indi5iduo! *ste cambio
ase%ura m:s 5ariedad # )ro5oca cambios )ositi5os o ne%ati5os! /os cambios
ne%ati5os deber.an ;uedar en el ol5ido %racias a la seleccin natural # los
)ositi5os )erdurar <aciendo e5olucionar a la )oblacin! 1ara los al%oritmos
tambin se )uede utili9ar mutacin )ara a%re%ar 5ariedad # obtener mejores
soluciones!
1ara lle%ar a buenos resultados es necesario recorrer 5arias
%eneraciones! *s decirD re)roducir 5arias 5eces los indi5iduos # <acer 5arias
selecciones # al%unas )ocas mutaciones! Gambin es necesario determinar
cuando una solucin es su$icientemente a)ta como )ara ace)tarla! 1ara esto
)uede medirse cuanto aumenta la a)titud del mejor cromosoma # si des)us
de 5arias %eneraciones no mejora aun introduciendo mutaciones o aumentando
el numero de cromosomas )odemos decidir dejar de e5olucionar # utili9ar esa
solucin! ,tra tcnica consiste establecer de ante mano cuantas %eneraciones
se 5an a considerar!
12T#'#S '( S((CCI!N
A continuacin se muestran al%unas de las tcnicas de seleccin mas
conocidas
Rueda de ruleta
*ste mtodo consiste en construir una ruleta )articionada en ranuras de i%ual
tamaKoD las cuales se numeran! A cada indi5iduo de la )oblacin se le asi%na
una cantidad de ranuras )ro)orcional a su a)titud!
*l )roceso se re)ite <asta com)letar la cantidad de indi5iduos deseados! *ste
mtodo de seleccin otor%a ma#or )robabilidad de contribuir a la si%uiente
%eneracin a los indi5iduos con ma#or a)titud!
Fa# al%unas otras 5ariantes como )or ejem)loD incluir en la nue5a %eneracin
el mejor re)resentante de la %eneracin actual! *n este casoD se denomina
mtodo elitista!
Seleccin por torneo
*n este caso dos indi5iduos son ele%idos al a9ar de la )oblacin actual # el
mejor o m:s a)to de los dos se coloca en la %eneracin si%uiente! *sto
contin8a <asta ;ue se com)lete la nue5a )oblacin!
asado en el rango
*n este es;uema se mantiene un )orcentaje de la )oblacinD %eneralmente la
ma#or.aD )ara la si%uiente %eneracin! (e coloca toda la )oblacin )or orden
de a)titudD # los ' menos di%nos son eliminados # sustituidos )or la
descendencia de al%uno de los ' mejores con al%8n otro indi5iduo de la
)oblacin!
!"todo Estocstico
1or cada indi5iduo se calcula la a)titud relati5a al )romedio de a)titudes de la
)oblacinD # en $uncin de esto se asi%nan las co)ias! 1or ejem)loD si la a)titud
)romedio de la )oblacin es 1@ # la a)titud del indi5iduo es 10L entonces su
a)titud relati5a es 1!@! *sto si%ni$ica ;ue se colocar: una co)ia en la )r6ima
%eneracin # ;ue se tiene el 0!@ 4@0 M7 de c<ance de colocar una se%unda
co)ia!
12T#'#S '( &(P&#'%CCI!N
A continuacin se muestran al%unas tcnicas )ara re)roducir indi5iduos 4o
cromosomas7!
#ru$a Simple

/os dos cromosomas )adres se cortan )or un )untoD # el material %entico
situado entre ellos se intercambia!
Bada las si%uientes estructuras de lon%itud 1 N 8D # eli%iendo " como el )unto
de cru9a se intercambian los se%mentos de cromosoma se)arados )or este
)unto!
#ru$a de dos puntos
*n este mtodo de cru9a de dos )untosD se seleccionan dos )untos
aleatoriamente a lo lar%o de la lon%itud de los cromosomas # los dos )adres
intercambian los se%mentos entre estos )untos!
#ru$a !ultipunto
*l cromosoma es considerado un anilloD # se eli%en n )untos de cru9a en $orma
aleatoria! (i la cantidad de )untos de cru9a es )arD se intercambian las
)orciones de cromosomas de$inidas entre cada )ar de )untos consecuti5osD si
es im)ar se asume un )unto de cru9a adicional en la )osicin cero # se
)rocede de i%ual modo!
Badas dos estructuras de lon%itud 1 N 8D con n N & )untos de cru9a!
Intercambiando los se%mentos de la )osicin 2 a & # 6 a 7D se tiene:
#ru$a binomial
XYX | XYYYX
YYX | YYXXY
XYX | YYXXY
YYX | XYYYX
X | YXX | Y | YY | X
Y | YXY | Y | XX | Y
X | YXY | Y | XX | X
Y | YXX | Y | YY | Y
1ara %enerar un cromosoma <ijo )or cru9a binomialD se de$ine la )robabilidad
10 como la )robabilidad de ;ue el Alelo de cual;uier )osicin del descendiente
se <erede del )adreD # 1 O 10 como la )robabilidad de ;ue lo <erede de la
madre!
*n este caso se )uede construir un 8nico <ijo )or cada a)licacin del o)eradorD
o bien %enerar un se%undo <ijo como com)lemento del )rimero!
-uando e6iste i%ual )robabilidad de <eredar del )adre como de la madreD 10 N
0D@ la cru9a se denomina uni$orme! 1ara estructuras de lon%itud l la cru9a
uni$orme im)lica un )romedio de lC2 )untos de cru9a!
!utacin
*n la *5olucinD una mutacin es un suceso bastante )oco com8n 4sucede
a)ro6imadamente una de cada mil re)licaciones7D en la ma#or.a de los casos
las mutaciones son letalesD )ero en )romedioD contribu#en a la di5ersidad
%entica de la es)ecie! *n un al%oritmo %entico tendr:n el mismo )a)elD # la
misma $recuencia 4es decirD mu# baja7!
Hna 5e9 establecida la $recuencia de mutacinD )or ejem)loD uno )or milD se
e6amina cada bit de cada cadena! (i un n8mero %enerado aleatoriamente est:
)or debajo de esa )robabilidadD se cambiar: el bit 4es decirD de 0 a 1 o de 1 a
07! (i noD se dejar: como est:! Be)endiendo del n8mero de indi5iduos ;ue
<a#a # del n8mero de bits )or indi5iduoD )uede resultar ;ue las mutaciones
sean e6tremadamente raras en una sola %eneracin!
No <ace $alta decir ;ue no con5iene abusar de la mutacin! *s cierto ;ue es un
mecanismo %enerador de di5ersidadD #D )or tantoD la solucin cuando un
al%oritmo %entico est: estancadoD )ero tambin es cierto ;ue reduce el
al%oritmo %entico a una b8s;ueda aleatoria! (iem)re es m:s con5eniente usar
otros mecanismos de %eneracin de di5ersidadD como aumentar el tamaKo de
la )oblacinD o %aranti9ar la aleatoriedad de la )oblacin inicial!
(J(1P# '( APICACI!N+
1ara )oder entender como $unciona el $rame2or3 # )oder manejarloD un
ejem)lo de a)licacin sim)le es lo indicado!
(u)on%amos ;ue es necesario descom)oner un cierto monto de dinero en la
menor cantidad )osible de monedas! 1or ejem)lo si se tienen 1D"@ )esos 41"@
centa5os7 )uede descom)onerse de la si%uiente $orma:
1 'oneda de un )eso
1 'oneda de 2@ centa5os
1 'oneda de 10 centa5os
" monedas en total
1ero tambin )uede descom)onerse de la si%uiente $orma:
27 'onedas de @ centa5os!
27 monedas en total!
Fa# muc<as $ormas de descom)oner este monto en monedas cada una de
ellas es una solucin )osible al )roblema 4cromosoma7 # tiene un 5alor de
a)titud asociadoD ;ue deber: de)ender de la cantidad de monedas totales de
ese cromosoma! -uantas menos monedas se necesiten mas a)ta ser: la
solucin #a ;ue lo ;ue se busca es lo%rar la menor cantidad de monedas
)osibles!
-ada cromosoma tendr: 6 %enes! /os %enes en este )roblema son n8meros
enteros ;ue re)resentan la cantidad de monedas de cada ti)o
'oneda de un )eso 4100 centa5os7
'oneda de @0 centa5os
'oneda de 2@ centa5os
'oneda de 10 centa5os
'oneda de @ centa5os
'oneda de 1 centa5o
I1P(1(NTACI!N '( (J(1P#
1ara )oder im)lementar una solucin a este )roblema utili9ando j%a) es
necesario indicarle al $rame2or3 una serie de )ar:metros # codi$icar la $uncin
de a)titud!
1ara este caso la clase )rinci)al se llamar: -ambio'inimo # la $uncin a)titud
se codi$icar: en la clase -ambio'inimoPuncionA)titud
*n )rimer lu%ar se debe modelar el )roblemaD es decir de$inir como se
com)one cada %en de los cromosomas 4soluciones )osibles7! 1ara este
)roblema )untual cada %en ser: un n8mero entero # re)resentar: la cantidad
de un ti)o de moneda de ese cromosoma! 1or lo tanto cada cromosoma tendr:
6 %enes
*jem)lo:
-antidad de 'onedas de 1 )eso 2
-antidad de 'onedas de @0 centa5os 1
-antidad de 'onedas de 2@ centa5os 1
-antidad de 'onedas de 10 centa5os 0
-antidad de 'onedas de @ centa5os 0
-antidad de 'onedas de centa5o 0
*ste cromosoma sumar.a 27@ centa5os en & monedas!
Hna 5e9 de$inido el modelo se )uede comen9ar a codi$icar la solucin!
A continuacin se e6)lica a %randes ras%os como se im)lemento el ejem)lo de
a)licacin # ;ue clases # $unciones )rinci)ales se utili9aron! 1ero )ara mas
detalle se encuentra el ane6o con el cdi%o $uete e6)licado instruccin )or
instruccin!
1rimero se debe crear una con$i%uracin con 5alores )redeterminados ;ue
lue%o se ir:n modi$icando
// Se crea una configuracion con valores predeterminados.
// -------------------------------------------------------------
Configuration conf = new DefaultConfiguration();
/ue%o se le indica ;ue el mejor elemento siem)re )ase a la )r6ima
%eneracin
// Se indica en la configuracion que el elemento mas apto siempre pase
// a
// la proxima generacion
// -------------------------------------------------------------
conf.setPreservittest!ndividual(true);
(e crea la $uncin de a)titud ;ue m:s adelante se e6)licar: # se setea en la
con$i%uracin
// Se Crea la funcion de aptitud " se setea en la configuracion
// ---------------------------------------------------------
itnessunction m"unc = new Cam#io$inimouncion%ptitud($onto);
conf.setitnessunction(m"unc);
Gambin se debe crear un cromosoma de ejem)lo )ara ;ue el $rame2or3
cono9ca su estructura
// %&ora se de#e indicar a la configuracion como seran los
cromosoma' // en
// este caso tendran ( genes (uno para cada tipo de moneda) con un
// valor
// entero (candiad de monedas de ese tipo).
// Se de#e crear un cromosoma de e)emplo " cargarlo en la
// configuracion
// Cada gen tendra un valor maximo " minimo que de#e setearse.
// --------------------------------------------------------------
*ene+, sample*enes = new *ene+-,;
sample*enes+., = new !nteger*ene(conf/ ./
$at&.round(Cam#io$inimouncion%ptitud.MAX_MONTO/0..)); // $oneda 0
peso
sample*enes+0, = new !nteger*ene(conf/ ./ 0.); // $oneda (. centavos
sample*enes+1, = new !nteger*ene(conf/ ./ 0.); // $oneda 1( centavos
sample*enes+2, = new !nteger*ene(conf/ ./ 0.); // $oneda 0. centavos
sample*enes+3, = new !nteger*ene(conf/ ./ 0.); // $oneda ( centavos
sample*enes+(, = new !nteger*ene(conf/ ./ 0.); // $oneda 0 centavo
!C&romosome sampleC&romosome = new C&romosome(conf/ sample*enes);
conf.setSampleC&romosome(sampleC&romosome);
*s im)ortante tener en cuenta los 5alores m:6imos # m.nimos #a ;ue si se
car%an malD )odr.a eliminar muc<as soluciones ;ue tal5e9 sean las mejores o si
son mu# am)lios costara mas tiem)o de )rocesamiento lle%ar a soluciones
o)timas
(e )uede con$i%urar el tamaKo ;ue tendr: la )oblacin 4-antidad de
cromosomas de una %eneracin7
conf.setPopulationSi4e(1..);
1ara )oder e5olucionar se necesita una )oblacin inicial! *l $rame2or3 )ermite
car%arla de un 6ml )ero lo mejor en este caso es indicarle ;ue %enere una
)oblacin inicial aleatoria!
Po#lacion = *enot"pe.randomInitialGenotype(conf);
*l mtodo en.ol.e e5oluciona una %eneracin! (e lo llama una cierta cantidad
de 5eces con un loo) )ara ;ue realice cierta cantidad de e5oluciones!
Po#lacion.evolve();
*l mtodo %uardar )oblacin creado )ara este manual %uarda todos los datos
de la )oblacin en un 6ml llamado 1oblacion-amino'inimo!6ml )ara demostrar
como trabaja el Prame2or3 con las )oblaciones # los 6ml! 1ara mas detalle 5er
el cdi%o $uente del ane6o!
guardarPoblacion(Po#lacion);
Be esta $orma se obtiene el cromosoma mas a)to de la )oblacin
!C&romosome cromosoma$as%pto = Po#lacion.getittestC&romosome();
%uncin Aptitud
/a clase ;ue im)lementar: la $uncin a)titud debe <eredar de PitnessPunction
# rede$inir el mtodo
public double evaluate(!C&romosome cromosoma)
*ste mtodo le )ermite al $rame2or3 determinar ;ue cromosoma es mas a)to
;ue otro! *l 5alor de5uelto debe ser un double )ositi5o!
1or de$ectoD se entiende ;ue un 5alor m:s alto de5uelto corres)onde a un
cromosoma mas a)to )ero esto )uede no ser as.D de)ende del e5aluador ;ue
se <a#a utili9ado! *n el ejem)lo se tiene en cuenta esto antes de de5ol5er el
5alor de a)titud!
AN(3# I+ C!'IG# $%(NT( CA14I# 1NI1#
/5
5 6&is file is part of 7*%P.
5
5 7*%P offers a dual license model containing t&e 8*P8 as 9ell as t&e
$P8.
5
5 or licensing information please see t&e file license.txt included
9it& 7*%P
5 or &ave a loo: at t&e top of class org.)gap.C&romosome 9&ic&
representativel"
5 includes t&e 7*%P license polic" applica#le for an" file delivered
9it& 7*%P.
5/
package e)emplos;
import )ava.io.ile;
import org.)gap.C&romosome;
import org.)gap.Configuration;
import org.)gap.itnessunction;
import org.)gap.*ene;
import org.)gap.*enot"pe;
import org.)gap.!C&romosome;
import org.)gap.data.Data6ree;uilder;
import org.)gap.data.!DataCreators;
import org.)gap.impl.DefaultConfiguration;
import org.)gap.impl.!nteger*ene;
import org.)gap.xml.<$8Document;uilder;
import org.)gap.xml.<$8$anager;
import org.92c.dom.Document;
/55
5 =n este e)emplo se muestra como resolver un pro#lema clasico de
algoritmos
5 gen>ticos utili4ando el frame9or: 7*%P. =l pro#lema consiste en
lograr )untar
5 el monto de dinero ingresado a la aplicacion por parametro con la
menor
5 cantidad de monedas posi#les. Para resolver el pro#lema nos #asamos
en la
5 moneda de la ?epu#lica %rgentina. $oneda de 0 Peso ( equivale a 0..
centavos
5 ) $oneda de (. Centavos $oneda de 1( Centavos $oneda de 0. Centavos
$oneda de
5 ( Centavos $oneda de 0 Centavo
5
5 @author *a#riel @eloso
5 @author ?u#en %rce
5 @since 0..
5/
public class Cam#io$inimo A
/55
5 6&e total num#er of times 9eBll let t&e population evolve.
5/
private static final int MAX_EVOLUCIONE_PE!MITI"A = 11..;
/55
5 Calcula utili4ando algoritmos geneticos la soluciCn al
pro#lema " la
5 imprime por pantalla
5
5 @param $onto
5 $onto que se desea descomponer en la menor
cantidad de monedas
5 posi#les
5 @throws =xception
5
5 @author *a#riel @eloso
5 @author ?u#en %rce
5 @since 0..
5/
public static void calcularCam#io$inimo(int $onto)
throws =xception A
// Se crea una configuracion con valores predeterminados.
//
-------------------------------------------------------------
Configuration conf = new DefaultConfiguration();
// Se indica en la configuracion que el elemento mas apto
siempre pase a
// la proxima generacion
//
-------------------------------------------------------------
conf.setPreservittest!ndividual(true);
// Se Crea la funcion de aptitud " se setea en la
configuracion
//
---------------------------------------------------------
itnessunction m"unc = new
Cam#io$inimouncion%ptitud($onto);
conf.setitnessunction(m"unc);
// %&ora se de#e indicar a la configuracion como seran los
cromosoma' en
// este caso tendran ( genes (uno para cada tipo de
moneda) con un valor
// entero (candiad de monedas de ese tipo).
// Se de#e crear un cromosoma de e)emplo " cargarlo en la
configuracion
// Cada gen tendra un valor maximo " minimo que de#e
setearse.
//
--------------------------------------------------------------
*ene+, sample*enes = new *ene+-,;
sample*enes+., = new !nteger*ene(conf/ ./
$at&.round(Cam#io$inimouncion%ptitud.MAX_MONTO/0..)); // $oneda 0
peso
sample*enes+0, = new !nteger*ene(conf/ ./ 0.); // $oneda
(. centavos
sample*enes+1, = new !nteger*ene(conf/ ./ 0.); // $oneda
1( centavos
sample*enes+2, = new !nteger*ene(conf/ ./ 0.); // $oneda
0. centavos
sample*enes+3, = new !nteger*ene(conf/ ./ 0.); // $oneda (
centavos
sample*enes+(, = new !nteger*ene(conf/ ./ 0.); // $oneda 0
centavo
!C&romosome sampleC&romosome = new C&romosome(conf/
sample*enes);
conf.setSampleC&romosome(sampleC&romosome);
// Por ultimo se de#e indicar el tamaDo de la po#lacion en
la
// configuracion
//
------------------------------------------------------------
conf.setPopulationSi4e(1..);
*enot"pe Po#lacion;
// =l frame9or: permite o#tener la po#lacion inicial de
arc&ivos xml
// pero para este caso particular resulta me)or crear una
po#lacion
// aleatoria/ para ello se utili4a el metodo
random!nitial*enot"pe que
// devuelve la po#lacion random creada
Po#lacion = *enot"pe.randomInitialGenotype(conf);
// 8a Po#lacion de#e evolucionar para o#tener resultados
mas aptos
//
---------------------------------------------------------------
long 6iempoComien4o = S"stem.currentTimeMilli#();
for (int i = .; i E MAX_EVOLUCIONE_PE!MITI"A; iFF) A
Po#lacion.evolve();
G
long 6iempoin = S"stem.currentTimeMilli#();
S"stem.out.println(H6iempo total de evolucion' H
F (6iempoin - 6iempoComien4o) F H msH);
guardarPoblacion(Po#lacion);
// Ina ve4 que la po#lacion evoluciono es necesario
o#tener el cromosoma
// mas apto para mostrarlo como solucion al pro#lema
planteado para ello
// se utili4 el metodo getittestC&romosome
!C&romosome cromosoma$as%pto =
Po#lacion.getittestC&romosome();
S"stem.out.println(H=l cromosoma mas apto encontrado tiene
un valor de aptitud de' H
F cromosoma$as%pto.getitness@alue());
S"stem.out.println(HJ esta formado por la siguiente
distru#ucion de monedas' H);
S"stem.out.println(HKtH
F
Cam#io$inimouncion%ptitud.getNumero"eComenda#"eGen(
cromosoma$as%pto/ .) F H $oneda 0
pesoH);
S"stem.out.println(HKtH
F
Cam#io$inimouncion%ptitud.getNumero"eComenda#"eGen(
cromosoma$as%pto/ 0) F H $oneda (.
centavosH);
S"stem.out.println(HKtH
F
Cam#io$inimouncion%ptitud.getNumero"eComenda#"eGen(
cromosoma$as%pto/ 1) F H $oneda 1(
centavosH);
S"stem.out.println(HKtH
F
Cam#io$inimouncion%ptitud.getNumero"eComenda#"eGen(
cromosoma$as%pto/ 2) F H $oneda 0.
centavosH);
S"stem.out.println(HKtH
F
Cam#io$inimouncion%ptitud.getNumero"eComenda#"eGen(
cromosoma$as%pto/ 3) F H $oneda (
centavosH);
S"stem.out.println(HKtH
F
Cam#io$inimouncion%ptitud.getNumero"eComenda#"eGen(
cromosoma$as%pto/ () F H $oneda 0
centavoH);
S"stem.out.println(HPara un total de H
F Cam#io$inimouncion%ptitud
.montoCambioMoneda(cromosoma$as%pt
o)
F H centavos en H
F Cam#io$inimouncion%ptitud
.getNumeroTotalMoneda#(cromosoma$a
s%pto) F H monedas.H);
G
/55
5 $etodo principal' ?eci#e el monto en dinero por parametro
para determinar
5 la cantidad minima de monedas necesarias para formarlo
5
5 @param args
5 $onto de dinero
5 @throws =xception
5
5 @author *a#riel @eloso
5 @author ?u#en %rce
5 @since 0..
5/
public static void main(String+, args) throws =xception A
if (args.lengt& L= 0) A
S"stem.out
.println(H=)ecute el comando de esta
forma' )ava -)ar Cam#io$inimo.)ar ($onto de dinero)H);
G else A
int amount = .;
try A
amount = !nteger.par#eInt(args+.,);
G catch (Mum#erormat=xception e) A
S"stem.out
.println(H=l ($onto de dinero)
de#e ser un numero entero validoH);
S"stem.e$it(0);
G
if (amount E 0
NN amount O=
Cam#io$inimouncion%ptitud.MAX_MONTO) A
S"stem.out.println(H=l monto de diner de#e
estar entre 0 " H
F
(Cam#io$inimouncion%ptitud.MAX_MONTO - 0)
F H.H);
G else A
calcularCambioMinimo(amount);
G
G
G
//
---------------------------------------------------------------------
// =ste metodo permite guardar en un xml la ultima po#lacion
calcualda
//
---------------------------------------------------------------------
public static void guardarPo#lacion(*enot"pe Po#lacion) throws
=xception A
Data6ree;uilder #uilder = Data6ree;uilder.getIn#tance();
!DataCreators doc1 =
#uilder.represent*enot"pe%sDocument(Po#lacion);
// create <$8 document from generated tree
<$8Document;uilder doc#uilder = new <$8Document;uilder();
Document xmlDoc = (Document)
doc#uilder.#uildDocument(doc1);
<$8$anager.%rite&ile(xmlDoc/ new
ile(HPo#lacionCam#io$inimo.xmlH));
G
G

package e)emplos;
import org.)gap.5;
/55
5 uncion de %ptitud para Cam#io $inimo
5
5 @author *ar#iel @eloso
5 @author ?u#en %rce
5 @since 0..
5/
public class Cam#io$inimouncion%ptitud extends itnessunction A
private final int montoP#)etivo;
// $aximo monto posi#le 0... Centavos = 0. Pesos
public static final int MAX_MONTO = 0...;
// $axima cantidad de monedas posi#les. =s igual al $onto maximo
en
// centavos/ "a que si se utili4an monedas de un centavo se
llegaria al
// monton con la ma"or cantidad posi#le de monedas
public static final int MAX_CANT_MONE"A = MAX_MONTO;
// =l constructor de la funcion de aptitud de#e reci#ir el monto
o#)etivo
// del pro#lema " almacenarlo en un atri#uto. Si el monto es
invalido arro)a
// una excepcion
public Cam#io$inimouncion%ptitud(int monto) A
if (monto E 0 NN monto O= MAX_MONTO) A
throw new !llegal%rgument=xception(
H=l monto de#e ser un numero entre 0 " H
F MAX_MONTO
F H centavosH);
G
montoP#)etivo = monto;
G
/55
5 =l metodo evaluate es el metodo que se de#e so#recargar para
que devuelva
5 el valor de aptitud asociado al cormosoma que se reci#e por
parametro.
5
5
5 @param cromosoma
5 =l cromosoma a evaluar
5
5 @return =l valor de aptitud de ese cromosoma
5 @author *a#riel @eloso/ ?u#en %rce
5/
public double evaluate(!C&romosome cromosoma) A
// Se de#e tener en cuenta el evaluador que se esta
usando. =l evaluador
// estandar le asigna un valor mas apto a los valores mas
altos de
// aptitud. 6am#ien &a" otros evaluadores que asignan
me)or aptitud a
// los valores mas #a)os.
// =s por esto que se c&equea si 1 es mas apto que 0. Si
esto es asi
// entonces el valor mas apto sera el ma"or " el menos
apto el .
boolean evaluador=standard = cromosoma.getConfiguration()
.getitness=valuator().isitter(1/ 0);
int montoCam#io$onedas = montoCambioMoneda(cromosoma);
int total$onedas = getNumeroTotalMoneda#(cromosoma);
int diferencia$onto = $at&.ab#(montoP#)etivo -
montoCam#io$onedas);
// =l primer paso es asignar la menor aptitud a aquellos
cromosomas cu"o
// monto no sea el monto o#)etivo. =s decir una
descomposicion en
// monedas que no sea del monto ingresado
if (evaluador=standard) A
if (diferencia$onto L= .)
return ...d;
G else A
if (diferencia$onto L= .)
return MAX_CANT_MONE"A;
G
// luego se de#e asignar mas aptitud a aquellos cromosomas
que posean
// menor cantidad de monedas.
if (evaluador=standard) A
// Se de#e asgurar devolver un valor de aptitud
positivo siempre.
// Si el valor es negativo se devuelve
$%<QC%M6Q$PM=D%S ( elemento
// menos apto )
return $at&.ma$(...d/ MAX_CANT_MONE"A -
total$onedas);
G else A
// Se de#e asgurar devolver un valor de aptitud
positivo siempre.
// Si el valor es negativo se devuelve . ( elemento
menos apto )
return $at&.ma$(...d/ total$onedas);
G
G
/55
5 Calcula el monto total que suman todas las monedas de un
cromosoma
5
5
5 @param cromosoma
5 =l cromosoma a evaluar
5 @return ?etorna el monto en centavos compuesto por la suma de
las monedas
5 de ese cromosoma
5
5 @author *a#riel @eloso/ ?u#en %rce
5
5/
public static int montoCam#io$oneda(!C&romosome cromosoma) A
int $oneda0Peso = getNumero"eComenda#"eGen(cromosoma/ .);
int $oneda(.Centavos = getNumero"eComenda#"eGen(cromosoma/
0);
int $oneda1(Centavos = getNumero"eComenda#"eGen(cromosoma/
1);
int $oneda0.Centavos = getNumero"eComenda#"eGen(cromosoma/
2);
int $oneda(Centavos = getNumero"eComenda#"eGen(cromosoma/
3);
int $oneda0Centavo = getNumero"eComenda#"eGen(cromosoma/
();
return ($oneda0Peso 5 0..) F ($oneda(.Centavos 5 (.)
F F($oneda1(Centavos 5 1() F ($oneda0.Centavos
5 0.)
F ($oneda(Centavos 5 () F $oneda0Centavo;
G
/55
5 Calcula la cantidad de monedas de determinado tipo (gen) de
un cromosoma
5 =)emplo. Cantidad de monedas de 1( centavos de es cromosoma
5
5 @param cromosoma
5 =l cromosoma a evaluar
5 @param numero*en
5 =l numero gen (tipo de moneda) de que se desea
averiguar la
5 cantidad
5 @return Devuelve la cantidad de moendas de ese tipo de ese
cromosoma
5
5
5 @author *a#riel @eloso/ ?u#en %rce
5/
public static int getMumeroDeComendasDe*en(!C&romosome
cromosoma/
int numero*en) A
!nteger num$onedas = (!nteger)
cromosoma.get*ene(numero*en).get%llele();
return num$onedas.int@alue();
G
/55
5 Calcula el total de monedas que tiene esa solucion. =ste
valor se utili4a
5 para calcular la aptitud del cormosoma "a que el o#)etivo es
minimi4ar la
5 cantidad de monedas de la solcion
5
5
5 @param cromosoma
5 =l cromosoma a evaluar
5 @return =l total de monedas que tiene esa solucion
5
5 @author *a#riel @eloso/ ?u#en %rce
5/
public static int getMumero6otal$onedas(!C&romosome cromosoma) A
int total$onedas = .;
int num#erPf*enes = cromosoma.si4e();
for (int i = .; i E num#erPf*enes; iFF) A
total$onedas F= getNumero"eComenda#"eGen(cromosoma/
i);
G
return total$onedas;
G
G

I. AN(3# II+ (J(1P# '( (J(C%CI#N(S " &(S%TA'#S
Para &' centavos
6iempo total de evoluciCn' 0R2S( ms
=l cromosoma mas apto encontrado tiene un valor de aptitud
de' TT-..
J esta formado por la siguiente distri#uciCn de monedas'
. $oneda 0 peso
0 $oneda (. centavos
0 $oneda 1( centavos
0 $oneda 0. centavos
0 $oneda ( centavos
. $oneda 0 centavo
Para un total de T. centavos en 3 monedas.
Para ()* #entavos
6iempo total de evoluciCn' 0(S2( ms
=l cromosoma mas apto encontrado tiene un valor de aptitud
de' TTR..
J esta formado por la siguiente distri#uciCn de monedas'
0 $oneda 0 peso
. $oneda (. centavos
0 $oneda 1( centavos
. $oneda 0. centavos
. $oneda ( centavos
. $oneda 0 centavo
Para un total de 01( centavos en 1 monedas.
Para +, #entavos
J esta formado por la siguiente distri#uciCn de monedas'
. $oneda 0 peso
0 $oneda (. centavos
0 $oneda 1( centavos
0 $oneda 0. centavos
. $oneda ( centavos
1 $oneda 0 centavo
Para un total de RS centavos en ( monedas.
AN(3# III+ IC(NCIA
*ste $ra%mento esta )ublicado en la ):%ina )rinci)al de 0GA1 donde e6)lica
;ue es un so$t2are libre! 1ero si se ;uiere utili9ar de $orma comercial es
necesario donar al menos 20 euros a 0GA1!
JGAP is 5ree so5t/are6 7ou can redistri8ute it and,or modi57 it under t)e
terms o5 t)e GN% esser Pu8lic icense as *u8lis)ed 87 t)e $ree
So5t/are $oundation6 eit<er 5ersion 2!1 o$ t<e /icenseD or 4at #our o)tion7 an#
later 5ersion! InsteadD #ou could c<oose to use t<e 'o9illa 1ublic /icense to use
0GA1 in commercial a))lications 2it<out t<e need o$ )ublis<in% #our source
code or ma3e it re5erse en%ineerable 4as is re;uired 2it< t<e GNH /icense7!
$or using t)e 1P 7ou )a.e to donate at least 20 (uros to 0GA1! 'a#be
#ou 2ould li3e to bro2ser $urt<er in$ormation about usin% 0GA1 commerciall#!
0GA1 is distributed in t<e <o)e t<at it 2ill be use$ulD but QIGF,HG ANR
QARRANGRL 2it<out e5en t<e im)lied 2arrant# o$ '*R-FANGAII/IGR or
PIGN*(( P,R A 1ARGI-H/AR 1HR1,(*! (ee t<e abo5e mentioned GNH
/esser 1ublic /icense and t<e 'o9illa 1ublic /icense $or more details! Iut 2e
o$$er reall# a lot o$ unit tests 2<ic< <el) assure a 5er# <i%< )robabilit# $or a
correct )iece o$ so$t2areS

Potrebbero piacerti anche