0 evaluări0% au considerat acest document util (0 voturi)
11 vizualizări30 pagini
Este documento introduce los algoritmos genéticos y su implementación en JGAP. Explica cómo descargar e instalar JGAP y Eclipse, y cómo agregar las librerías de JGAP a un proyecto en Eclipse. Luego resume los conceptos básicos de los algoritmos genéticos como cromosomas, genes, aptitud y cómo se aplican procesos de selección, reproducción y mutación para evolucionar una población hacia mejores soluciones. Finalmente describe algunos métodos comunes de selección como rueda de ruleta.
Este documento introduce los algoritmos genéticos y su implementación en JGAP. Explica cómo descargar e instalar JGAP y Eclipse, y cómo agregar las librerías de JGAP a un proyecto en Eclipse. Luego resume los conceptos básicos de los algoritmos genéticos como cromosomas, genes, aptitud y cómo se aplican procesos de selección, reproducción y mutación para evolucionar una población hacia mejores soluciones. Finalmente describe algunos métodos comunes de selección como rueda de ruleta.
Este documento introduce los algoritmos genéticos y su implementación en JGAP. Explica cómo descargar e instalar JGAP y Eclipse, y cómo agregar las librerías de JGAP a un proyecto en Eclipse. Luego resume los conceptos básicos de los algoritmos genéticos como cromosomas, genes, aptitud y cómo se aplican procesos de selección, reproducción y mutación para evolucionar una población hacia mejores soluciones. Finalmente describe algunos métodos comunes de selección como rueda de ruleta.
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