Exemple #1
0
        public void GenerateEuclideanOurNeoKruskalMST(int bucket)
        {
            if (VertexList.Count == 0)
            {
                return;
            }

            DateTime start = DateTime.Now;
            NeoDisjointSet <Vertex> disjointSet = new NeoDisjointSet <Vertex>(VertexList);

            EdgeSolution.Clear();
            C5.IPriorityQueue <Edge>[] heap2 = new C5.IntervalHeap <Edge> [bucket];
            C5.IPriorityQueue <Edge>   heap  = new C5.IntervalHeap <Edge>(new EdgeComparer());
            for (int i = 0; i < heap2.Length; i++)
            {
                heap2[i] = new C5.IntervalHeap <Edge>(new EdgeComparer());
            }


            //this.VisitedVertex = VertexList.Count;
            for (int i = 0; i < VertexList.Count - 1; i++)
            {
                for (int j = i + 1; j < VertexList.Count; j++)
                {
                    Edge e = new Edge(VertexList[i], VertexList[j]);
                    heap.Add(e);
                }
            }

            double max = heap.FindMax().Length;
            double min = heap.FindMin().Length;

            while (heap.Count > 0)
            {
                Edge s = heap.DeleteMin();
                heap2[(int)Math.Floor((((s.Length - min) / (max - min)) * (bucket - 1)))].Add(s);
            }

            for (int i = 0; i < bucket && disjointSet.Count > 0; i++)
            {
                while (heap2[i].Count > 0 && disjointSet.Count > 0)
                {
                    Edge s = heap2[i].DeleteMin();
                    if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond))
                    {
                        disjointSet.Union(s.VertexFirst, s.VertexSecond);
                        EdgeSolution.Add(s);
                    }
                }
            }

            Debug.WriteLine((DateTime.Now - start).TotalMilliseconds + " ms");
            //this.VisitedVertex = VertexList.Count;
        }
Exemple #2
0
        public void GenerateOurNeoKruskalMST(int bucket, double max, double min)
        {
            if (VertexList.Count == 0)
            {
                return;
            }
            if (max == min)
            {
                GenerateKruskalMST();
                return;
            }

            NeoDisjointSet <Vertex> disjointSet = new NeoDisjointSet <Vertex>(VertexList);

            ClearSolution();
            C5.IPriorityQueue <Edge>[] bucketHeap = new C5.IntervalHeap <Edge> [bucket];

            for (int i = 0; i < bucketHeap.Length; i++)
            {
                bucketHeap[i] = new C5.IntervalHeap <Edge>(new EdgeComparer());
            }

            int    factor = bucket - 1;
            double diff   = max - min;

            foreach (Edge e in EdgeList)
            {
                bucketHeap[(int)Math.Floor((((e.Length - min) / (diff)) * (factor)))].Add(e);
            }

            for (int i = 0; i < bucket && disjointSet.Count > 0; i++)
            {
                while (bucketHeap[i].Count > 0 && disjointSet.Count > 0)
                {
                    Edge s = bucketHeap[i].DeleteMin();
                    if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond))
                    {
                        disjointSet.Union(s.VertexFirst, s.VertexSecond);
                        EdgeSolution.Add(s);
                    }
                }
            }
        }
Exemple #3
0
        public void GenerateOurNeoKruskalMST(int bucket, double max, double min)
        {
            if (VertexList.Count == 0)
                return;
            if (max == min)
            {
                GenerateKruskalMST();
                return;
            }

            NeoDisjointSet<Vertex> disjointSet = new NeoDisjointSet<Vertex>(VertexList);
            ClearSolution();
            C5.IPriorityQueue<Edge>[] bucketHeap = new C5.IntervalHeap<Edge>[bucket];

            for (int i = 0; i < bucketHeap.Length; i++)
            {
                bucketHeap[i] = new C5.IntervalHeap<Edge>(new EdgeComparer());
            }

            int factor = bucket - 1;
            double diff = max - min;

            foreach (Edge e in EdgeList)
            {
                bucketHeap[(int)Math.Floor((((e.Length - min) / (diff)) * (factor)))].Add(e);
            }

            for (int i = 0; i < bucket && disjointSet.Count > 0; i++)
            {
                while (bucketHeap[i].Count > 0 && disjointSet.Count > 0)
                {
                    Edge s = bucketHeap[i].DeleteMin();
                    if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond))
                    {
                        disjointSet.Union(s.VertexFirst, s.VertexSecond);
                        EdgeSolution.Add(s);
                    }
                }
            }
        }
Exemple #4
0
        public void GenerateEuclideanOurNeoKruskalMST(int bucket)
        {
            if (VertexList.Count == 0)
                return;

            DateTime start = DateTime.Now;
            NeoDisjointSet<Vertex> disjointSet = new NeoDisjointSet<Vertex>(VertexList);
            EdgeSolution.Clear();
            C5.IPriorityQueue<Edge>[] heap2 = new C5.IntervalHeap<Edge>[bucket];
            C5.IPriorityQueue<Edge> heap = new C5.IntervalHeap<Edge>(new EdgeComparer());
            for (int i = 0; i < heap2.Length; i++)
            {
                heap2[i] = new C5.IntervalHeap<Edge>(new EdgeComparer());
            }

            //this.VisitedVertex = VertexList.Count;
            for (int i = 0; i < VertexList.Count - 1; i++)
                for (int j = i + 1; j < VertexList.Count; j++)
                {
                    Edge e = new Edge(VertexList[i], VertexList[j]);
                    heap.Add(e);
                }

            double max = heap.FindMax().Length;
            double min = heap.FindMin().Length;

            while (heap.Count > 0)
            {
                Edge s = heap.DeleteMin();
                heap2[(int)Math.Floor((((s.Length - min) / (max - min)) * (bucket - 1)))].Add(s);
            }

            for (int i = 0; i < bucket && disjointSet.Count > 0; i++)
            {
                while (heap2[i].Count > 0 && disjointSet.Count > 0)
                {
                    Edge s = heap2[i].DeleteMin();
                    if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond))
                    {

                        disjointSet.Union(s.VertexFirst, s.VertexSecond);
                        EdgeSolution.Add(s);
                    }
                }
            }

            Debug.WriteLine((DateTime.Now - start).TotalMilliseconds + " ms");
            //this.VisitedVertex = VertexList.Count;
        }