public void countDistanceList(Point point) { for (int i = 0; i < distance.Count; i++) { distance[i] = MyMath.EuclidDistance(points[i], point); dist[i].distance = MyMath.EuclidDistance(points[i], point); } }
// найдем n точек которые максимально удалены от точки point в основном кластере public void findMaxDistance(Point point, int n) { List <double> distance = new List <double>(); for (int i = 0; i < points.Count; i++) { distance.Add(MyMath.EuclidDistance(points[i], generalCluster.weight)); } distance.Sort(); int test = 34; }
public void countWeight() { Point weightOld = new Point(weight.x, weight.y); // суммируем все координаты точек и делим на их количество weight.x = points.Sum(x => x.x) / points.Count(); weight.y = points.Sum(x => x.y) / points.Count(); // расстояние между центрами на текущей итерации и предыдущей distanceBetweenCM = MyMath.EuclidDistance(weightOld, weight); }
public void clustering(int clusterNum) { findCenters(clusterNum); // найдем самые дальние точки от центра общего кластера до остальных точек, в количестве clusterNum. findMaxDistance(generalCluster.weight, clusterNum); Random rnd = new Random(); Cluster[] clusters = new Cluster[] { new Cluster(points[rnd.Next(0, 19)]), new Cluster(points[rnd.Next(20, 39)]) }; for (int i = 0; i < dots.Count; i++) { clusterList.Add(new Cluster(dots[i])); } //clusterList = clusters.OfType<Cluster>().ToList(); while (true) { count++; for (int i = 0; i < points.Count; i++) { for (int j = 0; j < clusterList.Count(); j++) { clusterList[j].distance = MyMath.EuclidDistance(points[i], clusterList[j].weight); if (j == clusterList.Count() - 1) // заходим в этот блок кода на последнем шаге, чтобы проверить расстояния до всех кластеров { // находим минимальное расстояние из всех (смотрим расстояния от точки до всех кластеров) double minDist = clusterList.Min(a => a.distance); // получаем индекс кластера до которого расстояние минимальное int index = clusterList.FindIndex(r => r.distance.Equals(minDist)); // запишем в поле точки к какому маршруту она относится (номер маршрута = номеру кластера в списке points[i].pathNum = index; // добавим в нужный кластер текущую точку clusterList[index].addPoint(points[i]); } } } // Пересчитываем веса for (int i = 0; i < clusterList.Count(); i++) { clusterList[i].countWeight(); } if (clusterList.All(x => x.distanceBetweenCM < EPSILON) || (count > 99)) { break; } else { clusterList.ForEach(x => x.points.Clear()); } } int test = 3; }
// считаем исходную матрицу близости public void setInitialProximityMatrix() { for (int i = 0; i < (initialClusters.Count); i++) { for (int j = 0; j < (initialClusters.Count); j++) { if (i != j) { initialProximityMatrix[i, j] = MyMath.EuclidDistance(initialClusters[i], initialClusters[j]); } else { initialProximityMatrix[i, j] = 0; } } } }
public void findCenters(int centersCount) { for (int i = 0; i < points.Count; i++) { distance.Add(MyMath.EuclidDistance(points[i], generalCluster.weight)); dist.Add(new Dot(MyMath.EuclidDistance(points[i], generalCluster.weight))); } dist.Where(i => i.isChosen == false).Max(x => x.distance); int ind = distance.FindIndex(y => y == dist.Where(f => !f.isChosen).Max(x => x.distance)); //int index = distance.FindIndex(x => x == distance.Max()); dist[ind].isChosen = true; dots.Add(points[ind]); //dots.Add(points[index]); if (centersCount > 1) // Если кластеров больше одного, то входим в цикл { for (int i = 0; i < centersCount - 1; i++) { if (i == 0) // Только в первый раз ищем точку которая максимально далеко от первого класса // То есть по максимальному значению { countDistanceList(dots[i]); ind = distance.FindIndex(y => y == dist.Where(f => !f.isChosen).Max(x => x.distance)); //index = distance.FindIndex(x => x == distance.Max()); dist[ind].isChosen = true; dots.Add(points[ind]); } else { for (int j = 0; j < distance.Count; j++) { distance[j] = Math.Abs(distance[j] - MyMath.EuclidDistance(points[j], dots[i])); dist[j].distance = Math.Abs(dist[j].distance - MyMath.EuclidDistance(points[j], dots[i])); } //index = distance.FindIndex(x => x == distance.Min()); ind = distance.FindIndex(y => y == dist.Where(f => f.isChosen == false).Min(x => x.distance)); dist[ind].isChosen = true; dots.Add(points[ind]); //dots.Add(points[index]); } } } int test = 3; }
public void checkMaxRadius() { if (points.Max(x => MyMath.EuclidDistance(x, weight)) > maxRadius) { } }