/// <summary> /// Clusterization method for given groups number. /// </summary> /// <param name="clustersCount"> /// Groups count. /// </param> /// <param name="data"> /// Characteristics values for every object. /// First dimension represents objects. /// Second Dimension represents characteristics. /// </param> /// <returns> /// Optimal clusterization as <see cref="ClusterizationVariants"/>. /// </returns> public int[] Cluster(int clustersCount, double[][] data) { // all connections (pairs of elements) var connections = new List<Connection>(); // all elements var elements = new List<GraphElement>(); for (int i = 0; i < data.Length; i++) { elements.Add(new GraphElement(data[i], i)); } for (int j = 0; j < elements.Count - 1; j++) { for (int k = j + 1; k < elements.Count; k++) { connections.Add(new Connection(j, k)); } } manager = new GraphManager(connections, elements); // calculating distances CommonCalculator.CalculateCharacteristic(manager, normalizedDistanceWeight, distanceWeight); manager.ConnectGraph(); GraphManager tempManager = manager.Clone(); ChooseDivision(clustersCount, 0, manager); var result = new int[data.Length]; // extracting clusters from the graph for (int j = 0; j < optimalDivide.Elements.Count; j++) { result[j] = optimalDivide.Elements[j].TaxonNumber; } manager = tempManager; return result; }
public void GraphConnectionTest() { connectionsList[0].Connected = false; connectionsList[14].Connected = false; for (int i = 0; i < connectionsList.Count; i++) { elementsList[connectionsList[i].FirstElementIndex].TaxonNumber = 0; elementsList[connectionsList[i].SecondElementIndex].TaxonNumber = 0; } var lambdas = new[] { 10, 20, 15, 21, 6, 11, 12, 27, 16, 9, 25, 26, 13, 21, 22 }; for (int i = 0; i < lambdas.Length; i++) { connectionsList[i].Lambda = lambdas[i]; } var connector = new GraphManager(connectionsList, elementsList); connector.ConnectGraph(); Assert.IsTrue(connectionsList[0].Connected); Assert.IsTrue(connectionsList[4].Connected); Assert.IsTrue(connectionsList[5].Connected); Assert.IsTrue(connectionsList[9].Connected); Assert.IsTrue(connectionsList[12].Connected); Assert.IsFalse(connectionsList[1].Connected); Assert.IsFalse(connectionsList[2].Connected); Assert.IsFalse(connectionsList[3].Connected); Assert.IsFalse(connectionsList[6].Connected); Assert.IsFalse(connectionsList[7].Connected); Assert.IsFalse(connectionsList[8].Connected); Assert.IsFalse(connectionsList[10].Connected); Assert.IsFalse(connectionsList[11].Connected); Assert.IsFalse(connectionsList[13].Connected); Assert.IsFalse(connectionsList[14].Connected); }