コード例 #1
0
        public double ClusterDistanceAverage(Cluster oper, IDissimilarity diss)
        {
            double sum  = 0;
            int    cant = 0;

            foreach (Element element in oper.Elements)
            {
                foreach (Element operElement in this.Elements)
                {
                    sum += diss.CalculateDissimilarity(element, operElement);
                    cant++;
                }
            }
            return((double)sum / (double)cant);
        }
コード例 #2
0
        /// <summary>
        /// Dissimilarity
        /// </summary>
        public static double Dissimilarity(this IDissimilarity rules, IEnumerable <int> left, IEnumerable <int> right)
        {
            if (rules is null)
            {
                throw new ArgumentNullException(nameof(rules));
            }
            else if (left is null)
            {
                throw new ArgumentNullException(nameof(left));
            }
            else if (right is null)
            {
                throw new ArgumentNullException(nameof(right));
            }

            return(rules.Dissimilarity(left.Select(x => x != 0), right.Select(x => x != 0)));
        }
コード例 #3
0
        public double ClusterDistanceComplete(Cluster oper, IDissimilarity diss)
        {
            double max = double.MinValue;

            for (int i = 0; i < Elements.Count; i++)
            {
                for (int j = 0; j < oper.Elements.Count; j++)
                {
                    double dissValue = diss.CalculateDissimilarity(Elements[i], oper.Elements[j]);
                    if (dissValue > max)
                    {
                        max = dissValue;
                    }
                }
            }
            return(max);
        }
コード例 #4
0
        public double ClusterDistanceSingle(Cluster oper, IDissimilarity diss)
        {
            double min = double.MaxValue;

            for (int i = 0; i < Elements.Count; i++)
            {
                for (int j = 0; j < oper.Elements.Count; j++)
                {
                    double dissValue = diss.CalculateDissimilarity(Elements[i], oper.Elements[j]);
                    if (dissValue < min)
                    {
                        min = dissValue;
                    }
                }
            }
            return(min);
        }
コード例 #5
0
        public List <Tupla <Cluster> > PerfectMating(Partition partition, IDissimilarity diss)
        {
            double[,] distances = new double[Clusters.Count, partition.Clusters.Count];
            for (int i = 0; i < Clusters.Count; i++)
            {
                for (int j = 0; j < partition.Clusters.Count; j++)
                {
                    distances[i, j] = Clusters.Values.ToList <Cluster>()[i].ClusterDistanceAverage(partition.Clusters.Values.ToList <Cluster>()[j], diss);
                }
            }
            List <Tupla <int> > bestsolution = new List <Tupla <int> >();

            //      SearchAlgoritmNonInformedBPP(0, Clusters.Count, new bool[partition.Clusters.Count], new List<Tupla<Cluster>>(), bestsolution,this,partition);
            SearchAlgoritmInformedSimulatedAnnealing(100, 0.5, 10, 5, ref bestsolution, distances);

            List <Tupla <Cluster> > result = new List <Tupla <Cluster> >();

            foreach (var tupla in bestsolution)
            {
                result.Add(new Tupla <Cluster>(Clusters.Values.ToList <Cluster>()[tupla.I], partition.Clusters.Values.ToList <Cluster>()[tupla.J]));
            }

            return(result);
        }
コード例 #6
0
 public AgglomerativeLinks(Set set, IDissimilarity diss, CalculateClusterDistance CalculateClusterDistance)
     : base(set, diss)
 {
     this.CalculateClusterDistance = CalculateClusterDistance;
 }