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); }
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()); }
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 void Prepare(CalculData data) { // RAS. }
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); }