Tutorial de aplicacón de JGAP

Embed Size (px)

Citation preview

INTELIGENCIA ARTIFICIAL

10 de junio de 2012

REA DE LA ENERGA, LAS INDUSTRIAS Y LOS RECURSOS NATURALES NO RENOVABLESCARRERA DE INGENIERA EN SISTEMAS

10mo MDULO A

INTELIGENCIA ARTIFICIAL

Nombre: Leonardo David Bravo Brito

DOCENTE: Ing. Luis Chamba

LOJA ECUADOR 2012

Leonardo Bravo

INTELIGENCIA ARTIFICIAL

10 de junio de 2012

JGAPJGAP son las siglas de Java Genetic Algorithms Package (paquete de algoritmos genticos para Java). Es un componente de programacin de algoritmos genticos que se utiliza como un framework. Los algoritmos genticos son algoritmos de bsqueda que funcionan a travs del proceso de seleccin natural. Se inicia con un conjunto de muestras de las posibles soluciones que luego evoluciona hacia un conjunto de soluciones ms ptimas. Dentro del conjunto de la muestra, las soluciones que son pobres tienden a desaparecer, mientras que las mejores soluciones son seleccionadas para poder reproducirse. Adems los algoritmos Genticos usan una analoga 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, 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. Las operaciones bsicas del algoritmo gentico son simples y directas: Seleccin: Los cromosomas con mejor aptitud tienen mayor probabilidad de ser seleccionados. Recombinacin: Opera sobre dos cromosomas a la vez para generar dos descendientes donde se combinan las caractersticas de ambos cromosomas padres. Mutacin: modifica al azar parte del cromosoma de los individuos, y permite alcanzar zonas del espacio de bsqueda que no estaban cubiertas por los individuos de la poblacin actual. Reemplazo: una vez aplicados los operadores genticos, se seleccionan los mejores individuos para conformar la poblacin de la generacin siguiente

JGAP tiene clases e interfaces para representar: Genes (Gene), cromosomas (Chromosome), individuos (IChromosome), la poblacin (Genotype), la funcin de ajuste (Fitness Function) y operadores genticos. Tambin se encarga de la simulacin de un ambiente para que se desarrolle y sobreviva la mejor solucin. El motor gentico crea varias soluciones (individuos) aleatoriamente con el mtodo randomInitialGenotype(). Aplica operadores genticos (mutacin y combinacin) para que surjan nuevas soluciones con el mtodo evolve(). Pone a prueba cada solucin con la funcin de ajuste evaluate(). Y por ltimo retorna el cromosoma del individuo mejor adaptado con getFittestChromosome(). JGAP es software libre y se puede distribuir bajo la GNU Lesser Public License 2.1 o posterior. Para aplicaciones comerciales que no quieran publicar su cdigo fuente deben distribuirse bajo la Mozilla Public License.

Leonardo Bravo

INTELIGENCIA ARTIFICIAL

10 de junio de 2012

Instalacin de JGAPPrimeramente nos dirigimos a descargar la ltima versin de JGAP, para ello ingresamos a la siguiente direccin: http://sourceforge.net/projects/jgap/files/

Dentro de esta pgina hacemos clic en Download jgap_3.6.2_full.zip (10.5 MB) y esperamos a que se descargue todo el archivo. Agregar JGAP a NetBeans IDE 6.9.1 Una vez descargando descargado lo descomprimimos, luego nos dirigimos a NetBeans, abrimos el proyecto ejemplo: JGAPPractica y nos vamos a la parte de Bibliotecas.

Leonardo Bravo

INTELIGENCIA ARTIFICIAL Hacemos clic derecho en Bibliotecas y luego clic en Agregar archivo JAR/Carpeta.

10 de junio de 2012

Ubicamos la direccin donde descomprimimos las libreras de JGAP, y seleccionamos el archivo jgap y hacemos clic en Abrir.

Listo la librera se agregar a nuestro proyecto.

Leonardo Bravo

INTELIGENCIA ARTIFICIAL

10 de junio de 2012

Ejemplo con JGAPEn este ejemplo se muestra cmo resolver un problema clsico de algoritmos genticos utilizando el framework JGAP. El problema consiste en lograr juntar el monto de dinero ingresado a la aplicacin por parmetro con la menor cantidad de monedas posibles. Este problema se adapt para el sistema monetario de Ecuador con la moneda de 1 dlar moneda de 50 centavos, moneda de 25 centavos, moneda de 10 centavos, Moneda de 5 centavos y moneda de 1 centavo. En primer lugar se debe modelar el problema, para adaptarlo a la moneda ecuatoriana; para ello nos dirigimos a la clase CambioMinimoFuncionAptitud dentro de esta clase modificamos el mtodo montoCambioMoneda de la siguiente forma:public static int montoCambioMoneda(IChromosome cromosoma) { int unDolar = getNumeroDeComendasDeGen(cromosoma, 0); int cincuentaCentavos = getNumeroDeComendasDeGen(cromosoma, 1); int veinticincoCentavos = getNumeroDeComendasDeGen(cromosoma, 2); int diezCentavos = getNumeroDeComendasDeGen(cromosoma, 3); int cincoCentavos = getNumeroDeComendasDeGen(cromosoma, 4); int unCentavo = getNumeroDeComendasDeGen(cromosoma, 5); return (unDolar * 100) + (cincuentaCentavos * 50) + (veinticincoCentavos * 25) + (diezCentavos * 10) + (cincoCentavos * 5) + unCentavo; }

Luego nos vamos a la clase CambioMinimo y dentro del mtodo calcularCambioMinimo (int Monto) cambiamos los cromosomas que tendrn 6 genes:Gene[] sampleGenes = new Gene[6]; sampleGenes[0] = new IntegerGene(conf, 0, Math.round(CambioMinimoFuncionAptitud.MAX_MONTO / sampleGenes[1] = new IntegerGene(conf, 0, 10); // Moneda sampleGenes[2] = new IntegerGene(conf, 0, 10); // Moneda sampleGenes[3] = new IntegerGene(conf, 0, 10); // Moneda sampleGenes[4] = new IntegerGene(conf, 0, 10); // Moneda sampleGenes[5] = new IntegerGene(conf, 0, 10); // Moneda

100)); // Moneda (1 dolar) (50 centavos) (25 centavos) (10 centavos) (5 centavos) (1 centavos)

Para mostrar la solucin al problema declaramos los siguientes atributos con sus respectivos mtodos Set y Get:private static String resultadoMonedas = ""; private static String tiempoEvolucion, valorAptitud, totalMonedas, valorIngresado;

En el atributo resultadoMonedas se almacenar toda la distribucin de las monedas:7 Moneda 1 dlar 1 Moneda 50 centavos,

En el de tiempoEvolucion se guardar el tiempo que se demora en resolver el problema, el de valorAptitud permitir almacenar valor de aptitud del cromosoma ms apto, totalMonedas tendr el

Leonardo Bravo

INTELIGENCIA ARTIFICIAL

10 de junio de 2012

nmero total de las monedas para el cambio y el valorIngresado se guardar el valor en centavos que fue ingresado para realizar el cambio.tiempoEvolucion = "" + (TiempoFin - TiempoComienzo); valorAptitud = "" + cromosomaMasApto.getFitnessValue(); resultadoMonedas += "" + CambioMinimoFuncionAptitud.getNumeroDeComendasDeGen(cromosomaMasApto, Moneda 1 Dolar" + "\n"; resultadoMonedas += "" + CambioMinimoFuncionAptitud.getNumeroDeComendasDeGen(cromosomaMasApto, Moneda 50 Centavos" + "\n"; resultadoMonedas += "" + CambioMinimoFuncionAptitud.getNumeroDeComendasDeGen(cromosomaMasApto, Moneda 25 Centavos" + "\n"; resultadoMonedas += "" + CambioMinimoFuncionAptitud.getNumeroDeComendasDeGen(cromosomaMasApto, Moneda 10 Centavos" + "\n"; resultadoMonedas += "" + CambioMinimoFuncionAptitud.getNumeroDeComendasDeGen(cromosomaMasApto, Moneda 5 Centavos" + "\n"; resultadoMonedas += "" + CambioMinimoFuncionAptitud.getNumeroDeComendasDeGen(cromosomaMasApto, Moneda 1 Centavos" + "\n";

0) + "

1) + "

2) + "

3) + "

4) + "

5) + "

valorIngresado = ""+ CambioMinimoFuncionAptitud.montoCambioMoneda(cromosomaMasApto); totalMonedas = ""+ CambioMinimoFuncionAptitud.getNumeroTotalMonedas(cromosomaMasApto);

Se agreg el siguiente mtodo en vez del main para poder ejecutar el algoritmo, este recibe el monto en dinero por parmetro para determinar la cantidad mnima de monedas necesarias para formarlo.public static void ejecutarCambio(int monto) { try { //monto = Integer.parseInt(args[0]); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "El (Monto de dinero) debe ser un numero entero valido"); System.exit(1); } if (monto < 1 || monto >= CambioMinimoFuncionAptitud.MAX_MONTO) { OptionPane.showMessageDialog(null, "El monto de dinero debe estar entre 1 y " + (CambioMinimoFuncionAptitud.MAX_MONTO - 1) + "."); } else { try { calcularCambioMinimo(monto); } catch (Exception ex) { Logger.getLogger(CambioMinimo.class.getName()).log(Level.SEVERE, null,ex); } } }

Para darle un valor agregado al algoritmo se agreg una ventana (JFrame) llamado CambioMinimoFrame dentro de esta se cre un objeto de clase CambioMinimo para hacer uso de sus mtodos.CambioMinimo cambioMinimo = new CambioMinimo();

Leonardo Bravo

INTELIGENCIA ARTIFICIAL

10 de junio de 2012

Se cre dos mtodos, el uno para controlar cuando ingrese letras o caracteres en la caja de texto del valor y el otro cuando no se ingresa nada en la caja de texto:public boolean verificaNumero(String valor) { boolean verf = false; int cont = 0; for (int i = 0; i < valor.length(); i++) { if (Character.isDigit(valor.charAt(i))) { cont++; } } if (cont == valor.length()) { verf = true; } return verf; } public boolean verificaCampos(String valor) { if (valor.isEmpty()) { return true; } return false; }

Dentro de la clase CambioMinimoFrame se agreg los eventos en el botn CALCULAR CAMBIO y Nuevo Valor.private void btnCalcularCambioActionPerformed(java.awt.event.ActionEvent evt) { if (this.verificaCampos(jTextField1.getText())) { JOptionPane.showMessageDialog(null, "ADVERTENCIA: Los campo valor esta vacio"); } else { if (this.verificaNumero(jTextField1.getText())) { String valor = jTextField1.getText(); int monto = Integer.parseInt(valor); try { cambioMinimo.ejecutarCambio(monto); } catch (Exception ex) { Logger.getLogger(CambioMinimoFrame.class.getName()). log(Level.SEVERE, null, ex); } jTextArea1.setText(cambioMinimo.getResultadoMonedas()); jTextField1.setEditable(false); jTextField2.setText(cambioMinimo.getTiempoEvolucion()); jTextField3.setText(cambioMinimo.getValorAptitud()); jTextField4.setText(cambioMinimo.getValorIngresado()); jTextField5.setText(cambioMinimo.getTotalMonedas()); } else { JOptionPane.showMessageDialog(null, "ADVERTENCIA: ingrese el valor en numeros"); } } Configuration.reset(); }

Leonardo Bravo

INTELIGENCIA ARTIFICIALprivate void btnNuevoValorActionPerformed(java.awt.event.ActionEvent evt) { jTextArea1.setText(null); jTextField1.setText(null); jTextField2.setText(null); jTextField3.setText(null); jTextField4.setText(null); jTextField5.setText(null); jTextField1.setEditable(true); cambioMinimo.setResultadoMonedas(""); }

10 de junio de 2012

Ejecucin del Programa Primero ingresamos el monto que deseamos que se haga el cambio en este caso ingresamos 797 lo cual equivale a 7 dlares y 97 centavos, y hacemos clic en CALCULAR CAMBIO.

Esperamos, luego el algoritmo nos mostrar en la ventana la mejor forma de dar cambio.

Leonardo Bravo

INTELIGENCIA ARTIFICIAL

10 de junio de 2012

Al hacer clic en Nuevo Valor todos los campos se limpiarn y permitir poder ingresar un nuevo monto a calcular.

Leonardo Bravo