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); }
/// <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))); }
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); }
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); }
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); }
public AgglomerativeLinks(Set set, IDissimilarity diss, CalculateClusterDistance CalculateClusterDistance) : base(set, diss) { this.CalculateClusterDistance = CalculateClusterDistance; }