jueves, 16 de mayo de 2013

Practica #3



Introducción
Reconocimiento de caracteres por medio de redes neuronales  ¿De qué trata?
El reconocimiento de caracteres engloba un conjunto de métodos y algoritmos, los cuales permiten realizar una fase de “entrenamiento” que al final permitirán a nuestro programa reconocer de forma automática caracteres.

Objetivo
Elaborar una aplicación que al darle una imagen, reconozca los caracteres, números o letras, mediante el uso de redes neuronales.

Justificación
Elegimos este proyecto porque hoy en día la mayoría de los dispositivos móviles tienen la función del reconocimiento, sea facial, o mediante letras y números que el usuario dibuja en la pantalla. Además de que el área de redes neuronales es bastante usada en este ámbito; uno de los métodos más usados es el denominado “Backpropagation” que es una técnica de aprendizaje automático, que nos va a permitir el obtener resultados óptimos, minimizando los errores y así ir obteniendo el carácter más parecido al que el usuario dibujo.

Pseudocódigo, ¿Qué va a hacer nuestra aplicación?
 1.- El programa pregunta por la imagen que vamos a usar para reconocer.
 2.- Elegimos una imagen hecha con Paint o alguna fotografía con pocas letras o números, el programa procesa la imagen
 3.- Arroja un reconocimiento preliminar, pueden haber fallos de reconocimiento al principio
 4.- Realizamos los mismos pasos con distintas imágenes para entrar a una fase de “alimentación” al programa y nos arroje un mejor resultado.

Librerias a usar
Las librerias que se utilizaran para facilitar nuestro proceso son las siguentes
 >Opencv Esta librería nos ayudara a poder utilizar funciones las cuales nos ayudara tanto en el espacio geometrico, y en describir patrones los cuales noa ayudaran a describir los simbolos
>fann esta librería nos facilitara el uso de hacer neuronas en vez de tener que hacerlo desde 0.
Martiz
[code]package redesneuronales;
import java.text.DecimalFormat;
/**
 *Clase Matriz
 *Clase que define objetos matriz para realizar operaciones de matrices
 * de forma rápida y sencilla
 * @author Pablo Borbón
 */
public class Matriz {
//Campos
int fil=0;
int col=0;
double mat[][];


//Constructures sobrecargados

/**
 *Contructor Matriz
 * @param m Arreglo bidimensional de double
 */
public Matriz(double m[][]){
this.mat=m;
this.fil=m.length;
this.col=m[0].length;
}

/**
 *Constructor Matriz
 * @param m Arreglo unidimensional de double
 */
public Matriz(double m[]){
this.mat=new double[1][m.length];
for (int i=0;i<m.length;i++){
this.mat[0][i]=m[i];
this.fil=1;
this.col=m.length;
}
}

/****************************************************************************
 * MÉTODOS
 ****************************************************************************
 */
/**
 * Obtener número de columnas
 * @param m Matriz
 * @return int NumColumnas
 */

public static int getCol(Matriz m){
return m.col;
}

/**
 * Obtener número de columnas
 * @return int NumColumnas
 */
public int getCol(){
return this.col;
}

/**
 * Obtener número de columnas
 * @return String NumColumnas
 */
public String getColString(){
return String.valueOf(this.col);
}

/**
 * Obtener número de filas
 * @param m Matriz
 * @return int NumFilas
 */
public static int getFil(Matriz m){
return m.fil;
}

/**
 * Obtener número de filas
 * @return int NumFilas
 */
public int getFil(){
return this.fil;
}

/**
 * Obtener número de filas
 * @return String NumFilas
 */
public String getFilString(){
return String.valueOf(this.fil);
}

/**
 * Convertir matriz en array
 * @return Double array[][]
 */
public double[][] toArray(){
return this.mat;
}

/**
 * Convertir matriz en array
 * @param m Matriz
 * @return Double array[][]
 */
public static double[][] toArray(Matriz m){
return m.mat;
}


/**
 *Colocar valor en posicion[f][c]
 * @param f índice de fila
 * @param c índice de columna
 * @param value Valor que se coloca en el arreglo de la matriz
 */
public void setFC(int f,int c, double value){
this.mat[f][c]=value;
}


/**
 *Obtener valor en posición[f][c]
 * @param f índice fila
 * @param c índice columna
 * @return double valor
 */
public double getFC(int f,int c){
return this.mat[f][c];
}


/**
 *Convertir la matriz en un String
 * @param m Matriz a convertir
 * @return String con las filas y las columnas de la matriz
 * debidamente ordenadas.
 */
public static String toStringM(Matriz m){
DecimalFormat df = new DecimalFormat("0.00");
StringBuffer mat1= new StringBuffer();
 for (int j=0;j<m.getFil();j++){

     for (int i=0;i<m.getCol();i++){
            mat1.append(" ");
            mat1.append(df.format(m.toArray()[j][i]));
            }
        mat1.append("\n");
 }
String salida = mat1.toString();
return salida;
}

/**
 *Convertir Matriz a String
 @return String con las filas y las columnas de la matriz
 * debidamente ordenadas.
 */
public String toStringM(){
DecimalFormat df = new DecimalFormat("0.00");
StringBuffer mat1= new StringBuffer();
 for (int j=0;j<this.getFil();j++){

     for (int i=0;i<this.getCol();i++){
            mat1.append(" ");
            mat1.append(df.format((this.toArray()[j][i])));
            }
        mat1.append("\n");
 }
String salida = mat1.toString();
return salida;
}


/**
 *Transponer matriz
 * @param m matriz a transponer
 * @return Matriz m'
 */
public static Matriz transponer(Matriz m){
double retorno[][];
retorno=new double[m.getCol()][m.getFil()];

for (int i=0; i<m.getFil();i++){
        for (int j=0; j<m.getCol();j++){

            retorno[j][i]=m.toArray()[i][j];

        }
}
Matriz ret= new Matriz(retorno);
return ret;
}

/**
 *Sumar matrices
 * @param mA sumandoA
 * @param mB sumandoB
 * @return Matriz (ma+mB)
 */
public static Matriz sumar(Matriz mA, Matriz mB){
double retorno[][];
retorno=new double[mB.getFil()][mB.getCol()];
Matriz ret= new Matriz(retorno);
for (int i=0; i<mA.getFil();i++){
        for (int j=0; j<mA.getCol();j++){

           ret.setFC(i, j, (mA.getFC(i, j)+mB.getFC(i, j)));

        }
}

return ret;
}

/**
 *Restar matrices
 * @param mA Minuendo
 * @param mB Sustraendo
 * @return Matriz diferencia= mA-mB
 */
public static Matriz restar(Matriz mA, Matriz mB){
double retorno[][];
retorno=new double[mB.getFil()][mB.getCol()];
Matriz ret= new Matriz(retorno);
for (int i=0; i<mA.getFil();i++){
        for (int j=0; j<mA.getCol();j++){

           ret.setFC(i, j, (mA.getFC(i, j)-mB.getFC(i, j)));

        }
}

return ret;
}

/**
 *Multiplicar matrices
 * @param mA factor A
 * @param mB factor B
 * @return mAxmB
 * La matriz de retorno tiene dimensions [fA]x[cB]
 */
public static Matriz multiplicar(Matriz mA, Matriz mB){
double retorno[][];
double tmp=0;
retorno=new double[mA.getFil()][mB.getCol()];
Matriz ret= new Matriz(retorno);

for (int i=0; i<mA.getFil();i++){
       
    for (int j=0; j<mB.getCol();j++){
                tmp=0;
                  for (int k=0; k<mA.getCol();k++){

                   tmp+=mA.getFC(i,k)*mB.getFC(k, j);

                }
                ret.setFC(i, j, tmp);
        }
}
return ret;
}

/**
 *Calcular la respueta más probable
 * @param resp Matriz con las respuestas de la simulación [1]x[10]
 * @param nom Arreglo de Strings con los nombres de los patrones
 * @return String con el patrón más probable del arreglo
 */
public  static String masProbable(Matriz resp,String nom[]){
int index=0;
double tmp=resp.toArray()[0][0];
    for (int i=1;i<resp.toArray()[0].length;i++){

            if(resp.toArray()[0][i]>tmp){
                tmp=resp.toArray()[0][i];
                index=i;
            }
    }
return nom[index];
}

/**
 *Obtener columna
 * @param index índice de la columna a obtener
 * @return Matriz Columna con todos los valores de la columna indicada
 */
public  Matriz getColumna(int index){
double tmp[][]= new double [this.getFil()][1];

    for (int i=0;i<this.getFil();i++){
    tmp[i][0]=this.toArray()[i][index];
    }
Matriz retorno = new Matriz(tmp);
return retorno;

}


/**
 *Multiplicar Matriz por escalar
 * @param m Matriz a multiplicar
 * @param esc factor escalar
 * @return Matriz escalada
 */
public static Matriz multEscalar(Matriz m, double esc){

 double tmp [][]= new double [m.getFil()][m.getCol()];
    for (int i=0;i<m.getFil();i++){

             for (int j=0;j<m.getCol();j++){
             tmp[i][j]=m.toArray()[i][j]*esc;
            }

    }

Matriz ret = new Matriz (tmp);
return ret;
}

/**
 *Multiplicar elementos entre matrices
 * @param m1 Matriz 1
 * @param m2 Matriz 2
 * @return Devuelve una matriz con las mismas dimensiones
 * con los productos de los elementos de cada matriz
 */
public static Matriz multElementos(Matriz m1, Matriz m2){

 double tmp [][]= new double [m1.getFil()][m2.getCol()];
    for (int i=0;i<m1.getFil();i++){

             for (int j=0;j<m1.getCol();j++){
             tmp[i][j]=m1.toArray()[i][j]*m2.toArray()[i][j];
            }

    }

Matriz ret = new Matriz (tmp);
return ret;
}


}
[/code]

Red
[code]package redesneuronales;
import java.util.Random;
import java.lang.Math.*;

/**
 * ´
 *Clase Red:Define las matrices de pesos, los métodos de entrenamiento, de propagación
 * y en general todos los aspectos de campos y funcionalidad de la red neuronal
 * propuesta como trabajo e implementada en Java
 * @author Pablo Borbón
 */
public class Red {
   
    Matriz wI;//matriz de pesos de entrada-oculta 18x35
    Matriz wO;//matriz de pesos de oculta salida 10x18
    Matriz trainMP;//matriz 10 patrones de entrada 35x10
    Matriz trainMT;//matriz de 10 patrones de salida 10x10
    Random generadorAl = new Random();//PAra inicializar los pesos
    int epocas=0;



    //CONSTRUCTORES


    /**
     *Constructor con matrices de patrones
     * @param mP1 Matriz de patrones de entrada [35x10]
     * @param mT1 Matriz de objetivos [10x10]
     */
    public Red(Matriz mP1, Matriz mT1){

this.trainMP=mP1;
this.trainMT=mT1;
}

/**
 *Constructor vacío
 */
public Red(){

}





// METODOS

/**
 *Establecer pesos
 * Coloca las matrices de la capa oculta y la capa de salida en
 * el objeto Red.
 * @param pesosI pesos de la capa oculta
 * @param pesosO pesos de la capa de salida
 */
public void setPesos(Matriz pesosI, Matriz pesosO){
this.wI=pesosI;
this.wO=pesosO;
}

/**
 *Inicializar red
 * Inicializa los pesos de la red neuronal pasada como parámetro
 * con un número aleatorio dentro de una distribución de probabilidad
 * Gaussiana con valores entre [-0.5,0.5]
 * @param redNeu Red Neuronal Objetivo
 */
public static void init(Red redNeu){
double tempI[][]=new double [18][35];
double tempO[][]=new double [10][18];
    for (int i=0;i<18;i++){
        for (int j=0;j<35;j++){
        tempI[i][j]=redNeu.generadorAl.nextGaussian()*0.5;
        }
    }

for (int i=0;i<10;i++){
        for (int j=0;j<18;j++){
        tempO[i][j]=redNeu.generadorAl.nextGaussian()*0.5;
        }
    }

redNeu.wI= new Matriz(tempI);
redNeu.wO= new Matriz(tempO);
}

/**
 * Obtener Wi
 * Devuelve la matriz de pesos de la capa oculta
 * @return Matriz Wi [18x35]
 */
public Matriz getWi(){
return this.wI;
}

/**
 *Obtener Wo
 * Devuelve la matriz de pesos de la capa de salida
 * @return Matriz Wo[10x18]
 */
public Matriz getWo(){
return this.wO;
}

/**
 *Obtener patrones de entrada
 * Devuelve la matriz con los patrones de entrada de entrenamiento
 * @return Matriz patronesEntrada[35x10]
 */
public Matriz getTrainMP(){
return this.trainMP;
}

/**
 *Obtener salidas objetivo
 * devuelve la matriz con los objetivos de entrenamiento
 * @return Matriz con los vectores de salida
 * @ Matriz salidas [10x10]
 */
public Matriz getTrainMT(){
return this.trainMT;
}


/**
 *fNetLog
 * Evalúa la  función sigmoidal 1/(1+e^-n) de un valor dado
 * @param value valor a evaluar
 * @return
 * @return1/(1+e^-value)
 */
public static double fNetLog(double value){
double num=1;
double den=0;
double f;
double exp=(-1)*value;
den=(1 + Math.pow(Math.E, (exp)) );
f=num/den;
return f;
}

/**
 *f prima de net
 * Evalúa la primera derivada de la función sigmoidal 1/(1+e^-n)
 * @param value valor a evaluar
 * @return (1/(1+e^-n))*(1-1/(1+e^-n))
 */
public static double fPrimaNetLog(double value){
double f;

f=Red.fNetLog(value)*(1-Red.fNetLog(value));
return f;
}



/**
 *F (net) a matriz
 * Evalúa la función sigmoidal a toda una matriz
 * @param mat matriz a evaluar
 * @return Matriz con sus elementos evaluados
 */
public static Matriz fNetMatrizLog(Matriz mat){
  double retorno[][];
  retorno=new double[mat.getFil()][mat.getCol()];
  Matriz res = new Matriz(retorno);

  for (int i=0;i<mat.getFil();i++){

        for (int j=0;j<mat.getCol();j++){

        res.setFC(i, j, Red.fNetLog(mat.getFC(i, j)));

        }

 }
return res;

}

/**
 *Evaluar f'(net) a matriz
 * Evalúa la derivada de la función sigmoidal a toda una matriz
 * @param mat matriz a evaluar
 * @return Matriz con sus elementos evaluados
 */
public static Matriz fNetPrimaMatrizLog(Matriz mat){
  double retorno[][];
  retorno=new double[mat.getFil()][mat.getCol()];
  Matriz res = new Matriz(retorno);

  for (int i=0;i<mat.getFil();i++){

        for (int j=0;j<mat.getCol();j++){

        res.setFC(i, j, Red.fPrimaNetLog(mat.getFC(i, j)));

        }

 }
return res;

}


/**
 *Simular Red Neuronal
 * Simula el comportamiento de la red neuronal.
 * Multiplica matrices, evalua las funciones de propagación y en general
 * propaga la red hacia adelante.
 * @param redNeu Red Neuronal modelo
 * @param Ventrada Vector de entrada a evaluar[35x1]
 * @return Matriz con un vector de respuestas de la red [10x1]
 */
public static Matriz simNet(Red redNeu, Matriz Ventrada){
//Ventrada 35x1
Matriz netI;
Matriz fNetI;

Matriz netO;
Matriz fNetO;


//MULTIPLICACION [NET]=[WI][XI]
netI= Matriz.multiplicar(redNeu.getWi(), Ventrada);
fNetI = Red.fNetMatrizLog(netI);

//MULTIPLICACION [NET]=[WO][FNETO]
netO= Matriz.multiplicar(redNeu.getWo(), fNetI);
fNetO = Red.fNetMatrizLog(netO);

return fNetO;
//salida de 10x1
}

/**
 *Establecer épocas
 * Establece el número de épocas de entrenamiento han transcurrido
 * en un proceso de entrenamiento tras la condición de salida
 * @param num contador de épocas
 */
public void setEpocas(int num){
this.epocas=num;
}

/**
 *Obtener el número de épocas
 * Devuelve el número de épocas que tuvo una red para alcanzar la condición
 * de salida.
 * @return int numEpocas
 */
public int getEpocas(){
return this.epocas;
}

/**
 *Obtener Error cuadrático
 * @param errores Matriz con los errores (yd-o)[10x1]
 * @return Double con la sumatoria de los errores al cuadrado multiplicado
 * por 1/2
 */
public static double getErrorCuadratico(Matriz errores){
double tmp=0;
        for (int i=0;i<errores.getFil();i++){
            tmp+=Math.pow(errores.getFC(i, 0), 2);
        }
tmp=tmp*0.5;
return tmp;
}

/**
 *Entrenar red neuronal
 * Entrena la red neuronal con el siguiente algoritmo:
 * <br>1.Se inicializa a red (valores aleatorios de wi y wo)
 * <br>2.huboError=true;
 *<br>
 * <br>Ciclo1.Mientras (epocas < iteracionesMáximas)&& (huboError==true))
 * <br>Ciclo2 for j=0;j<10;j++
 *<br>      3.Se presenta el patrón j y se propaga la red hacia adelante
 *<br>     4 Se calcula el error
 *<br>      Cond1 .If error>error:
 *<br>              -huboError
 *<br>              -Se propaga la red hacia atrás
 *<br>              -Se actualizan los pesos
 *<br>            
 *<br>
 *<br>           fin del ciclo2
 *<br>            epocas++;
 * <br>         fin del cliclo1
 *<br>El algoritmo se termina cuando todos los patrones tengan un valor de
 *error medio cuadrático menor que el establecido como parámetro o cuando
 *se supera el número máximo de iteraciones
 *
 * @param redNeu Red neuronal modelo
 * @param alpha factor de aprendizaje
 * @param error error objetivo por patrón
 * @param iteraciones numero máximo de iteraciones del algoritmo
 * @return String cadena con los resultados del entrenamiento
 */
public static String trainNetLog(Red redNeu,double alpha,double error, int iteraciones){

Red.init(redNeu);
    //Ventrada 35x1
int contEpocas=0;
int j=0;
Matriz netI;
Matriz fNetI;
Matriz fNetPrimaI;
Matriz wI;
Matriz eI;
Matriz dI;

Matriz netO;
Matriz fNetO;
Matriz fNetPrimaO;
Matriz wO;
Matriz eO;
Matriz dO;

double errG[]=new double[10];
double errGvalue=0;
double errP;
boolean huboError=true;

redNeu.setEpocas(0);

while((contEpocas<iteraciones)&&huboError==true){

huboError=false;
    for (j=0;j<10;j++){
//********************PASO HACIA ADELANTE*************************************
        //PROPAGAR LA CAPA OCULTA
        //[18x1] = [18x35] * [35x1] Net=WIxXI
        netI=Matriz.multiplicar(redNeu.getWi(), redNeu.getTrainMP().getColumna(j));
        //[18x1] = f([18x1])
        fNetI=Red.fNetMatrizLog(netI);

        //PROPAGAR LA SALIDA
        //[10x1] = [10x18] * [18x1]
        netO=Matriz.multiplicar(redNeu.getWo(),fNetI);
        //[10x1] = f([10x1])
        fNetO= Red.fNetMatrizLog(netO);

        //CALCULAR LOS ERRORES
        //[10x1] = [10x1] - [10x1] (yd-o)
        eO=Matriz.restar(redNeu.getTrainMT().getColumna(j), fNetO);

        //calcular el error cuadrático
        errP=Red.getErrorCuadratico(eO);
        errG[j]=errP;

//**************CONDICION DE ERROR : PASO HACIA ATRÁS**************************
        if(errP>error){

          huboError=true;

               //SE CALCULAN LAS DERIVADAS
               //[18x1] = f'([18x1])
                fNetPrimaI=Red.fNetPrimaMatrizLog(netI);

              //[10x1] = f'([10x1])
                fNetPrimaO=Red.fNetPrimaMatrizLog(fNetO);


            //CALCULAR dO
            //[10x1]=e[10x1]xe[10x1]  = (yd-o)*f'(netO)
            dO=Matriz.multElementos(eO, fNetPrimaO);


            //Calcular dI .. error propagado
            //[18x10]=[10x18]'T
            Matriz woT=Matriz.transponer(redNeu.getWo());
            //[18x1]=[18x10]x[10x1]
            Matriz tmp=Matriz.multiplicar(woT,dO);
            //[18x1]=e[18x1]xe[18x1]
            dI=Matriz.multElementos(tmp,fNetPrimaI);

            //ACTUALIZAR LOS PESOS
            //[10x18]=[10x1][18x1]'T
            Matriz deltaWO=Matriz.multEscalar(Matriz.multiplicar(dO,Matriz.transponer(fNetI)),alpha);
            wO=Matriz.sumar(redNeu.getWo(), deltaWO);

            //[18x35]=[18x1][35x1]'T
            Matriz deltaWI=Matriz.multEscalar(Matriz.multiplicar(dI,Matriz.transponer(redNeu.getTrainMP().getColumna(j))),alpha);
            wI=Matriz.sumar(redNeu.getWi(), deltaWI);


            //Se actualizan los pesos
            redNeu.setPesos(wI, wO);
          
            //Vuelve al primer patrón
     
        }
    }

 contEpocas++;//Una época más (iteración)
}
redNeu.setEpocas(contEpocas);


String ep=String.valueOf(redNeu.getEpocas());

if (huboError==false){

for (int i=0;i<10;i++)errGvalue+=errG[i];
 String errorG=String.valueOf(errGvalue);  
    return "¡Red entrenada con éxito!\n"+"Épocas: "+ep+"\nValor de error alcanzado\nError Global: "+errorG+"\n";

}else{
return "¡Red entrenada con éxito!\n"+"Épocas: "+ep+"\nValor de error NO alcanzado\n";
}



}


}[
/code] 
 RedesNeuronalesAboutBox
[code]package redesneuronales;

import org.jdesktop.application.Action;

/**
 * Ventana "Acerca de"
 * Muestra la información del curso, profesor, autor y el logo de la ECI
 * @author Pablo Borbón
 */
public class RedesNeuronalesAboutBox extends javax.swing.JDialog {

    /**
     *
     * @param parent
     */
    public RedesNeuronalesAboutBox(java.awt.Frame parent) {
        super(parent);
        initComponents();
        getRootPane().setDefaultButton(closeButton);
    }

    /**
     *
     */
    @Action public void closeAboutBox() {
        dispose();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents() {

        closeButton = new javax.swing.JButton();
        javax.swing.JLabel appTitleLabel = new javax.swing.JLabel();
        javax.swing.JLabel versionLabel = new javax.swing.JLabel();
        javax.swing.JLabel appVersionLabel = new javax.swing.JLabel();
        javax.swing.JLabel vendorLabel = new javax.swing.JLabel();
        javax.swing.JLabel appVendorLabel = new javax.swing.JLabel();
        javax.swing.JLabel homepageLabel = new javax.swing.JLabel();
        javax.swing.JLabel appHomepageLabel = new javax.swing.JLabel();
        javax.swing.JLabel appDescLabel = new javax.swing.JLabel();
        javax.swing.JLabel imageLabel = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(redesneuronales.RedesNeuronalesApp.class).getContext().getResourceMap(RedesNeuronalesAboutBox.class);
        setTitle(resourceMap.getString("title")); // NOI18N
        setModal(true);
        setName("aboutBox"); // NOI18N
        setResizable(false);

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(redesneuronales.RedesNeuronalesApp.class).getContext().getActionMap(RedesNeuronalesAboutBox.class, this);
        closeButton.setAction(actionMap.get("closeAboutBox")); // NOI18N

        appTitleLabel.setFont(appTitleLabel.getFont().deriveFont(appTitleLabel.getFont().getStyle() | java.awt.Font.BOLD, appTitleLabel.getFont().getSize()+4));
        appTitleLabel.setText(resourceMap.getString("Application.title")); // NOI18N

        versionLabel.setFont(versionLabel.getFont().deriveFont(versionLabel.getFont().getStyle() | java.awt.Font.BOLD));
        versionLabel.setText(resourceMap.getString("versionLabel.text")); // NOI18N

        appVersionLabel.setText(resourceMap.getString("Application.version")); // NOI18N

        vendorLabel.setFont(vendorLabel.getFont().deriveFont(vendorLabel.getFont().getStyle() | java.awt.Font.BOLD));
        vendorLabel.setText(resourceMap.getString("vendorLabel.text")); // NOI18N

        appVendorLabel.setText(resourceMap.getString("Application.vendor")); // NOI18N

        homepageLabel.setFont(homepageLabel.getFont().deriveFont(homepageLabel.getFont().getStyle() | java.awt.Font.BOLD));
        homepageLabel.setText(resourceMap.getString("homepageLabel.text")); // NOI18N

        appHomepageLabel.setText(resourceMap.getString("Application.homepage")); // NOI18N

        appDescLabel.setText(resourceMap.getString("appDescLabel.text")); // NOI18N

        imageLabel.setIcon(resourceMap.getIcon("imageLabel.icon")); // NOI18N

        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(imageLabel)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(versionLabel)
                            .addComponent(vendorLabel)
                            .addComponent(homepageLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(appVendorLabel)
                            .addComponent(appVersionLabel)
                            .addComponent(appHomepageLabel)))
                    .addComponent(appTitleLabel, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(appDescLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 232, Short.MAX_VALUE)
                    .addComponent(closeButton))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(imageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 177, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(appTitleLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(appDescLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(versionLabel)
                    .addComponent(appVersionLabel))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(vendorLabel)
                    .addComponent(jLabel1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(homepageLabel)
                    .addComponent(appHomepageLabel)
                    .addComponent(appVendorLabel))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 33, Short.MAX_VALUE)
                .addComponent(closeButton)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                       
   
    // Variables declaration - do not modify                    
    private javax.swing.JButton closeButton;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                  
   
}
[
/code]
RedesNeuronalesView
[code]
 package redesneuronales;

import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.text.DecimalFormat;


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;





/**
 * La ventana principal de la aplicación. Elementos de la interfaz gráfica.
 */
public class RedesNeuronalesView  extends FrameView {

/****************************************************************************
 * VARIABLES DE INICIO
 *****************************************************************************/

int iX=0, iY=0;//Variables para la captura del dibujo
int contPatrones=0;//Variable para indicar el No de patrones ingresados
//Matriz para capturar el patrón en tiempo real
double matriz[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int ID=0;

double matPatrones[][]=new double[10][35];//Array temporal con los patrones
String nomPatrones[]= new String[10];//Array String con los nombres de los patrones
double matObjetivos[][]=new double[10][10];//Array con los valores objetivo

Red miRedJA=null;

Matriz entrada;


//MATRICES (OBJETOS)
Matriz patronesM;
Matriz objetivosM;




/**
 * Crear el fame principal
 * @param frame
 */
@Override
    public void setFrame(JFrame frame) {
        super.setFrame(frame);
      this.getFrame().setResizable(false);
    
    }



/**
 *
 * @param app
 */
public RedesNeuronalesView(SingleFrameApplication app) {
        super(app);
/****************************************************************************
 * RUTINAS DE INICIALIZACIÓN
 *****************************************************************************/

        //INICIAR VECTOR OBJETIVO
int pos=0;//variable para inicializar la matriz objetivo
        for (int i=0;i<10;i++){
                for (int j=0;j<10;j++){
                if(j==pos){
                    matObjetivos[i][j]=1;}
                else{
                 matObjetivos[i][j]=0;
                }
             
                }
                pos++;
        }


        //INICIO DEL FRAME Y MENSAJES DE BIENVENIDA
        initComponents();
        this.getFrame().setResizable(false);
        label5.setForeground(Color.red);
        label5.setText("APRENDIZAJE");
        label2.setText("Vector de entrada:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]");
        label7.setText("1");
        debug.setText("Iniciando la aplicación...\nEn ésta ventana apareceran los mensajes del sistema\n");
        debug.append("\nMODO DE APRENDIZAJE\n");
        debug.append("La red neuronal requiere 10 patrones de dibujo a mano alzada con sus respectivos nombres para configurarse.\n");
        debug.append("Por favor, dibuje la forma del patrón en el recuadro de dibujo.\n");
        debug.append("Luego introduzca un nombre para el patrón y de clic al botón \"Agregar patrón\"\n\n");
        entrenar.setEnabled(false);
        calcularJ.setEnabled(false);
     

       //OCULTACIÓN DE ELEMENTOS GRÁFICOS
    
  
   
      
      

        // status bar initialization - message timeout, idle icon and busy animation, etc
        ResourceMap resourceMap = getResourceMap();
        int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
        messageTimer = new Timer(messageTimeout, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                statusMessageLabel.setText("");
            }
        });
        messageTimer.setRepeats(false);
        int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
        for (int i = 0; i < busyIcons.length; i++) {
            busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
        }
        busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
                statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
            }
        });
        idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
        statusAnimationLabel.setIcon(idleIcon);
        progressBar.setVisible(false);

        // connecting action tasks to status bar via TaskMonitor
        TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
        taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                String propertyName = evt.getPropertyName();
                if ("started".equals(propertyName)) {
                    if (!busyIconTimer.isRunning()) {
                        statusAnimationLabel.setIcon(busyIcons[0]);
                        busyIconIndex = 0;
                        busyIconTimer.start();
                    }
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(true);
                } else if ("done".equals(propertyName)) {
                    busyIconTimer.stop();
                    statusAnimationLabel.setIcon(idleIcon);
                    progressBar.setVisible(false);
                    progressBar.setValue(0);
                } else if ("message".equals(propertyName)) {
                    String text = (String)(evt.getNewValue());
                    statusMessageLabel.setText((text == null) ? "" : text);
                    messageTimer.restart();
                } else if ("progress".equals(propertyName)) {
                    int value = (Integer)(evt.getNewValue());
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(false);
                    progressBar.setValue(value);
                }
            }
        });
    }

/**
 *
 */
@Action
    public void showAboutBox() {
        if (aboutBox == null) {
            JFrame mainFrame = RedesNeuronalesApp.getApplication().getMainFrame();
            aboutBox = new RedesNeuronalesAboutBox(mainFrame);
            aboutBox.setLocationRelativeTo(mainFrame);
        }
        RedesNeuronalesApp.getApplication().show(aboutBox);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                        
    private void initComponents() {

        mainPanel = new javax.swing.JPanel();
        zona = new java.awt.Canvas();
        label2 = new java.awt.Label();
        label3 = new java.awt.Label();
        label4 = new java.awt.Label();
        label5 = new java.awt.Label();
        textField1 = new java.awt.TextField();
        label6 = new java.awt.Label();
        label7 = new java.awt.Label();
        debug = new java.awt.TextArea();
        label8 = new java.awt.Label();
        label9 = new java.awt.Label();
        respuesta = new java.awt.Label();
        jLabel2 = new javax.swing.JLabel();
        label11 = new java.awt.Label();
        label1 = new java.awt.Label();
        button1 = new javax.swing.JButton();
        entrenar = new javax.swing.JButton();
        calcularJ = new javax.swing.JButton();
        menuBar = new javax.swing.JMenuBar();
        javax.swing.JMenu fileMenu = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
        javax.swing.JMenu helpMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
        statusPanel = new javax.swing.JPanel();
        javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
        statusMessageLabel = new javax.swing.JLabel();
        statusAnimationLabel = new javax.swing.JLabel();
        progressBar = new javax.swing.JProgressBar();

        mainPanel.setMaximumSize(new java.awt.Dimension(440, 280));
        mainPanel.setMinimumSize(new java.awt.Dimension(440, 280));
        mainPanel.setName("mainPanel"); // NOI18N
        mainPanel.setPreferredSize(new java.awt.Dimension(800, 600));
        mainPanel.setRequestFocusEnabled(false);
        mainPanel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                mainPanelMouseEntered(evt);
            }
        });
        mainPanel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(java.awt.event.MouseEvent evt) {
                mainPanelMouseMoved(evt);
            }
        });

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(redesneuronales.RedesNeuronalesApp.class).getContext().getResourceMap(RedesNeuronalesView.class);
        zona.setBackground(resourceMap.getColor("zona.background")); // NOI18N
        zona.setName("zona"); // NOI18N
        zona.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                zonaMousePressed(evt);
            }
        });
        zona.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                zonaComponentShown(evt);
            }
        });
        zona.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                zonaMouseDragged(evt);
            }
            public void mouseMoved(java.awt.event.MouseEvent evt) {
                zonaMouseMoved(evt);
            }
        });
        zona.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                zonaFocusGained(evt);
            }
            public void focusLost(java.awt.event.FocusEvent evt) {
                zonaFocusLost(evt);
            }
        });
        zona.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                zonaPropertyChange(evt);
            }
        });

        label2.setAlignment(java.awt.Label.CENTER);
        label2.setName("label2"); // NOI18N
        label2.setText(resourceMap.getString("label2.text")); // NOI18N

        label3.setFont(resourceMap.getFont("label3.font")); // NOI18N
        label3.setForeground(resourceMap.getColor("label3.foreground")); // NOI18N
        label3.setName("label3"); // NOI18N
        label3.setText(resourceMap.getString("label3.text")); // NOI18N

        label4.setFont(resourceMap.getFont("label4.font")); // NOI18N
        label4.setName("label4"); // NOI18N
        label4.setText(resourceMap.getString("label4.text")); // NOI18N

        label5.setAlignment(java.awt.Label.CENTER);
        label5.setFont(resourceMap.getFont("label5.font")); // NOI18N
        label5.setName("label5"); // NOI18N
        label5.setText(resourceMap.getString("label5.text")); // NOI18N

        textField1.setName("textField1"); // NOI18N
        textField1.setText(resourceMap.getString("textField1.text")); // NOI18N

        label6.setName("labelPatron"); // NOI18N
        label6.setText(resourceMap.getString("labelPatron.text")); // NOI18N

        label7.setName("label7"); // NOI18N
        label7.setText(resourceMap.getString("label7.text")); // NOI18N

        debug.setBackground(resourceMap.getColor("debug.background")); // NOI18N
        debug.setEditable(false);
        debug.setFont(resourceMap.getFont("debug.font")); // NOI18N
        debug.setForeground(resourceMap.getColor("debug.foreground")); // NOI18N
        debug.setName("debug"); // NOI18N

        label8.setFont(resourceMap.getFont("label8.font")); // NOI18N
        label8.setName("label8"); // NOI18N
        label8.setText(resourceMap.getString("label8.text")); // NOI18N

        label9.setName("label9"); // NOI18N

        respuesta.setFont(resourceMap.getFont("respuesta.font")); // NOI18N
        respuesta.setForeground(resourceMap.getColor("respuesta.foreground")); // NOI18N
        respuesta.setName("respuesta"); // NOI18N
        respuesta.setText(resourceMap.getString("respuesta.text")); // NOI18N

        jLabel2.setIcon(resourceMap.getIcon("jLabel2.icon")); // NOI18N
        jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
        jLabel2.setName("jLabel2"); // NOI18N

        label11.setFont(resourceMap.getFont("label11.font")); // NOI18N
        label11.setForeground(resourceMap.getColor("label11.foreground")); // NOI18N
        label11.setName("label11"); // NOI18N
        label11.setText(resourceMap.getString("label11.text")); // NOI18N

        label1.setAlignment(java.awt.Label.CENTER);
        label1.setFont(resourceMap.getFont("label1.font")); // NOI18N
        label1.setName("label1"); // NOI18N
        label1.setText(resourceMap.getString("label1.text")); // NOI18N

        button1.setText(resourceMap.getString("button1.text")); // NOI18N
        button1.setName("button1"); // NOI18N
        button1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                button1ActionPerformed(evt);
            }
        });

        entrenar.setText(resourceMap.getString("entrenar.text")); // NOI18N
        entrenar.setName("entrenar"); // NOI18N
        entrenar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                entrenarActionPerformed(evt);
            }
        });

        calcularJ.setText(resourceMap.getString("calcularJ.text")); // NOI18N
        calcularJ.setName("calcularJ"); // NOI18N
        calcularJ.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                calcularJActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
                .addContainerGap(232, Short.MAX_VALUE)
                .addComponent(label4, javax.swing.GroupLayout.PREFERRED_SIZE, 370, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(224, 224, 224))
            .addComponent(label2, javax.swing.GroupLayout.DEFAULT_SIZE, 826, Short.MAX_VALUE)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addGap(133, 133, 133)
                        .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(calcularJ, javax.swing.GroupLayout.DEFAULT_SIZE, 80, Short.MAX_VALUE)
                            .addComponent(label11, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(entrenar, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 80, Short.MAX_VALUE))
                        .addGap(44, 44, 44)
                        .addComponent(jLabel2)
                        .addGap(174, 174, 174)
                        .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(label1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(zona, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE))
                        .addGap(50, 50, 50)
                        .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(textField1, javax.swing.GroupLayout.DEFAULT_SIZE, 93, Short.MAX_VALUE)
                            .addGroup(mainPanelLayout.createSequentialGroup()
                                .addComponent(label6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(label7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(button1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(18, 18, 18))
                    .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, mainPanelLayout.createSequentialGroup()
                            .addComponent(label8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(respuesta, javax.swing.GroupLayout.PREFERRED_SIZE, 453, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(label3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(label9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(label5, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addComponent(debug, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 778, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(20, 20, 20))
        );
        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel2))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, mainPanelLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(label4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(48, 48, 48)
                        .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(mainPanelLayout.createSequentialGroup()
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(label6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addGroup(mainPanelLayout.createSequentialGroup()
                                        .addComponent(label7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(textField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                .addGap(23, 23, 23)
                                .addComponent(button1))
                            .addGroup(mainPanelLayout.createSequentialGroup()
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(label1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(mainPanelLayout.createSequentialGroup()
                                        .addComponent(label11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(28, 28, 28)
                                        .addComponent(entrenar)
                                        .addGap(28, 28, 28)
                                        .addComponent(calcularJ))
                                    .addComponent(zona, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)))))
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addGap(76, 76, 76)
                        .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(label8, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(label9, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(label3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(respuesta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
                        .addComponent(label5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(20, 20, 20)))
                .addComponent(debug, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(1, 1, 1)
                .addComponent(label2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(22, 22, 22))
        );

        menuBar.setName("menuBar"); // NOI18N

        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
        fileMenu.setName("fileMenu"); // NOI18N
        fileMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fileMenuActionPerformed(evt);
            }
        });

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(redesneuronales.RedesNeuronalesApp.class).getContext().getActionMap(RedesNeuronalesView.class, this);
        jMenuItem1.setAction(actionMap.get("reinciar")); // NOI18N
        jMenuItem1.setText(resourceMap.getString("jMenuItem1.text")); // NOI18N
        jMenuItem1.setName("jMenuItem1"); // NOI18N
        fileMenu.add(jMenuItem1);

        exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
        exitMenuItem.setText(resourceMap.getString("exitMenuItem.text")); // NOI18N
        exitMenuItem.setName("exitMenuItem"); // NOI18N
        fileMenu.add(exitMenuItem);

        menuBar.add(fileMenu);

        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
        helpMenu.setName("helpMenu"); // NOI18N

        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
        aboutMenuItem.setText(resourceMap.getString("aboutMenuItem.text")); // NOI18N
        aboutMenuItem.setName("aboutMenuItem"); // NOI18N
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        statusPanel.setName("statusPanel"); // NOI18N

        statusMessageLabel.setName("statusMessageLabel"); // NOI18N

        statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

        progressBar.setName("progressBar"); // NOI18N

        javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
        statusPanel.setLayout(statusPanelLayout);
        statusPanelLayout.setHorizontalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(statusMessageLabel)
                .addGap(508, 508, 508)
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, statusPanelLayout.createSequentialGroup()
                        .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(statusAnimationLabel)
                        .addContainerGap())))
        );
        statusPanelLayout.setVerticalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 9, Short.MAX_VALUE)
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(statusMessageLabel)
                    .addComponent(statusAnimationLabel)
                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(3, 3, 3))
        );

        setComponent(mainPanel);
        setMenuBar(menuBar);
        setStatusBar(statusPanel);
    }// </editor-fold>                      

    private void zonaMousePressed(java.awt.event.MouseEvent evt) {                                
 /****************************************************************************
 * AREA DE DIBUJO: MOUSE PRESIONADO
 *****************************************************************************/
        //Capturo la posción del evento
         int fX = evt.getX();
        int fY = evt.getY();
        Graphics g=zona.getGraphics();


        iX=fX;
        iY=fY;
        int i;

     /*Código para llenar el vector de entrada
     Según la posición del puntero se determina la zona y se pone 1 o 0 en el
     vector correspondiente*/
        //Fila1
        if ((fY >0 && fY <=20)){
            if(fX >0 && fX <=20){matriz[0]=1;g.fillRect(0, 0, 20, 20);}
            if(fX >20 && fX <=40){matriz[1]=1;g.fillRect(20, 0, 20, 20);}
            if(fX >40 && fX <=60){matriz[2]=1;g.fillRect(40, 0, 20, 20);}
            if(fX >60 && fX <=80){matriz[3]=1;g.fillRect(60, 0, 20, 20);}
            if(fX >80 && fX <=100){matriz[4]=1;g.fillRect(80, 0, 20, 20);}
        }
         //Fila2
        if ((fY >20 && fY <=40)){
            if(fX >0 && fX <=20){matriz[5]=1;g.fillRect(0, 20, 20, 20);}
            if(fX >20 && fX <=40){matriz[6]=1;g.fillRect(20, 20, 20, 20);}
            if(fX >40 && fX <=60){matriz[7]=1;g.fillRect(40, 20, 20, 20);}
            if(fX >60 && fX <=80){matriz[8]=1;g.fillRect(60, 20, 20, 20);}
            if(fX >80 && fX <=100){matriz[9]=1;g.fillRect(80, 20, 20, 20);}
        }
         //Fila3
        if ((fY >40 && fY <=60)){
            if(fX >0 && fX <=20){matriz[10]=1;g.fillRect(0, 40, 20, 20);}
            if(fX >20 && fX <=40){matriz[11]=1;g.fillRect(20, 40, 20, 20);}
            if(fX >40 && fX <=60){matriz[12]=1;g.fillRect(40, 40, 20, 20);}
            if(fX >60 && fX <=80){matriz[13]=1;g.fillRect(60, 40, 20, 20);}
            if(fX >80 && fX <=100){matriz[14]=1;g.fillRect(80,40, 20, 20);}
        }
         //Fila4
        if ((fY >60 && fY <=80)){
            if(fX >0 && fX <=20){matriz[15]=1;g.fillRect(0, 60, 20, 20);}
            if(fX >20 && fX <=40){matriz[16]=1;g.fillRect(20, 60, 20, 20);}
            if(fX >40 && fX <=60){matriz[17]=1;g.fillRect(40, 60, 20, 20);}
            if(fX >60 && fX <=80){matriz[18]=1;g.fillRect(60, 60, 20, 20);}
            if(fX >80 && fX <=100){matriz[19]=1;g.fillRect(80, 60, 20, 20);}
        }
         //Fila5
        if ((fY >80 && fY <=100)){
            if(fX >0 && fX <=20){matriz[20]=1;g.fillRect(0, 80, 20, 20);}
            if(fX >20 && fX <=40){matriz[21]=1;g.fillRect(20, 80, 20, 20);}
            if(fX >40 && fX <=60){matriz[22]=1;g.fillRect(40, 80, 20, 20);}
            if(fX >60 && fX <=80){matriz[23]=1;g.fillRect(60, 80, 20, 20);}
            if(fX >80 && fX <=100){matriz[24]=1;g.fillRect(80, 80, 20, 20);}
        }
         //Fila6
        if ((fY >100 && fY <=120)){
            if(fX >0 && fX <=20){matriz[25]=1;g.fillRect(0, 100, 20, 20);}
            if(fX >20 && fX <=40){matriz[26]=1;g.fillRect(20, 100, 20, 20);}
            if(fX >40 && fX <=60){matriz[27]=1;g.fillRect(40, 100, 20, 20);}
            if(fX >60 && fX <=80){matriz[28]=1;g.fillRect(60, 100, 20, 20);}
            if(fX >80 && fX <=100){matriz[29]=1;g.fillRect(80, 100, 20, 20);}
        }
         //Fila7
        if ((fY >120 && fY <=140)){
            if(fX >0 && fX <=20){matriz[30]=1;g.fillRect(0, 120, 20, 20);}
            if(fX >20 && fX <=40){matriz[31]=1;g.fillRect(20, 120, 20, 20);}
            if(fX >40 && fX <=60){matriz[32]=1;g.fillRect(40, 120, 20, 20);}
            if(fX >60 && fX <=80){matriz[33]=1;g.fillRect(60, 120, 20, 20);}
            if(fX >80 && fX <=100){matriz[34]=1;g.fillRect(80, 120, 20, 20);}
        }


        //Código para mostrar en tiempo real el valor del vector de entrada
        StringBuffer mat= new StringBuffer();
        mat.append(matriz[0]);
        for (i=1;i<matriz.length;i++){
        mat.append(" ");
        mat.append(matriz[i]);
        }
        String matS = mat.toString();

        label2.setText("Vector de entrada:["+ matS +"]");
        g.dispose();
    }                               

    private void zonaMouseDragged(java.awt.event.MouseEvent evt) {                                
 /****************************************************************************
 * AREA DE DIBUJO: MOUSE ARRASTRADO
 *****************************************************************************/
     
        //Código para ir dibujando líneas mientras se arrastra el puntero
        int fX = evt.getX();
        int fY = evt.getY();
        Graphics g=zona.getGraphics();
      
      
        iX=fX;
        iY=fY;
        int i;

     /*Código para llenar el vector de entrada
     Según la posición del puntero se determina la zona y se pone 1 o 0 en el
     vector correspondiente*/
        //Fila1
        if ((fY >0 && fY <=20)){
            if(fX >0 && fX <=20){matriz[0]=1;g.fillRect(0, 0, 20, 20);}
            if(fX >20 && fX <=40){matriz[1]=1;g.fillRect(20, 0, 20, 20);}
            if(fX >40 && fX <=60){matriz[2]=1;g.fillRect(40, 0, 20, 20);}
            if(fX >60 && fX <=80){matriz[3]=1;g.fillRect(60, 0, 20, 20);}
            if(fX >80 && fX <=100){matriz[4]=1;g.fillRect(80, 0, 20, 20);}
        }
         //Fila2
        if ((fY >20 && fY <=40)){
            if(fX >0 && fX <=20){matriz[5]=1;g.fillRect(0, 20, 20, 20);}
            if(fX >20 && fX <=40){matriz[6]=1;g.fillRect(20, 20, 20, 20);}
            if(fX >40 && fX <=60){matriz[7]=1;g.fillRect(40, 20, 20, 20);}
            if(fX >60 && fX <=80){matriz[8]=1;g.fillRect(60, 20, 20, 20);}
            if(fX >80 && fX <=100){matriz[9]=1;g.fillRect(80, 20, 20, 20);}
        }
         //Fila3
        if ((fY >40 && fY <=60)){
            if(fX >0 && fX <=20){matriz[10]=1;g.fillRect(0, 40, 20, 20);}
            if(fX >20 && fX <=40){matriz[11]=1;g.fillRect(20, 40, 20, 20);}
            if(fX >40 && fX <=60){matriz[12]=1;g.fillRect(40, 40, 20, 20);}
            if(fX >60 && fX <=80){matriz[13]=1;g.fillRect(60, 40, 20, 20);}
            if(fX >80 && fX <=100){matriz[14]=1;g.fillRect(80,40, 20, 20);}
        }
         //Fila4
        if ((fY >60 && fY <=80)){
            if(fX >0 && fX <=20){matriz[15]=1;g.fillRect(0, 60, 20, 20);}
            if(fX >20 && fX <=40){matriz[16]=1;g.fillRect(20, 60, 20, 20);}
            if(fX >40 && fX <=60){matriz[17]=1;g.fillRect(40, 60, 20, 20);}
            if(fX >60 && fX <=80){matriz[18]=1;g.fillRect(60, 60, 20, 20);}
            if(fX >80 && fX <=100){matriz[19]=1;g.fillRect(80, 60, 20, 20);}
        }
         //Fila5
        if ((fY >80 && fY <=100)){
            if(fX >0 && fX <=20){matriz[20]=1;g.fillRect(0, 80, 20, 20);}
            if(fX >20 && fX <=40){matriz[21]=1;g.fillRect(20, 80, 20, 20);}
            if(fX >40 && fX <=60){matriz[22]=1;g.fillRect(40, 80, 20, 20);}
            if(fX >60 && fX <=80){matriz[23]=1;g.fillRect(60, 80, 20, 20);}
            if(fX >80 && fX <=100){matriz[24]=1;g.fillRect(80, 80, 20, 20);}
        }
         //Fila6
        if ((fY >100 && fY <=120)){
            if(fX >0 && fX <=20){matriz[25]=1;g.fillRect(0, 100, 20, 20);}
            if(fX >20 && fX <=40){matriz[26]=1;g.fillRect(20, 100, 20, 20);}
            if(fX >40 && fX <=60){matriz[27]=1;g.fillRect(40, 100, 20, 20);}
            if(fX >60 && fX <=80){matriz[28]=1;g.fillRect(60, 100, 20, 20);}
            if(fX >80 && fX <=100){matriz[29]=1;g.fillRect(80, 100, 20, 20);}
        }
         //Fila7
        if ((fY >120 && fY <=140)){
            if(fX >0 && fX <=20){matriz[30]=1;g.fillRect(0, 120, 20, 20);}
            if(fX >20 && fX <=40){matriz[31]=1;g.fillRect(20, 120, 20, 20);}
            if(fX >40 && fX <=60){matriz[32]=1;g.fillRect(40, 120, 20, 20);}
            if(fX >60 && fX <=80){matriz[33]=1;g.fillRect(60, 120, 20, 20);}
            if(fX >80 && fX <=100){matriz[34]=1;g.fillRect(80, 120, 20, 20);}
        }


        //Código para mostrar en tiempo real el valor del vector de entrada
        StringBuffer mat= new StringBuffer();
        mat.append(matriz[0]);
        for (i=1;i<matriz.length;i++){
        mat.append(" ");
        mat.append(matriz[i]);
        }
        String matS = mat.toString();
    
        label2.setText("Vector de entrada:["+ matS +"]");
        g.dispose();

    }                               

    private void zonaMouseMoved(java.awt.event.MouseEvent evt) {                              
         this.dibujarGuias();
    }                             

    private void zonaComponentShown(java.awt.event.ComponentEvent evt) {                                  
        // TODO add your handling code here:
       this.dibujarGuias();
    }                                 

    private void zonaPropertyChange(java.beans.PropertyChangeEvent evt) {                                  
        // TODO add your handling code here:
 
    
    }                                 

    private void zonaFocusGained(java.awt.event.FocusEvent evt) {                               
        // TODO add your handling code here:
      
    }                              

    private void mainPanelMouseEntered(java.awt.event.MouseEvent evt) {                                     
        // TODO add your handling code here:
        //this.dibujarGuias();
    }                                    

    private void mainPanelMouseMoved(java.awt.event.MouseEvent evt) {                                   
 
    }                                  

    private void zonaFocusLost(java.awt.event.FocusEvent evt) {                             
        // TODO add your handling code here:
 
    }                            

    private void button1ActionPerformed(java.awt.event.ActionEvent evt) {                                      
        // TODO add your handling code here:
        /****************************************************************************
 * BOTÓN: AGREGAR PATRÓN
 *****************************************************************************/

  zona.repaint();
        dibujarGuias();
      
    /*se captura el array de patrones temporal(1x35) y se guarda en el array
     * final de patrones en la fila=contPatrones*/
    for (int j=0;j<35;j++)matPatrones[contPatrones][j]=matriz[j];
    nomPatrones[contPatrones]=textField1.getText();//Se guarda el nombre del patrón

    //Se pasa el valor del patrón capturado a String para visualizarlo en debug
        StringBuffer mat= new StringBuffer();
        mat.append(matriz[0]);
        for (int i=1;i<35;i++){
        mat.append(" ");
        mat.append(matriz[i]);
        }
        String matS = mat.toString();

        debug.append("¡Capturado patrón "+String.valueOf(contPatrones+1)+" con éxito!\n");
        debug.append("Nombre: \""+nomPatrones[contPatrones]+"\" valor:\n");
        debug.append("["+ matS +"]\n");

        //se incremente al contador de patrones y se actualizan las etiquetas
        contPatrones++;
        label7.setText(String.valueOf(contPatrones+1));
        textField1.setText("");


        //SI SE HA ALCANZADO EL NÚMERO MÁXIMO DE PATRONES:

        if (contPatrones==10){
                //Deshabilito elementos gráficos y cambio el estado
                label7.setVisible(false);
                button1.setEnabled(false);
                label6.setEnabled(false);
                textField1.setEnabled(false);
             


                label5.setText("EJECUCIÓN");
                label5.setForeground(Color.GREEN);

                patronesM = new Matriz(matPatrones);//Se inicializa la matriz de patrones
                patronesM = Matriz.transponer(patronesM);//Se transpone => 35x10
                objetivosM= new Matriz(matObjetivos);//Se inicializa la matriz objetivos
                objetivosM= Matriz.transponer(objetivosM);//Se transpone => 10x10

                miRedJA = new Red(patronesM,objetivosM);
              

                debug.append("\nMatriz de objetivos ["+objetivosM.getFilString()+"x"+objetivosM.getColString()+"]:\n");
                debug.append(objetivosM.toStringM());


                debug.append("\nMatriz de patrones ["+patronesM.getFilString()+"x"+patronesM.getColString()+"]:\n");
                debug.append(patronesM.toStringM());

                //guardar las matrices para matlab
           
                debug.append("\nMODO DE EJECUCIÓN\n");
                debug.append("Para comenzar a utilizar la red neuronal calculada en JAVA presione primero \"Entrenar\" y luego\n ");
                debug.append("\"CalcularJ\" bajo el título Java de ésta interfaz \n");
                //nuevos elementos gráficos
                entrenar.setEnabled(true);
              
         

        }



       //Reiniciar vector de entrada
      for(int j=0;j<=34;j++){
      matriz[j]=0;

      }

          zona.repaint();
        dibujarGuias();
        StringBuffer mat1= new StringBuffer();
        mat1.append(matriz[0]);
        for (int i=1;i<matriz.length;i++){
        mat1.append(" ");
        mat1.append(matriz[i]);
        }

          zona.repaint();
        dibujarGuias();
        String matS1 = mat1.toString();
        label2.setText("Vector de entrada:["+ matS1 +"]");
      
    
     
    }                                     

    private void entrenarActionPerformed(java.awt.event.ActionEvent evt) {                                       
     
        // TODO add your handling code here:
       calcularJ.setEnabled(false);
      
     
       String alfaS = JOptionPane.showInputDialog(null, "Por favor digite el factor de aprendizaje (alfa)");
       double alfa= Double.valueOf(alfaS);
     
       String errorS = JOptionPane.showInputDialog(null, "Por favor digite el valor de error mínimo por patrón (ep)");
       double error= Double.valueOf(errorS);
     
       String itS = JOptionPane.showInputDialog(null, "Por favor digite el número máximo de iteraciones (épocas)");
       int it= Integer.valueOf(itS);
       debug.append("\nEntrenando la red por favor espere...");
          
          String res=Red.trainNetLog(miRedJA, alfa,error, it);

          debug.append(res);
          calcularJ.setEnabled(true);
          zona.repaint();
        dibujarGuias();
    
    }                                      

    private void calcularJActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:

        Matriz tmp = new Matriz(matriz);
        tmp=Matriz.transponer(tmp);

        Matriz resp= Red.simNet(miRedJA, tmp);
        DecimalFormat df = new DecimalFormat("0.00");

        debug.append("\n\nRESULTADOS SEGÚN LA RED NEURONAL DE JAVA:\n");
        for (int i=0;i<10;i++){
        debug.append(nomPatrones[i]+": "+String.valueOf(df.format(Matriz.transponer(resp).toArray()[0][i]))+"  ");
        }
        debug.append("\n");

        //Inicializo de nuevo la matriz de captura y redibujo el lienzo
        for(int j=0;j<=34;j++){
              matriz[j]=0;
              }
    
        tmp=new Matriz(Matriz.transponer(resp).toArray()[0]);
        respuesta.setText(Matriz.masProbable(tmp, nomPatrones));

       zona.repaint();
        dibujarGuias();
     
    }                                       

    private void fileMenuActionPerformed(java.awt.event.ActionEvent evt) {                                       


    }                                      


    // Variables declaration - do not modify                   
    private javax.swing.JButton button1;
    private javax.swing.JButton calcularJ;
    private java.awt.TextArea debug;
    private javax.swing.JButton entrenar;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JMenuItem jMenuItem1;
    private java.awt.Label label1;
    private java.awt.Label label11;
    private java.awt.Label label2;
    private java.awt.Label label3;
    private java.awt.Label label4;
    private java.awt.Label label5;
    private java.awt.Label label6;
    private java.awt.Label label7;
    private java.awt.Label label8;
    private java.awt.Label label9;
    private javax.swing.JPanel mainPanel;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JProgressBar progressBar;
    private java.awt.Label respuesta;
    private javax.swing.JLabel statusAnimationLabel;
    private javax.swing.JLabel statusMessageLabel;
    private javax.swing.JPanel statusPanel;
    private java.awt.TextField textField1;
    private java.awt.Canvas zona;
    // End of variables declaration                 

    private final Timer messageTimer;
    private final Timer busyIconTimer;
    private final Icon idleIcon;
    private final Icon[] busyIcons = new Icon[15];
    private int busyIconIndex = 0;

    private JDialog aboutBox;

private void dibujarGuias(){
 Graphics g=zona.getGraphics();
        g.setColor(Color.blue);
        g.drawLine(0, 0, 0, 140);
        g.drawLine(20, 0, 20, 140);
        g.drawLine(40, 0, 40, 140);
        g.drawLine(60, 0, 60, 140);
        g.drawLine(80, 0, 80, 140);
        g.drawLine(99, 0, 99, 140);

        g.drawLine(0, 0, 100, 0);
        g.drawLine(0, 20, 100, 20);
        g.drawLine(0, 40, 100, 40);
        g.drawLine(0, 60, 100, 60);
        g.drawLine(0, 80, 100, 80);
        g.drawLine(0, 100, 100, 100);
        g.drawLine(0, 120, 100, 120);
        g.drawLine(0, 139, 100, 139);
        g.dispose();
}

/**
 * Reiniciar aplicación
 * Reinicia los vectores y en general todos los datos de la aplicación
 */
@Action
    public void reinciar() {
             // TODO add your handling code here:
         contPatrones=0;
                label7.setVisible(true);
                button1.setEnabled(true);
                label6.setEnabled(true);
                textField1.setEnabled(true);
                label5.setForeground(Color.red);
        label5.setText("APRENDIZAJE");
        label2.setText("Vector de entrada:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]");
        label7.setText("1");
        debug.setText("Iniciando la aplicación...\nEn ésta ventana apareceran los mensajes del sistema\n");
        debug.append("\nMODO DE APRENDIZAJE\n");
        debug.append("La red neuronal requiere 10 patrones de dibujo a mano alzada con sus respectivos nombres para configurarse.\n");
        debug.append("Por favor, dibuje la forma del patrón en el recuadro de dibujo.\n");
        debug.append("Luego introduzca un nombre para el patrón y de clic al botón \"Agregar patrón\"\n\n");
        entrenar.setEnabled(false);
        calcularJ.setEnabled(false);
        zona.repaint();
        dibujarGuias();
      
    }



}

[/code] 
RedesNeuronalesApp
[code]
 package redesneuronales;

import org.jdesktop.application.Application;
import org.jdesktop.application.SingleFrameApplication;

/**
 * La clase principal de la aplicación. Se encarga de "lanzar" la ventana principal
 */
public class RedesNeuronalesApp extends SingleFrameApplication {

    /**
     * At startup create and show the main frame of the application.
     */
    @Override protected void startup() {
        show(new RedesNeuronalesView(this));
    }

    /**
     * This method is to initialize the specified window by injecting resources.
     * Windows shown in our application come fully initialized from the GUI
     * builder, so this additional configuration is not needed.
     * @param root
     */
    @Override protected void configureWindow(java.awt.Window root) {
    }

    /**
     * A convenient static getter for the application instance.
     * @return the instance of RedesNeuronalesApp
     */
    public static RedesNeuronalesApp getApplication() {
        return Application.getInstance(RedesNeuronalesApp.class);
    }

    /**
     * Main method launching the application.
     * @param args
     */
    public static void main(String[] args) {
        launch(RedesNeuronalesApp.class, args);
    }
}

[/code]



No hay comentarios:

Publicar un comentario