Mostrando entradas con la etiqueta Swing. Mostrar todas las entradas
Mostrando entradas con la etiqueta Swing. Mostrar todas las entradas

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.