示例#1
0
文件: Som.cs 项目: Specifica/som
        /// <summary>
        /// Devuelve una Lista de Listas de Tuplas(Doule,Doule) que contiene el historial de configuraciones de los pesos.
        /// El algoritmo tiene como condicion de Fin que se estabilicen los pesos, es decir que termina cuando la anteultima y ultima configuracion son iguales.
        /// </summary>
        /// <param name="Pesos">Lista de tuplas(double,double) que representa la configuracion de pesos iniciales.</param>
        /// <param name="Patrones">Lista de tuplas(double,double) que representa los patrones de entrada.</param>
        public List <List <Tuple <Double, Double> > > SOMAlgorithm(List <Tuple <Double, Double> > Pesos, List <Tuple <Double, Double> > Patrones)
        {
            this.HistorialActualizacion = new List <List <Tuple <Double, Double> > >();
            this.HistorialDistancias    = new List <List <Double> >();
            var UltimaConfig     = new List <Tuple <Double, Double> >();
            var AnteUltimaConfig = new List <Tuple <Double, Double> >();
            int i = 0;

            //foreach (var Patron in Patrones)
            do
            {
                var Patron = Patrones[i % 5];

                var IxGanador = FuncionActivacion(Pesos, Patron);
                Pesos = ActualizarPesos(Pesos, Patron, Patrones.IndexOf(Patron) + 1, IxGanador);


                HistorialActualizacion.Add(Pesos);    //Se guardan las configuraciones de pesos parciales. La ultima será la final.

                //Print pesos
                ////Console.WriteLine();
                ////Console.WriteLine("Nuevos Pesos:");
                //Pesos.ForEach(delegate(Tuple<Double, Double> peso) { //Console.WriteLine(peso.Item1 + "; " + peso.Item2); });
                //Console.WriteLine();

                i++;
                UltimaConfig = HistorialActualizacion.Last();

                if (i >= 2)
                {
                    AnteUltimaConfig = HistorialActualizacion.ElementAt(HistorialActualizacion.IndexOf(UltimaConfig) - 1);
                }
            } while (!UltimaConfig.SequenceEqual(AnteUltimaConfig));
            return(HistorialActualizacion);
        }
示例#2
0
        /// <summary>
        /// Devuelve una Lista de Listas de Tuplas(Doule,Doule) que contiene el historial de configuraciones de los pesos.
        /// El algoritmo tiene como condicion de Fin que se estabilicen los pesos, es decir que termina cuando la anteultima y ultima configuracion son iguales.
        /// La eleccion de los pesos Iniciales se realiza de forma aleatoria.
        /// </summary>
        /// <param name="Patrones">Lista de tuplas(double,double) que representa los patrones de entrada.</param>
        /// <param name="CantSalidas">Representa la cantidad de neuronas de salidas.</param>
        public List <List <Tuple <Double, Double> > > SOMAlgorithm(List <Tuple <Double, Double> > Patrones, int CantSalidas)
        {
            List <Tuple <Double, Double> > Pesos = new List <Tuple <Double, Double> >();
            Random rnd = new Random();

            for (int j = 0; j < CantSalidas; j++)
            {
                int signoX1 = rnd.NextDouble() < 0.5 ? -1 : 1;
                var pesoX1  = rnd.NextDouble() * signoX1;
                int signoX2 = rnd.NextDouble() < 0.5 ? -1 : 1;
                var pesoX2  = rnd.NextDouble() * signoX2;

                Pesos.Add(Tuple.Create(pesoX1, pesoX2));
            }

            this.HistorialActualizacion = new List <List <Tuple <Double, Double> > >();
            this.HistorialDistancias    = new List <List <Double> >();
            var UltimaConfig     = new List <Tuple <Double, Double> >();
            var AnteUltimaConfig = new List <Tuple <Double, Double> >();
            int i = 0;

            //foreach (var Patron in Patrones)
            do
            {
                var Patron    = Patrones[i % 5];
                var IxGanador = FuncionActivacion(Pesos, Patron);
                Pesos = ActualizarPesos(Pesos, Patron, Patrones.IndexOf(Patron) + 1, IxGanador);
                HistorialActualizacion.Add(Pesos);//Se guardan las configuraciones de pesos parciales. La ultima será la final.

                //Print pesos
                Console.WriteLine();
                Console.WriteLine("Nuevos Pesos:");
                Pesos.ForEach(delegate(Tuple <Double, Double> peso) { Console.WriteLine(peso.Item1 + "; " + peso.Item2); });
                Console.WriteLine();

                i++;
                UltimaConfig = HistorialActualizacion.Last();

                if (i >= 2)
                {
                    AnteUltimaConfig = HistorialActualizacion.ElementAt(HistorialActualizacion.IndexOf(UltimaConfig) - 1);
                }
            } while (!UltimaConfig.SequenceEqual(AnteUltimaConfig));
            return(HistorialActualizacion);
        }