/// <summary> /// c) Update clustering by calculating the distance between the chromosome genes and the mean vectors for each cluster /// </summary> /// <param name="numClusters"></param> /// <param name="clusterMeanVectors"></param> /// <returns></returns> public bool updateClustering(int numClusters, double[][] clusterMeanVectors) { bool go = true; bool hasChanged = false; bool hasZeroMembers = false; //Run through all the chromosomes and compare its genes to all the mean vectors. Store new temporary clusterIds int[] tempClusterId = new int[chromosomes.Length]; for (int i = 0; i < chromosomes.Length; i++) { double[] distances = new double[numClusters]; //Run through the clusters in order to compare to each mean vector for (int j = 0; j < numClusters; j++) { distances[j] = Friends.calcDistance(chromosomes[i].GetGenes(), clusterMeanVectors[j]); } int newClusterId = identifyClusterId(distances); tempClusterId[i] = newClusterId; if (chromosomes[i].clusterId != newClusterId) { hasChanged = true; } } //Check that each new cluster contains at least one chromosome before changing the clusterId property int[] tempClusterCounts = new int[numClusters]; for (int i = 0; i < numClusters; i++) { tempClusterCounts[i] = 0; } for (int i = 0; i < chromosomes.Length; i++) { tempClusterCounts[tempClusterId[i]]++; } for (int i = 0; i < tempClusterCounts.Length; i++) { if (tempClusterCounts[i] == 0) { hasZeroMembers = true; } } //If no cluster has zero elements then update the chromosome clusterId property if (!hasZeroMembers) { for (int i = 0; i < chromosomes.Length; i++) { chromosomes[i].clusterId = tempClusterId[i]; } } //Check whether the cluster loop shall continue or not if (!hasChanged || hasZeroMembers) { go = false; } return(go); }