コード例 #1
0
        /// <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;
        }
コード例 #2
0
        /// <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();
            }
        }