예제 #1
0
        public VecteurChanson Selectionne(VecteurChanson vecteurPrecedent, List <VecteurChanson> vecteursRestant, CalculData data)
        {
            /* Récupère les distances avec les vecteurs restants. */
            var distanceMap = vecteursRestant.ToDictionary(v => v, v => data.MatriceSimilarite[vecteurPrecedent, v]);

            /* Groupe par distance décroissante */
            var groupByDistance = distanceMap.GroupBy(t => t.Value, t => t.Key).OrderByDescending(t => t.Key).ToList();

            /* Prend le groupe des plus éloignés. */
            var group = groupByDistance.First();

            Console.WriteLine($"Distance du groupe le plus éloigné : {group.Key}");

            /* Pour chaque vecteur du groupe, calcule celui qui a le plus de voisins proches */
            var localDistanceSumMap = group.ToDictionary(v => v, v => vecteursRestant.Sum(w => data.MatriceSimilarite[v, w]));

            foreach (var t in localDistanceSumMap)
            {
                Console.WriteLine($"Somme distance : {t.Value}");
            }

            /* Sélectionne celui qui a le plus de voisin proche = celui avec la plus petite somme de distance. */
            var minSum          = localDistanceSumMap.Min(t => t.Value);
            var prochainVecteur = localDistanceSumMap.First(t => t.Value == minSum).Key;

            return(prochainVecteur);
        }
        public VecteurChanson Selectionne(VecteurChanson vecteurPrecedent, List <VecteurChanson> vecteursRestant, CalculData data)
        {
            /* Récupère les distances avec les vecteurs restants. */
            var distanceMap = vecteursRestant.ToDictionary(v => v, v => data.MatriceSimilarite[vecteurPrecedent, v]);

            /* Trie par distance */
            var vecteursRestantTries = distanceMap.OrderBy(t => t.Value).Select(t => t.Key).ToList();

            /* Choisie le prochain vecteur comme étant le médian. */
            return(vecteursRestantTries.Last());
        }
예제 #3
0
 public decimal this [VecteurChanson x, VecteurChanson y]
 {
     get
     {
         return(_map[new Tuple <int, int>(x.Id, y.Id)]);
     }
     set
     {
         _map[new Tuple <int, int>(x.Id, y.Id)] = value;
     }
 }
예제 #4
0
        public decimal Calcule(VecteurChanson a, VecteurChanson b)
        {
            decimal buffer = 0;

            /* Parcourt les champs */
            var fieldIdxList = a.Keys.ToList();

            foreach (int fieldIdx in fieldIdxList)
            {
                /* Ajoute la distance : 0 ou 1. */
                buffer += CalculeDistance(fieldIdx, a[fieldIdx], b[fieldIdx]);
            }

            return(buffer);
        }
        public decimal Calcule(VecteurChanson a, VecteurChanson b)
        {
            double buffer = 0;

            /* Parcourt les champs */
            var fieldIdxList = a.Keys.ToList();

            foreach (int fieldIdx in fieldIdxList)
            {
                buffer += Math.Pow((double)(b[fieldIdx] - a[fieldIdx]), 2);
            }

            buffer = Math.Sqrt(buffer);

            return((decimal)buffer);
        }
예제 #6
0
        public VecteurChanson Selectionne(VecteurChanson vecteurPrecedent, List <VecteurChanson> vecteursRestant, CalculData data)
        {
            /* Pour chaque vecteur restant, calcule celui qui a le plus de voisins proches */
            var localDistanceSumMap = vecteursRestant.ToDictionary(v => v, v => vecteursRestant.Sum(w => data.MatriceSimilarite[v, w]));

            /* Groupe par somme croissante */
            var groupByDistance = localDistanceSumMap.GroupBy(t => t.Value, t => t.Key).OrderBy(t => t.Key).ToList();

            /* Prend le groupe avec les voisins les plus proches. */
            var group = groupByDistance.First();

            /* Prend l'élément le plus éloigné du vecteur précédent. */
            var prochainVecteur = group.OrderBy(v => data.MatriceSimilarite[vecteurPrecedent, v]).Last();

            return(prochainVecteur);
        }
        public VecteurChanson CalculVecteurChanson(Chanson chanson)
        {
            if (chanson == null)
            {
                throw new ArgumentNullException(nameof(chanson));
            }

            var vecteur = new VecteurChanson {
                Chanson = chanson
            };

            vecteur[VecteurChanson.TempoKey]     = chanson.Tempo;
            vecteur[VecteurChanson.GenreKey]     = _genreMap[chanson.Genre];
            vecteur[VecteurChanson.TypeKey]      = _typeMap[chanson.Type];
            vecteur[VecteurChanson.FrequenceKey] = _frequenceMap[chanson.Frequence];

            return(vecteur);
        }