/// <summary> /// Отобразить кластеры рекурсивно. /// </summary> /// <param name="cluster">Кластер для отображения.</param> /// <param name="parentNode">Родительская вершина дерева.</param> private void DrawClustersRecursive(NetworkCluster cluster, TreeNode parentNode) { var index = parentNode.Nodes.Add(new TreeNode { Text = $"{cluster.Number} ({cluster.Entities?.Count ?? 0})", Tag = cluster }); if (!(cluster.Clusters?.Any() ?? false)) { return; } foreach (var subCluster in cluster.Clusters) { DrawClustersRecursive(subCluster, parentNode.Nodes[index]); } }
/// <summary> /// Тестировать сеть рекурсивно. /// </summary> /// <param name="cluster">Текущий кластер.</param> private void TestDataRecursive(NetworkCluster cluster) { if (!(cluster.Entities?.Any() ?? false) || !(cluster.Clusters?.Any() ?? false) || cluster.NetworkId == null) { return; } cluster.Clusters.ForEach(c => c.Entities.Clear()); var currentNetworkData = _networkService.GetNetworkData(cluster.NetworkId.Value); var neuralNetwork = IoC.Instance.Resolve<AbstractNetwork>(); neuralNetwork.InitializeNetwork( currentNetworkData.Neurons.Select(e => e.Neuron).ToList(), currentNetworkData.InputAttributes, currentNetworkData.Weights); RecalcMinMaxValues(cluster.Entities); foreach (var data in cluster.Entities) { var attributeValues = data.AttributeValues .Select(attr => new InputAttributeValue { InputAttributeNumber = attr.Attribute.OrderNumber, Value = attr.GetNormalizedValue(_neuralNetwork.NormalizationType) }) .ToList(); var result = neuralNetwork.GetNeuronWinner(attributeValues).NeuronNumber; cluster.Clusters.First(c => c.Number == result).Entities.Add(data); } foreach (var subCluster in cluster.Clusters) { TestDataRecursive(subCluster); } }