Ejemplo n.º 1
0
        /// <summary>
        /// Renvoie le voisinage du gagnant
        /// </summary>
        /// <param name="gagnant"></param>
        /// <param name="totalIteration"></param>
        /// <param name="iterationCourante"></param>
        /// <returns></returns>
        private List <KohonenNeurone> Voisinage(KohonenNeurone gagnant, int totalIteration, int iterationCourante)
        {
            // on commence par calculer le rayon
            double rayon = FonctionsAttenuation.Sigma(RayonCarte, totalIteration, iterationCourante);

            // on recherche les neurones présents dans le rayon
            // leurs poids seront ajustés
            List <KohonenNeurone> voisinage = new List <KohonenNeurone>();

            for (int x = 0; x < Grille.GetLength(0); x++)
            {
                for (int y = 0; y < Grille.GetLength(1); y++)
                {
                    KohonenNeurone neurone = Grille[x, y];
                    neurone.Distance = Distance(neurone, gagnant);

                    if (neurone.Distance <= rayon)
                    {
                        voisinage.Add(neurone);
                    }
                }
            }

            Debug.WriteLine("Voisinage: " + voisinage.Count.ToString());
            return(voisinage);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Ajuste les poids de la carte
        /// </summary>
        /// <param name="voisinage">Voisinage du réseau gagnant pour l'itération en cours</param>
        /// <param name="iterations">Nombre max d'itérations prévues</param>
        /// <param name="iterationCourante">Iteration en cours</param>
        /// <param name="entrees">Entrées du réseau</param>
        private void AjusterPoids(IEnumerable <KohonenNeurone> voisinage, double[] entrees, int iterations, int iterationCourante)
        {
            foreach (KohonenNeurone neurone in voisinage)
            {
                // le facteur d'atténuation (diminue avec la distance au neurone gagnant)
                double facteur = FonctionsAttenuation.Gaus(neurone.Distance, RayonCarte, iterations, iterationCourante);
                for (int p = 0; p < neurone.Poids.Length; p++)
                {
                    double ecart = facteur * Pas * (entrees[p] - neurone.Poids[p]);
                    neurone.Poids[p] += ecart;
                    neurone.Poids[p]  = (int)neurone.Poids[p];

                    if (neurone.Poids[p] < 0)
                    {
                        neurone.Poids[p] = 0;
                    }
                    if (neurone.Poids[p] > LargeurMax && p == 0)
                    {
                        neurone.Poids[p] = LargeurMax;
                    }
                    if (neurone.Poids[p] > HauteurMax && p == 1)
                    {
                        neurone.Poids[p] = HauteurMax;
                    }
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Ajuste les poids de la carte
        /// </summary>
        /// <param name="voisinage">Voisinage du réseau gagnant pour l'itération en cours</param>
        /// <param name="iterations">Nombre max d'itérations prévues</param>
        /// <param name="iterationCourante">Iteration en cours</param>
        /// <param name="entrees">Entrées du réseau</param>
        private void AjusterPoids(IEnumerable <KohonenNeurone> voisinage, double[] entrees, int iterations, int iterationCourante)
        {
            foreach (KohonenNeurone neurone in voisinage)
            {
                // le facteur d'atténuation (diminue avec la distance au neurone gagnant)
                double facteur = FonctionsAttenuation.Gaus(neurone.Distance, RayonCarte, iterations, iterationCourante);
                for (int p = 0; p < neurone.Poids.Length; p++)
                {
                    double ecart = facteur * Pas * (entrees[p] - neurone.Poids[p]);
                    neurone.Poids[p] += ecart;
                }

                neurone.Couleur = Color.Transparent;
            }
        }