double GetSilhouette(Element e)
        {
            if (Structuring.HaveUnassignedElements() && Structuring.IsUnassigned(e))
                return 0;

            EuclideanDistance ed = new EuclideanDistance();
            ed.AttributesToCalculateProximity = Set.Attributes.Values;
            
            Cluster actual = Structuring.GetCluster(e)[0];

            double ai = ed.CalculateProximity(e, actual.Centroid);

            double bi = double.MaxValue;
            foreach (var cluster in Structuring.Clusters.Values)
            {
                if (actual.Name != cluster.Name)
                {
                    double aux = ed.CalculateProximity(e, cluster.Centroid);
                    if (aux < bi)
                        bi = aux;
                }
            }
            return (bi - ai) / Math.Max(bi, ai);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override double EvaluatePartition()
        {
            UpdatesCentroids();

            EuclideanDistance ed = new EuclideanDistance();
            ed.AttributesToCalculateProximity = Set.Attributes.Values;

            double result = 0;
            foreach (var cluster in Structuring.Clusters.Values)
            {
                foreach (var item in cluster.Elements)
                {
                    result += ed.CalculateProximity(item, cluster.Centroid);
                }
            }

            return Math.Sqrt(result / Set.ElementsCount);
        }
        public void FillHeaps()
        {
            if (Set == null)
                throw new NullReferenceException("Error conjunto NULL en la Medida Dunn");

            lh = new List<HeapArray<Container>>(Set.ElementsCount);
            for (int i = 0; i < Set.Elements.Count; i++)
            {
                lh.Add(new HeapArray<Container>(Set.Elements.Count - 1));//No se pone la diss de un elemento con el mismo
            }

            EuclideanDistance ed = new EuclideanDistance();
            ed.AttributesToCalculateProximity = Set.Attributes.Values;

            for (int i = 0; i < Set.ElementsCount; i++)
            {
                for (int j = i + 1; j < Set.ElementsCount; j++)
                {
                    double distance = ed.CalculateProximity(Set.Elements[i], Set.Elements[j]);
                    lh[i].Add(new Container() { Rank = distance, Name = i, Cluster = j });
                    lh[j].Add(new Container() { Rank = distance, Name = j, Cluster = i });

                }
            }
        }