public static void algoritmoRetropropagacion(long epocas, double error, double[] salidasPatrones, double[][] entradasPatrones, RedNeuronal rnap){
		int iteraciones=0;
		boolean fin=true, fallo;
		double errorPatron=0.0, errorMinimo=0.0, ecm=0.0, salidas[], errores[];
		CapaNeuronal capa;
		ArrayList<CapaNeuronal> perceptron;
		for(int i=0; i<salidasPatrones.length; i++)
			errorMinimo = errorMinimo + salidasPatrones[i];
		errorMinimo = errorMinimo / ((double)salidasPatrones.length);
		errorMinimo = errorMinimo * (error/100.0);
		errores = new double[salidasPatrones.length];
		while(fin){
			ecm = 0.0;
			for(int i=0; i<salidasPatrones.length; i++){
				fallo = false;
				errorPatron = 0.0;
				rnap.realizarPropagacion(entradasPatrones[i]);
				perceptron = rnap.obtenerPerceptron();
				capa = perceptron.get(perceptron.size()-1);
				salidas = capa.obtenerSalidas();
				for(int j=0; j<salidas.length; j++){
					if(salidas[j] != salidasPatrones[i])
						fallo = true;
					errorPatron = errorPatron + (salidasPatrones[i]-salidas[j]);
				}
				errores[i] = Math.pow((errorPatron / ((double)salidas.length)), 2);
				if(fallo)
					rnap.realizarRetroPropagacion(salidasPatrones[i]);
				rnap.actualizarParametrosNeuronalesRP(1, 0.0);
			}
			for(int i=0; i<errores.length; i++)
				ecm = ecm + errores[i];
			ecm = ecm / ((double)errores.length);
			if(ecm<=errorMinimo || iteraciones==epocas-1)
				fin = false;
			iteraciones++;
		}
		System.out.printf("\nEpocas de entrenamiento:   %d.\n", iteraciones);
		System.out.printf("\nError minimo acordado:     %f.\n", errorMinimo);
		System.out.printf("\nError minimo alcanzado:    %f.\n", ecm);
		rnap.mostrarDatosPerceptron();
		System.out.printf("\n\n");
	}