/// <summary> /// Метод кластеризации Dbscan с использованием R*-дерева /// </summary> /// <param name="path">Путь до файла с точками</param> /// <param name="eps"></param> /// <param name="minPTS"></param> void UseOnlyDBScanwithRtree(string path, double eps, int minPTS) { bool check = true; List <Point> points = new List <Point>(0); try { points = WorkWithFile.GetPointFromFile(path); progressBar1.Value = 30; } catch (ArgumentException ex) { check = false; MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); progressBar1.Value = 0; } if (check) { Stopwatch dbscantime = new Stopwatch(); int count_of_db; //if (ForRstartree.MAX_M ) dbscantime.Start(); Dbscanwithrtree.Clustering(points, eps, minPTS, out count_of_db); dbscantime.Stop(); progressBar1.Value = 70; MessageBox.Show("Количество точек: " + points.Count + "\n" + "Время выполнения DBScan с R*-деревом: " + dbscantime.Elapsed.Seconds + " сек." + "\n" + "Скорость выполнения: " + $"{ ((dbscantime.Elapsed.Seconds > 0) ? (points.Count / dbscantime.Elapsed.Seconds) : points.Count):F2} точки в сек.", "Время выполнения", MessageBoxButtons.OK, MessageBoxIcon.Information); Graph.Graphic f2 = new Graph.Graphic(points, count_of_db, dbscantime, "Алгоритм кластеризации DBscan с использованием R*-дерева"); progressBar1.Value = 100; f2.Show(); } progressBar1.Value = 100; }
/// <summary> /// Кластеризация FastDBScan /// </summary> /// <param name="path"></param> /// <param name="k"></param> /// <param name="eps"></param> /// <param name="minPTS"></param> /// <param name="t"></param> void UseOnlyFastDBScan(string path, int k, double eps, int minPTS, int t) { bool check = true; Stopwatch dbscantime = new Stopwatch(); Stopwatch kmeantime = new Stopwatch(); List <Point> points = new List <Point>(0); try { points = WorkWithFile.GetPointFromFile(path); progressBar1.Value = 30; } catch (ArgumentException ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); check = false; progressBar1.Value = 0; } if (k > points.Count) { MessageBox.Show("Введенный параметр K больше чем количество точек в выбранном файле. Уменьшите К или выберите другой файл!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); check = false; progressBar1.Value = 0; } if (check) { kmeantime.Start(); int[] clustering = kmeans.Cluster(points, k - 1, 0); progressBar1.Value = 50; for (int i = 0; i < points.Count; i++) { points[i].cluster = clustering[i]; } progressBar1.Value = 30; kmeantime.Stop(); List <MyLib.Point> fordbscan = new List <MyLib.Point>(0); for (int i = 0; i < k; i++) { int count = 0; for (int j = 0; j < points.Count; j++) { if (points[j].cluster == i) { count++; } } int finalcount = (int)Math.Ceiling((double)count * t / 100); int l = 0; for (int m = 0; m < points.Count; m++) { if (points[m].cluster == i && l < finalcount) { fordbscan.Add(points[m]); l++; } } } progressBar1.Value = 70; dbscantime.Start(); int count_db = dbscan.Clustering(fordbscan, eps, minPTS); GetFullPicture(fordbscan, k, count_db); progressBar1.Value = 80; dbscantime.Stop(); MessageBox.Show("Количество точек: " + points.Count + "\n" + "Время выполнения K-means: " + kmeantime.Elapsed.Seconds + " сек." + "\n" + "Время выполнения DBScan: " + dbscantime.Elapsed.Seconds + " сек." + "\n" + "Общее время выполнения: " + (kmeantime.Elapsed.Seconds + dbscantime.Elapsed.Seconds) + " сек." + "\n" + "Скорость выполнения: " + $"{((kmeantime.Elapsed.Seconds + dbscantime.Elapsed.Seconds > 0) ? (points.Count / (kmeantime.Elapsed.Seconds + dbscantime.Elapsed.Seconds)) : points.Count):F2} точки в сек.", "Время выполнения", MessageBoxButtons.OK, MessageBoxIcon.Information); Graph.Graphic f1 = new Graph.Graphic(points, k, kmeantime, dbscantime, "Алгоритм кластеризации FastDbscan без ипользования R*-дерева"); progressBar1.Value = 100; f1.Show(); } }