martes, 7 de agosto de 2012

Exportación de información en XML y PDF


El sistema tiene la capacidad de exportar información a archivos en formato XML y PDF, para esta funcionalidad se implemento una pantalla para cada caso, para la exportación de información estoy tomando el catalogo de Funciones Objetivo que se encuentran en la BD, para implementar en la GUI esta función se  agrego un par de servicios más a la interface FuncionObjetivoService, en su implementación, se utilizan las clases del paquete ags.xml FuncionesObjetivoXML y FuncionesObjetivoXMLToPDF para cada exportación.
El usuario puede acceder a estas funcionalidades desde el menú Exportar -> Función Objetivo =>XML, esta pantalla se muestra en las siguientes imágenes:





Para seleccionar la ruta en donde se guardará el archivo XML así como su nombre se utiliza la clase, como se muestra a continuación:



 

Para la funcionalidad de exportar e PDF se utiliza el mismo archivo XML que se generó en el paso anterior, para esta parte es necesario contar con el archivo de transformación XSLT para el catalogo de Funciones Objetivo. Se accede desde el menú:
Exportar -> Función Objetivo XML => PDF, el proceso para convertir el XML en PDF se ilustra a continuación:




Los archivos (XML) se pueden visualizar en el Navegador web para revisar sus datos y confirmar que es un archivo XML bien formado, pero para realizar la validación mediante su correspondiente xsd usé la herramienta XML-Writer y así confirme la validez del archivo XML.






La generación del archivo XML del catalogo de Funciones Objetivo solo tiene 3 campos, el primero es el id que tiene en la BD, la ecuación desarrollada correspondiente y los rangos de búsqueda para la variable X y para la Variable Y.  Finalmente el PDF se ve así:



 Por último les dejo el código del XML y del XSD que lo valida.:


funcionesObjetivo.xml

    
        19.0 + 1.0 X pot(2.0) + 1.0 Y + 7.0 Y pot(3.0)
        5
        -10.0
        12.1
        1.0
        5.0
        Maximizar
    
    
        11.0 + 7.0 exp(9.0 X) + 3.0 cos(5.0 Y) + 9.0 Y log(8.0 Y)
        5
        0.0
        9.0
        0.0
        5.0
        Maximizar
    
    
        19.0 tan(1.0 X) + 12.0 tan(1.0 Y) + 15.0 X cot(5.0 X) + 17.0 sen(3.0 Y)
        5
        0.0
        5.0
        6.7
        19.0
        Maximizar
    
    
        12.0 X + 9.0 Y pot(2.0) + 89.12 X log(10.0 X) + 3.1415 exp(999.0 Y)
        5
        -1.0
        7.8
        -3.5
        1.5
        Maximizar
    
    
        12.0 X pot(23.0) + 34.0 sen(45.0 X) + 56.0 Y sen(67.0 Y) + 78.0 Y csc(89.0 Y)
        5
        25.1
        89.3
        -12.0
        8.5
        Maximizar
    
    
        21.5 + 12.566370614359172 X sen(1.0 X) + 62.83185307179586 Y sen(1.0 Y)
        5
        -3.0
        12.1
        4.1
        5.8
        Maximizar
    
    
        21.5 + 12.5663 X sen(1.0 X) + 62.8318 Y sen(1.0 Y)
        5
        1.0
        18.5
        -5.0
        2.0
        Maximizar
    

sdx.xsd

    
        
            
                
                    
                        
                            
                            
                            
                            
                            
                            
                            
                        
                        
                    
                
            
        
    

domingo, 5 de agosto de 2012

Operaciones CRUD en el Sistema con BD

Estructura de Paquetes del Proyecto

Para el desarrollo del sistema he adoptado usar la estructura de paquetes sugerida.
Esta estructura está organizando mediante paquetes con el nombre principal de ags, Algoritmo Genético Simple. A continuación enlisto los paquetes que tengo hasta el momento:
  1. ags.core: Contiene las clases pertenecientes al propio algoritmo genético.
  2. ags.dao: Incluye las clases que proporcionan la interface con la base de datos, como su nombre lo indica, Objetos de Acceso a Datos.
  3. ags.gui: En este paquete se tienen todas las clases que proporcionan la interface gráfica de usuario usando Swing.
  4. ags.service: Aquí se especifican las clases que son las encargadas de brindar servicios a otras capas del sistema, por ejemplo a la gui.
  5. ags.util: Las clases que sirven como utilerías son almacenadas en este paquete.


Implementación de las operaciones CRUD (Create Read Update Delete) en el Sistema

La operación Create está implementada en la creación nuevas Funciones Objetivo, los datos de una función se deben guardar en 2 tablas distintas, FuncionObjetivo y Elemento. Para acceder a este servicio tengo la interface FuncionObjetivoService que en su implementación utiliza a la implementación de la interface FuncionObjetivoDao para acceder a los datos de la Base de Datos de MySQL mediante el JDBC.

Las 4 operaciones mencionadas, están incluidas en la clase FuncionObjetivoService; el método recordFuncionObjetivo() se encarga de insertar una nueva función objetivo al la BD, para ello se realiza con una Transacción que incluye la inserción de los diferentes términos de la función objetivo en la tabla Elemento, para después, con los id’s generados de estas inserciones y los otros datos de la función objetivo guardar en la tabla FuncionObjetivo un nuevo registro.

Para que el usuario aceda a esta operación se tiene la opción de Nueva Función Objetivo dentro de Menú -> Función Objetivo. En la ventana correspondiente se pueden ingresar los datos de los coeficientes de A y B de cada uno de los 4 elementos o términos de la función objetivo, así como la variable de la cual dependen y la función base  asociada.
Del mismo modo se puede generar la vista preliminar de la función que se está configurando, oprimiendo el botón “Vista Preliminar”.


La operación Delete esta implementada en el método deleteFuncionObjetivo() de la clase FuncionObjetivoServiceImpl, y el usuario puede acceder a ella mediante: Menú -> Función Objetivo -> Eliminar Función Objetivo, en esta ventana se en listan las funciones que se encuentran en ese momento en la BD del sistema (aquí se implementa la operación Read), al oprimir el botón “Eliminar”, se eliminará la función objetivo que se encuentre seleccionada en el JComboBox. La ventana se presenta abajo:




La operación  Update también esta implementada como las anteriores, en la interface de FuncionObjetivoService,  y es accesible al usuario mediante el menú:
Menú -> Función Objetivo -> Editar Función Objetivo. Es esa pantalla aparece la lista de funciones que se encuentran en la BD, al seleccionar una y oprimir el botón Actualizar abre otra ventana donde aparecen todos los valores de la función seleccionada para poder modificarlos.
Para aplicar los cambios se debe oprimir el botón Actualizar sí todo va bien, se mostrara el aviso correspondiente. Dicho proceso se muestra en imágenes como sigue:





sábado, 4 de agosto de 2012

Usar un JComboBox() con Clases propias en Java


JComboBox del paquete Swing nos genera una Lista Desplegable, ComboBox o tambien llamado Dropdownlist. La funcionalidad default de esta clase es un poco limitada si es que queremos desplegar objetos de nuestras Clases. Para poder usar nuestras propias clases en él debemos implementar la interface ComboBoxModel.
La clase que quieramos mostrar tenemos que sobreescribir el metodo toString(), que es lo que aparecerá como elemento en la lista desplegable. 
En mi caso necesitaba mostrar en una lista las Funciones Objetivos que se encuentar almacenadas en la Base de Datos del Sistema.
Aqui el código de la Clase FOComboModel que implementa ComboBoxModel:

    import java.util.ArrayList;
    import javax.swing.ComboBoxModel;
    import javax.swing.event.ListDataEvent;
    import javax.swing.event.ListDataListener;
    import ags.core.FuncionObjetivo;
    
    public class FOComboModel implements ComboBoxModel  {
    
        private ArrayList<FuncionObjetivo> data = new ArrayList<FuncionObjetivo>();
        private ArrayList<ListDataListener> list = new ArrayList<ListDataListener>();
        private FuncionObjetivo selectedItem;
        
        public FOComboModel(ArrayList<FuncionObjetivo> data) {
            this.data = data;
        }
    
        public int getSize() {
            return data.size();
        }
    
        public Object getElementAt(int index) {
            return data.get(index);
        }
    
        public Object getSelectedItem() {
            return selectedItem;
        }
    
        public void setSelectedItem(Object elItem) {
            selectedItem = elItem instanceof FuncionObjetivo ? (FuncionObjetivo) elItem : null;
            for (ListDataListener l : list) {
                l.contentsChanged(new ListDataEvent(this, javax.swing.event.ListDataEvent.CONTENTS_CHANGED, 0, 0));
            }  
        }
        
        public void addListDataListener(ListDataListener l) {
            list.add(l);
        }
        
        public void removeListDataListener(ListDataListener l) {
            list.remove(l);
        }
    
    
    } // Fin Class FOComboModel
    

Con esto al momento de crear un JComboBox usamos nuestro propio ComboBoxModel, y podemos usar los mismos metodos que con el default, getSelectedItem() como se ha implementado, regresa el objeto que se ha seleccionado en la Lista Desplegable y podemos obener su Id con su geter definido. Aquí muestro mi codigo para mostrar una lista de Funciones Objetivo de mi Sistema:

// Definimos el ComboBox y el ComboModel
 private JComboBox jComboBox1;
 private FOComboModel foComboModel;

// Instanciamos el ComboModel
 foComboModel = new FOComboModel(foService.getFuncionesObjetivo());

// Instaciamos el ComboBox
    jComboBox1 = new JComboBox();
    getContentPane().add(jComboBox1);
    jComboBox1.setModel(foComboModel);

// En la funcion ActionListener revisar el elemento seleccionado
  FuncionObjetivo foSel;
  foSel = (FuncionObjetivo)jComboBox1.getSelectedItem()

Por ultimo la pantalla en Swing con el ComboBox usando la Clase FuncionObjetivo se ve así:



Para más informacion consultar The Java™ Tutorials.

lunes, 23 de julio de 2012

Diseño de la Interface Gráfica del Sistema de Escritorio


Para que el usuario interactúe con el sistema se muestra la pantalla principal y a continuación una breve descripción: 

En la pantalla principal se muestra el menú de opciones Menú, y el de Información. Se tiene el botón de Run que es el botón para ejecutar el AGS con la función que se tenga actualmente, inicialmente se pone por defaul una. Se presenta una tabla donde se desplegarán los resultados del ciclo evolutivo del Algoritmo Genético, el número de Iteración o generación, el valor de la Función Objetivo, y los valores para las variables X y Y encontrados para optimizar dicha función.
En la parte inferior se muestra el reloj y la fecha actual del sistema.

 
En el Menú se tienen las siguientes opciones de selección:

-          Función Objetivo; que a su vez contiene 2 opciones para administrar las Funciones Objetivo almacenadas en el sistema.

-          Algoritmo Genético; que muestra las opciones para configurar los parámetros del AG, y la posibilidad para realizar un conjunto de experimentos o múltiples ejecuciones del AG.

En el menú Información se presentan dos opciones una para obtener información general de los Algoritmos Genéticos y la otra Acerca de... donde se presenta información y créditos del sistema. Estas opciones se muestran en la imagen de abajo.

 
Para poder Configurar los parámetros del AG, se tiene la pantalla que se muestra abajo, en ella se puede seleccionar la Función Objetivo de entre las que se tienen almacenadas.
También se presentas los campos correspondientes para poder definir los rangos en los que se desea realizar la búsqueda, mediante los limites superior e inferior de cada una de las variables, X y Y.
Se pude seleccionar si la optimización es maximizar o minimizar la función seleccionada, la opción de precisión se refiere al número de decimales con los que se representaran los valores de las variables.
Por último se presentan los campos para definir los valores operativos del AG, el tamaño de la población, que es el número de individuos involucrados en el ciclo evolutivo. El número de generaciones o ciclos evolutivos a realizar como criterio de paro del Algoritmo. La probabilidad de cruzar los individuos en la población, y la probabilidad de mutar los genes de los individuos en la población. Y si se desea aplicar el elitismo, es decir, conservar  sin cambios al mejor individuo para la siguiente generación del ciclo evolutivo. Ésta pantalla se muestra a continuación.

 Para Agregar una nueva Función Objetivo se tiene la pantalla que se muestra más abajo.
En esta pantalla se puede definir una Función Objetivo mediante cada uno de sus 4 elementos, y definiendo sus coeficientes a y b así como la variable a la que pertenece y su función matemática base de entre el catalogo de funciones predeterminadas. También se cuenta con un botón para poder visualizar como quedaría la función con los parámetros que se han ingresado.

La función principal del Sistema es realizar la ejecución del Algoritmo Genético para optimizar una función matemática que definamos, esto se lleva a cabo con el botón que se encuentra en la pantalla inicial o principal Run, una vez configurados la Función Objetivo, el Algoritmo Genético y sus correspondientes parámetros se puede ejecutar el AG y ver los resultados en la tabla principal. Un ejemplo de ésta funcionalidad se presenta en la siguiente imagen.


Prueba del Algoritmo Genético

Para poder saber si los resultados que nos presenta el AG son correctos he escogido una función que aparece continuamente en la literatura del tema, es conocida como una de las funciones de Michalewicz:

Fue propuesta por Zbigniew Michalewicz en su libro “Genetic Algorithms + Data Structures = Evolution Programs”.

 Aquí se reporta el mejor resultado como: 38.827553 aunque con otros parámetros el resultado del ejemplo que se ilustra en la imagen anterior es muy similar al reportado por Michalewicz.
Comparación de Resultados:
Michalewicz
Mi AG en Java
Diferencia
38.827553
38.81900776321816
0.00854524
 
Es conveniente notar que el resultado obtenido por mi AG fue realizado sin una calibración o tuning del AG, es muy posible que realizando la calibración e implementando operadores de cruce y selección más eficaces se pueda mejorar el resultado reportado por Michalewicz.




 
Referencias Bibliográficas sobre Algoritmos Genéticos


Holland, John H. (1975) Adaptation in Natural and Artificial Systems.
University of Michigan Press, Ann Arbor, Michigan.

Goldberg, David E. (1989) Genetic Algorithms in Search, Optimization, and Machine Learning.
Addison-Wesley.

Michalewicz, Zbigniew (1992) Genetic Algorithms + Data Structures = Evolution Programs.
Artificial Intelligence Series, Springer-Verlag.

Coello-Coello, Carlos A. (2008) Apuntes de Introducción a la Computación Evolutiva.
CINVESTAV-IPN.

viernes, 20 de julio de 2012

Diagrama UML Clases del Core del AGS

El diseño de una aplicación depende mucho del core o núcleo de la misma, es común referirse a él como las clases de negocio, ya que son las encargadas de llevar a cabo la función principal de un sistema.
En mi caso, el AGS por lo que el core del sistema esta compuesto por las clases que ejecutan el Algoritmo Genético. Abajo muestro el diagrama UML  de clases del core. He omitido los contructores en las clases.


jueves, 19 de julio de 2012

Diseño de base de datos para el sistema.

El diseño de la base de datos para almacenar las funciones matemáticas y los resultados, así como llevar un  sencillo control de acceso al sistema tiene 6 tablas, de las cuales una es catalogo; Funciones Matemáticas, las demás son de transacciones, aquí muestro el diagrama ER.
Descripción de cada una de las tablas:
  • Función Matemática: Catalogo con las funciones matemáticas que se pueden usar para definir los elementos de la función objetivo a optimizar.
  • Elemento: Define las constantes de una función matemáticas que son parte de la función objetivo.
  • Función Objetivo: Define los parámetros, elementos constitutivos y el espacio de búsqueda de las variables de la función objetivo.
  • Parámetros AGS: Almacena los parámetros de configuración del Algoritmo Genético.
  • Resultados: Tabla destinada a guardar los resultados obtenidos al optimizar  la función objetivo definida.
  • Usuario: contiene los datos de acceso de los  usuarios de la aplicación.


sábado, 19 de mayo de 2012

Sistema Para Optimizar Funciones Matemáticas con Algoritmos Genéticos en Java


Objetivo General:
Diseñar e Implementar un sistema que optimice funciones de dos variables polinómicas,  trigonométricas y exponenciales  mediante Algoritmos Genéticos.
 
Objetivos Particulares:
  • -           Diseñar e implementar el Algoritmo Genético Simple (AGS) usando Programación Orientada a Objetos con JAVA, que optimice funciones del tipo: 
  •  
     
  • -          Diseñar e implementar un sistema de escritorio que permita la optimización de las funciones matemáticas definidas por el usuario mediante el AGS.
  • -          Diseñar e implementar un sistema basado en web que permita la optimización de las funciones matemáticas definidas por los usuarios registrados mediante el AGS.
  • -          Diseñar e implementar la Base de Datos para almacenar las funciones y ingresadas por cada usuario en el sistema web, así como los parámetros y resultados obtenidos por el AGS.
 
Introducción
Los Algoritmos Genéticos son estrategias de optimización inspirados en la evolución y la selección natural de Darwin. Actualmente son utilizados para resolver problemas de optimización combinatoria y otros problemas de búsqueda y optimización general. Son algoritmos muy robustos que tienen gran potencia para resolver muy diversos problemas por ser un método general que tiene grandes ventajas sobre los métodos tradicionales  de optimización.

El sistema que me planteo tiene como objetivo para mostrar su funcionamiento y versatilidad para optimizar (maximizar o minimizar) funciones o modelos matemáticos mediante la implementación del llamado Algoritmo Genético Simple.
Los pasos del AGS son:


  • 1.       Inicialización
  • 2.       Evaluación
    Repetir hasta cumplir criterio de paro
  • 3.       Selección
  • 4.       Cruzamiento
  • 5.       Mutación
  • 6.       Evaluación
  • 7.       Reemplazo


Las características del AGS:
  • -          Codificación cadena binaria (1 y 0)
  • -          Método de Selección  Ruleta, Estocástico Universal
  • -          Operador Principal Cruza de 1 y 2 puntos, Cruza uniforme
  • -          Mutación binaria

Características del Sistema 

El sistema de escritorio deberá permitir ingresar al usuario la función según se estableció anteriormente, ingresar los parámetros del AGS y configuración de sus  métodos. Ejecutar el AGS y brindar un reporte con los resultados de la optimización.

El sistema web deberá tener un control de acceso mediante nombre de usuario y contraseña, permitir ingresar la función según se estableció previamente, ingresar los parámetros del AGS así como su configuración de métodos y parámetros, ejecutar el AGS y desplegar un reporte con graficas de los resultados obtenidos. Del la misma forma el sistema deberá guardar las funciones ingresadas anteriormente, incluidos los parámetros usados y los resultados obtenidos.