/// <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); }
/// <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; } } } }
/// <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; } }