private void Simular(float[,] arraydeentradas) { string binariodesalida = ""; Dictionary <int, float[, ]> diccionariodelassalidasdecapa = new Dictionary <int, float[, ]>(); int pt = 0; float[,] arraydematrizdepesos; float[] arraydeumbrales; float[,] arraydesalidadelacapaanterior = null; float[,] arraydesalidadelacapaactual = null; for (int cp = 0; cp <= capasocultas; cp++) { arraydematrizdepesos = diccionariodearraydematrizdepesos[cp]; arraydeumbrales = diccionariodearraydeumbrales[cp]; arraydesalidadelacapaactual = new float[patrones, arraydematrizdepesos.GetLength(0)]; if (cp > 0) { arraydesalidadelacapaanterior = diccionariodelassalidasdecapa[cp - 1]; } for (int i = 0; i < arraydematrizdepesos.GetLength(0); i++) { arraydesalidadelacapaactual[pt, i] = 0; if (cp == 0) { for (int j = 0; j < entradas; j++) { arraydesalidadelacapaactual[pt, i] += arraydeentradas[pt, j] * arraydematrizdepesos[i, j]; } } else if (cp > 0 && cp < capasocultas) { for (int j = 0; j < arraydematrizdepesos.GetLength(1); j++) { arraydesalidadelacapaactual[pt, i] += arraydesalidadelacapaanterior[pt, j] * arraydematrizdepesos[i, j]; } } else if (cp == capasocultas) { for (int j = 0; j < arraydematrizdepesos.GetLength(1); j++) { arraydesalidadelacapaactual[pt, i] += arraydesalidadelacapaanterior[pt, j] * arraydematrizdepesos[i, j]; } } arraydesalidadelacapaactual[pt, i] -= arraydeumbrales[i]; if (cp != capasocultas) { arraydesalidadelacapaactual[pt, i] = new Funciondeactivacion(grilladecapasocultas.Rows[cp].Cells[2].Value.ToString(), arraydesalidadelacapaactual[pt, i]).getfunActivacion(); } else { arraydesalidadelacapaactual[pt, i] = new Funciondeactivacion(comboBox1, arraydesalidadelacapaactual[pt, i]).getfunActivacion(); binariodesalida += Math.Round(double.Parse(arraydesalidadelacapaactual[pt, i].ToString())).ToString(); } } diccionariodelassalidasdecapa.Add(cp, arraydesalidadelacapaactual); } string resultadodediagnostico = new Binarioacaracteres(binariodesalida).ConvertirDeBinarioACadenaDeCaracteres().ToUpper(); Packages pack = new Packages(); if (pack.verify(resultadodediagnostico) == false) { MessageBox.Show("El diagnostico obtenido mediante la tecnología es que usted padece de: " + resultadodediagnostico, "Diagnostico inteligente."); label4.Text = resultadodediagnostico; // Open the file to read from. string path = @"c:\error_red.txt"; using (StreamReader sr = File.OpenText(path)) { string s = ""; while ((s = sr.ReadLine()) != null) { Console.WriteLine(s); double error = Convert.ToDouble(s) * 100; MessageBox.Show("Tener en cuenta que la red tiene un error de: " + error + "%"); } } } else { MessageBox.Show("No coincide con ninguno de los patrones presentados para el entrenamiento"); label4.Text = binariodesalida; } }
private void Entrenamientodelared() { iteracion = iteracion + Convert.ToInt32(nudIteraciones.Value); ratadeaprendizaje = float.Parse(nudRataaprendizaje.Value.ToString()); errormaximopermitido = float.Parse(nudErrormaximopermitido.Value.ToString()); //guardo error en archivo string path = @"c:\error_red.txt"; if (!File.Exists(path)) { using (StreamWriter sw = File.CreateText(path)) { sw.WriteLine(errormaximopermitido); } } /////////////////////////////////////// errordeiteracion = 1000; while (errormaximopermitido < errordeiteracion && conti <= iteracion) { List <string> listadesalidasdelared = new List <string>(); List <int> numerodepatrones = new List <int>(); arraydeerrordelospatrones = new float[patrones]; for (int pt = 0; pt < patrones; pt++) { float[] arraydeerroresdeneuronasendiccionario = null; float[,] arraydesalidasdecapasocultasanterior = null; diccionariodeerrornolinealdeneuronasporcapaoscultas.Clear(); numerodepatrones.Add(pt + 1); diccionariodelassalidasdecapa.Clear(); for (int cp = 0; cp <= nudCapasocultas.Value; cp++) { arraydematrizdepesos = diccionariodearraydematrizdepesos[cp]; arraydeumbrales = diccionariodearraydeumbrales[cp]; arraydesalidadelacapaactual = new float[patrones, arraydematrizdepesos.GetLength(0)]; if (cp > 0) { arraydesalidadelacapaanterior = diccionariodelassalidasdecapa[cp - 1]; } for (int i = 0; i < arraydematrizdepesos.GetLength(0); i++) { arraydesalidadelacapaactual[pt, i] = 0; if (cp == 0) { for (int j = 0; j < entradas; j++) { arraydesalidadelacapaactual[pt, i] += arraydeentradasdelared[pt, j] * arraydematrizdepesos[i, j]; } } else if (cp > 0 && cp < nudCapasocultas.Value) { for (int j = 0; j < arraydematrizdepesos.GetLength(1); j++) { arraydesalidadelacapaactual[pt, i] += arraydesalidadelacapaanterior[pt, j] * arraydematrizdepesos[i, j]; } } else if (cp == nudCapasocultas.Value) { for (int j = 0; j < arraydematrizdepesos.GetLength(1); j++) { arraydesalidadelacapaactual[pt, i] += arraydesalidadelacapaanterior[pt, j] * arraydematrizdepesos[i, j]; } } arraydesalidadelacapaactual[pt, i] -= arraydeumbrales[i]; if (cp != nudCapasocultas.Value) { arraydesalidadelacapaactual[pt, i] = new Funciondeactivacion(grilladecapasocultas.Rows[cp].Cells[2].Value.ToString(), arraydesalidadelacapaactual[pt, i]).getfunActivacion(); } else { arraydesalidadelacapaactual[pt, i] = new Funciondeactivacion(comboBox1.SelectedItem.ToString(), arraydesalidadelacapaactual[pt, i]).getfunActivacion(); listadesalidasdelared.Add(i.ToString() + " " + arraydesalidadelacapaactual[pt, i].ToString()); } } diccionariodelassalidasdecapa.Add(cp, arraydesalidadelacapaactual); } //Error lineal de las salidas de la red .... arraydeerroreslineales = new float[salidas]; for (int i = 0; i < salidas; i++) { arraydeerroreslineales[i] = arraydesalidasdeseadas[pt, i] - arraydesalidadelacapaactual[pt, i]; } //COMIENZA AQUÍ LA RETROPROPAGACIÓN, DE CADA NEURONA DESDE LA ÚLTIMA CAPA OCULTA HASTA LA PRIMERA... //Error no lineal por neuronas de las capas ocultas.... for (int capOculta = Convert.ToInt32(nudCapasocultas.Value) - 1; capOculta >= 0; capOculta--) { //Última capa oculta con salida... if (capOculta == Convert.ToInt32(nudCapasocultas.Value) - 1) { arraydeerrornolinealporneuronasdecapasocultas = new float[Convert.ToInt32(grilladecapasocultas.Rows[capOculta].Cells[1].Value.ToString())]; arraydematrizdepesos = diccionariodearraydematrizdepesos[capOculta + 1]; for (int neucapActual = 0; neucapActual < arraydeerrornolinealporneuronasdecapasocultas.Length; neucapActual++) { float sumerr = 0; for (int sal = 0; sal < salidas; sal++) { sumerr = sumerr + (arraydeerroreslineales[sal] * arraydematrizdepesos[sal, neucapActual]); } arraydeerrornolinealporneuronasdecapasocultas[neucapActual] = sumerr; } diccionariodeerrornolinealdeneuronasporcapaoscultas.Add(capOculta, arraydeerrornolinealporneuronasdecapasocultas); } else //Entre capas ocultas.... { float[] Errorneuronasiguiente = diccionariodeerrornolinealdeneuronasporcapaoscultas[capOculta + 1]; arraydeerrornolinealporneuronasdecapasocultas = new float[Convert.ToInt32(grilladecapasocultas.Rows[capOculta].Cells[1].Value.ToString())]; arraydematrizdepesos = diccionariodearraydematrizdepesos[capOculta + 1]; for (int neucapActual = 0; neucapActual < arraydeerrornolinealporneuronasdecapasocultas.Length; neucapActual++) { float sumerr = 0; for (int neucapaSiguiente = 0; neucapaSiguiente < Errorneuronasiguiente.Length; neucapaSiguiente++) { sumerr = sumerr + (Errorneuronasiguiente[neucapaSiguiente] * arraydematrizdepesos[neucapaSiguiente, neucapActual]); } arraydeerrornolinealporneuronasdecapasocultas[neucapActual] = sumerr; } diccionariodeerrornolinealdeneuronasporcapaoscultas.Add(capOculta, arraydeerrornolinealporneuronasdecapasocultas); } } //TERMINA LA RETROPROPAGACIÓN Y SE MODIFICAR PESOS Y UMBRALES CON LOS ERRORES NO LINEALES POR //CADA NEURONA DE CADA CAPA OCULTA... //Modificacion de pesos y umbrales... for (int capOculta = 0; capOculta <= Convert.ToInt32(nudCapasocultas.Value); capOculta++) { //Desde la capa entrada hasta la última capa oculta.... arraydematrizdepesos = diccionariodearraydematrizdepesos[capOculta]; arraydeumbrales = diccionariodearraydeumbrales[capOculta]; if (capOculta < Convert.ToInt32(nudCapasocultas.Value)) { arraydeerroresdeneuronasendiccionario = diccionariodeerrornolinealdeneuronasporcapaoscultas[capOculta]; } arraydesalidadelacapaactual = diccionariodelassalidasdecapa[capOculta]; for (int sal = 0; sal < arraydematrizdepesos.GetLength(0); sal++) { if (capOculta < Convert.ToInt32(nudCapasocultas.Value)) { arraydeumbrales[sal] += 2 * ratadeaprendizaje * new Funcionderivada(grilladecapasocultas.Rows[capOculta].Cells[2].Value.ToString(), arraydesalidadelacapaactual[pt, sal]).getfunDerivada() * arraydeerroresdeneuronasendiccionario[sal]; } else { arraydeumbrales[sal] += 2 * ratadeaprendizaje * arraydeerroreslineales[sal]; } for (int ent = 0; ent < arraydematrizdepesos.GetLength(1); ent++) { if (capOculta == 0) { arraydematrizdepesos[sal, ent] += 2 * ratadeaprendizaje * new Funcionderivada(grilladecapasocultas.Rows[capOculta].Cells[2].Value.ToString(), arraydesalidadelacapaactual[pt, sal]).getfunDerivada() * arraydeerroresdeneuronasendiccionario[sal] * arraydeentradasdelared[pt, ent]; } if (capOculta > 0 && capOculta < Convert.ToInt32(nudCapasocultas.Value)) { arraydesalidasdecapasocultasanterior = diccionariodelassalidasdecapa[capOculta - 1]; arraydematrizdepesos[sal, ent] += 2 * ratadeaprendizaje * new Funcionderivada(grilladecapasocultas.Rows[capOculta].Cells[2].Value.ToString(), arraydesalidadelacapaactual[pt, sal]).getfunDerivada() * arraydeerroresdeneuronasendiccionario[sal] * arraydesalidasdecapasocultasanterior[pt, ent]; } if (capOculta == Convert.ToInt32(nudCapasocultas.Value)) { arraydesalidasdecapasocultasanterior = diccionariodelassalidasdecapa[capOculta - 1]; arraydematrizdepesos[sal, ent] += 2 * ratadeaprendizaje * arraydeerroreslineales[sal] * arraydesalidasdecapasocultasanterior[pt, ent]; } } } diccionariodearraydematrizdepesos[capOculta] = arraydematrizdepesos; diccionariodearraydeumbrales[capOculta] = arraydeumbrales; } //Encontrando el error del patron... float totalerrorlineal = 0; for (int i = 0; i < salidas; i++) { totalerrorlineal = totalerrorlineal + Math.Abs(arraydeerroreslineales[i]); } arraydeerrordelospatrones[pt] = totalerrorlineal / salidas; } //Calculo del error por iteracion... errordeiteracion = 0; for (int i = 0; i < patrones; i++) { errordeiteracion += arraydeerrordelospatrones[i]; } errordeiteracion = errordeiteracion / patrones; listadeiteraciones.Add(conti); //Graficas generales... Graficarerror(); int times = 3; while (times > 0) { Application.DoEvents(); Thread.Sleep(1); times--; } label4.Text = "Iteracion: " + conti.ToString(); label8.Text = "Error RMS: " + errordeiteracion.ToString(); conti++; posiciongrafica++; } if (errordeiteracion <= errormaximopermitido) { MessageBox.Show("La red entrenó correctamente y obtuvo su pesos y umbrales optimos en la iteración número " + (listadeiteraciones.Count) + ".", "Red entranada exitosamente."); guardarpesosyumbrales(diccionariodearraydematrizdepesos, diccionariodearraydeumbrales); btnSimular.Enabled = true; btnSimular.BackColor = Color.LimeGreen; } else { MessageBox.Show("La red no termina aún su proceso de aprendizaje. ¡Sigue iterando!", "Red aún sin aprender."); nudErrormaximopermitido.Enabled = false; } }