Professional Documents
Culture Documents
10 de junio de 2012
10mo MDULO A
INTELIGENCIA ARTIFICIAL
Leonardo Bravo
INTELIGENCIA ARTIFICIAL
10 de junio de 2012
JGAP
JGAP 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 JGAP
Primeramente 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.
Leonardo Bravo
INTELIGENCIA ARTIFICIAL
10 de junio de 2012
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 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) + "
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 ARTIFICIAL
private 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