Beispiel #1
0
        public decimal Calcule(CalculData data)
        {
            /* Calcule la distance maximale entre deux vecteurs. */
            var copy        = data.Vecteurs.ToList();
            var distanceMax = data.Vecteurs.Max(a => copy.Max(b => _distance.Calcule(a, b)));

            /* Nombre de transition de chansons. */
            int nbTransitions = data.Vecteurs.Count - 1;

            decimal buffer          = 0;
            var     vecteursOrdonne = data.Vecteurs.OrderBy(v => v.Ordre).ToList();

            /* Parcourt les vecteurs ordonnés du 1er à l'avant dernier. */
            for (int rowIdx = 0; rowIdx < nbTransitions; rowIdx++)
            {
                /* Somme les distances avec le suivant. */
                var vecteurN  = vecteursOrdonne[rowIdx];
                var vecteurN1 = vecteursOrdonne[rowIdx + 1];
                buffer += _distance.Calcule(vecteurN, vecteurN1);
            }

            /* Normalise la somme des distance */
            buffer = buffer / (nbTransitions * distanceMax);

            return(buffer);
        }
Beispiel #2
0
        public void Tri(CalculData data)
        {
            var random = new Random(DateTime.Now.Millisecond);

            foreach (var vecteur in data.Vecteurs)
            {
                vecteur.Ordre = random.Next(1, 40);
            }
        }
        public void Prepare(CalculData data)
        {
            /* Parcourt les champs */
            var fieldIdxList = data.Vecteurs.First().Keys.ToList();

            foreach (int fieldIdx in fieldIdxList)
            {
                /* Calcul les extrema */
                var minValue = data.Vecteurs.Min(x => x[fieldIdx]);
                var maxValue = data.Vecteurs.Max(x => x[fieldIdx]);

                /* Normalise la coordonnée, pondéré par le poids. */
                foreach (var vecteur in data.Vecteurs)
                {
                    vecteur[fieldIdx] = _poidsMap[fieldIdx] * (vecteur[fieldIdx] - minValue) / (maxValue - minValue);
                }
            }
        }
        public void CalculeMatriceSimilarite(CalculData data)
        {
            var dim  = data.Vecteurs.Count;
            var axeX = data.Vecteurs.ToList();
            var axeY = data.Vecteurs.ToList();
            var matriceSimilarite = new MatriceSimilarite();

            for (int x = 1; x <= dim; x++)
            {
                for (int y = 1; y <= dim; y++)
                {
                    var vectX = axeX[x - 1];
                    var vectY = axeY[y - 1];
                    matriceSimilarite[vectX, vectY] = _distance.Calcule(vectX, vectY);
                }
            }

            data.MatriceSimilarite = matriceSimilarite;
        }
        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());
        }
Beispiel #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);
        }
Beispiel #7
0
 public void Prepare(CalculData data)
 {
     // RAS.
 }
Beispiel #8
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);
        }