/** Min clustering... */ public Cluster minMaxAvrClustering() { int nrOfSubmissions = submissions.size(); boolean minClustering = (Options.MIN_CLUSTER == this.program.get_clusterType()); boolean maxClustering = (Options.MAX_CLUSTER == this.program.get_clusterType()); SimilarityMatrix simMatrix = this.program.get_similarity(); ArrayList<Cluster> clusters = new ArrayList<Cluster>(submissions.size()); for (int i = 0; i < nrOfSubmissions; i++) clusters.add(new Cluster(i, this)); while (clusters.size() > 1) { int indexA = -1, indexB = -1; float maxSim = -1; int nrOfClusters = clusters.size(); // find similarity for (int a = 0; a < (nrOfClusters - 1); a++) { Cluster cluster = clusters.get(a); for (int b = a + 1; b < nrOfClusters; b++) { float sim; if (minClustering) sim = cluster.maxSimilarity(clusters.get(b), simMatrix); else if (maxClustering) sim = cluster.minSimilarity(clusters.get(b), simMatrix); else sim = cluster.avrSimilarity(clusters.get(b), simMatrix); if (sim > maxSim) { maxSim = sim; indexA = a; indexB = b; } } } if (maxSim > maxMergeValue) maxMergeValue = maxSim; // now merge these clusters Cluster clusterA = clusters.get(indexA); Cluster clusterB = clusters.get(indexB); clusters.remove(clusterA); clusters.remove(clusterB); clusters.add(new Cluster(clusterA, clusterB, maxSim, this)); } return clusters.get(0); }