예제 #1
0
        public void IndexMinHeap_RemoveFirst(IntHeapItem[] items)
        {
            //Create the heap and add the items.
            var heap = new IndexMinHeap <IntHeapItem>(items);

            for (var i = 0; i < items.Length; i++)
            {
                heap.Add(i);
            }

            //Check if the items are in the correct order.
            var previousValue = int.MinValue;

            for (var i = 0; i < items.Length; i++)
            {
                var value = items[heap.RemoveFirst()].Value;
                if (value >= previousValue)
                {
                    previousValue = value;
                }
                else
                {
                    Assert.Fail($"Value {value} is smaller than previous value {previousValue}");
                }
            }
        }
예제 #2
0
        public void TestIndexMinHeap()
        {
            int    n      = 1000000;
            Random random = new Random();
            var    heap   = new IndexMinHeap <int>(n);

            for (int i = 0; i < n; i++)
            {
                heap.Add((int)(random.Next() * n));
            }

            var arr = new int[n];

            for (var i = 0; i < n; i++)
            {
                arr[i] = heap.ExtractMin();
            }

            var success = true;

            for (var i = 1; i < n; i++)
            {
                if (arr[i - 1] > arr[i])
                {
                    success = false;
                }
            }

            Assert.AreEqual(true, success);
        }
예제 #3
0
 public void StartFindPath(DijkstraNode[] pathfindingNetwork, DefinitionNode[] definitionNodes, int startNodeIndex)
 {
     ResetNetwork(pathfindingNetwork);
     _openSet.AssignArray(pathfindingNetwork);
     _closedSet.Clear();
     _openSet.Add(startNodeIndex);
     pathfindingNetwork[startNodeIndex].Priority = 0f;
 }
 public void SetupContains()
 {
     _values = new IntHeapItem[Capacity];
     for (int i = 0; i < _values.Length; i++)
     {
         _values[i] = new IntHeapItem(i * 2);
     }
     _containsMinHeap = new IndexMinHeap <IntHeapItem>(_values);
     _containsMinHeap.Add(5);
 }
예제 #5
0
        public void IndexMinHeap_CorrectCapacity(IntHeapItem[] items)
        {
            //Create the heap and add the items.
            var heap = new IndexMinHeap <IntHeapItem>(items);

            for (var i = 0; i < items.Length; i++)
            {
                heap.Add(i);
            }
            Assert.AreEqual(items.Length, heap.Capacity);
        }
 public void SetupRemoveFirst()
 {
     _values = new IntHeapItem[Capacity];
     for (int i = 0; i < _values.Length; i++)
     {
         _values[i] = new IntHeapItem(i * 2);
     }
     _removeFirstMinHeap = new IndexMinHeap <IntHeapItem>(_values);
     for (int i = 0; i < _removeFirstMinHeap.Capacity; i++)
     {
         _removeFirstMinHeap.Add(i);
     }
 }
예제 #7
0
        public void Start(AstarNode[] pathfindingNetwork, DefinitionNode[] definitionNodes, int startNodeIndex, int targetNodeIndex, float neededClearance, PathfindaxCollisionCategory collisionCategory)
        {
            StartNodeIndex      = startNodeIndex;
            TargetNodeIndex     = targetNodeIndex;
            _neededClearance    = neededClearance;
            _collisionCategory  = collisionCategory;
            _pathfindingNetwork = pathfindingNetwork;
            _definitionNodes    = definitionNodes;

            _openSet.AssignArray(pathfindingNetwork);
            _closedSet.Clear();
            _openSet.Add(startNodeIndex);
        }
예제 #8
0
        public void IndexMinHeap_Contains_False(IntHeapItem[] items)
        {
            //Create the heap and add the items except the last one.
            var heap = new IndexMinHeap <IntHeapItem>(items);

            for (var i = 0; i < items.Length - 1; i++)
            {
                heap.Add(i);
            }

            //Check if the last one returns false
            var item = items[items.Length - 1];

            Assert.IsFalse(heap.Contains(items.Length - 1), $"Contains returned true for item {item}");
        }
예제 #9
0
        public void IndexMinHeap_Contains_True(IntHeapItem[] items)
        {
            //Create the heap and add the items.
            var heap = new IndexMinHeap <IntHeapItem>(items);

            for (var i = 0; i < items.Length; i++)
            {
                heap.Add(i);
            }

            //Check if all added items are contained in the heap.
            for (var i = 0; i < items.Length; i++)
            {
                Assert.IsTrue(heap.Contains(i), $"Contains returned false for item {items[i]}");
            }
        }
예제 #10
0
        public void IndexMinHeap_CheckHeapCondition(IntHeapItem[] items)
        {
            //Create the heap and add the items.
            var heap = new IndexMinHeap <IntHeapItem>(items);

            for (int i = 0; i < items.Length; i++)
            {
                heap.Add(i);
            }
            var indexes = heap.Select(i => items[i]).ToArray();

            for (int i = 0; i < items.Length; i++)
            {
                CheckHeapCondition(indexes, i);
            }
        }
예제 #11
0
        public void IndexMinHeap_RemoveFirst_LIFO()
        {
            var items = new[] { new IntHeapItem(1), new IntHeapItem(1), new IntHeapItem(1) };
            //Create the heap and add the items.
            var heap = new IndexMinHeap <IntHeapItem>(items);

            for (var i = 0; i < items.Length; i++)
            {
                heap.Add(i);
            }

            //Check if the elements are returned in LIFO order
            for (var i = items.Length - 1; i >= 0; i--)
            {
                var index = heap.RemoveFirst();
                Assert.IsTrue(index == i);
            }
        }
예제 #12
0
        public void IndexMinHeap_Enumerate(IntHeapItem[] items)
        {
            //Create the heap and add the items.
            var heap         = new IndexMinHeap <IntHeapItem>(items);
            var addedIndexes = new List <int>();

            for (var i = 0; i < items.Length; i++)
            {
                heap.Add(i);
                addedIndexes.Add(i);
            }
            Assert.AreEqual(items.Length, heap.Count);
            //Check if the added indexes are returned when enumerating
            var enumeratedHeap = heap.ToArray();

            Assert.AreEqual(items.Length, enumeratedHeap.Length);
            CollectionAssert.AreEquivalent(addedIndexes, enumeratedHeap);
        }
예제 #13
0
        public void IndexMinHeap_Contains_AddAndRemoveAll(IntHeapItem[] items)
        {
            //Create the heap and add the items except the last one.
            var heap = new IndexMinHeap <IntHeapItem>(items);

            for (var i = 0; i < items.Length; i++)
            {
                heap.Add(i);
            }

            while (heap.Count > 0)
            {
                heap.RemoveFirst();
            }

            for (var i = 0; i < items.Length; i++)
            {
                Assert.IsFalse(heap.Contains(i), $"Contains returned true for index {i}");
            }
        }
        public KruskalMST(IGraph <TWeight> graph)
        {
            G        = graph;
            ipq      = new IndexMinHeap <Edge <TWeight> >(2 * G.E);
            marked   = new bool[G.V];
            MSTEdges = new List <Edge <TWeight> >();

            for (var i = 0; i < G.V; i++)
            {
                foreach (Edge <TWeight> e in G.GetAdjIterator(i))
                {
                    ipq.Add(e);
                }
            }

            var uf = new UnionFind(G.V);

            while (!ipq.IsEmpty() && MSTEdges.Count < graph.V - 1)
            {
                var e = ipq.ExtractMin();
                if (uf.IsConnected(e.V, e.W))
                {
                    continue;
                }

                MSTEdges.Add(e);
                uf.UnionElements(e.V, e.W);
            }

            var value     = 0.0;
            var converter = TypeDescriptor.GetConverter(typeof(TWeight));

            foreach (var edge in MSTEdges)
            {
                value += (double)converter.ConvertTo(edge.Weight, typeof(double));
            }
            MSTWeight = (TWeight)converter.ConvertTo(value, typeof(TWeight));
        }
        static void Main(string[] args)
        {
            // 使用两种图的储存方式来读取文件
            string      fileName  = "TextG1.txt";
            SparseGraph graph     = new SparseGraph(13, false);
            ReadGraph   readGraph = new ReadGraph(graph, fileName);

            Console.WriteLine("test g1 in sparse graph ");
            graph.Show();

            Console.WriteLine();

            DenseGraph graph1     = new DenseGraph(13, false);
            ReadGraph  readGraph1 = new ReadGraph(graph1, fileName);

            Console.WriteLine("test g1 in dense graph ");

            graph1.Show();


            Console.WriteLine("===========================================");

            DenseGraph graph2     = new DenseGraph(13, false);
            ReadGraph  readGraph2 = new ReadGraph(graph2, fileName);
            Path       path       = new Path(graph2, 0);

            Console.WriteLine("test path g1 in dense graph ");

            path.ShowPath(4);


            Console.WriteLine("===========================================");

            WeightedDenseGraph <double> wgraph3    = new WeightedDenseGraph <double>(8, false);
            ReadWeightedGraph           readGraph3 = new ReadWeightedGraph(wgraph3, "testG1.txt");

            Console.WriteLine("test  in weighted dense graph ");

            wgraph3.Show();

            Console.WriteLine("===========================================");

            SparseWeightedGraph <double> wgraph4    = new SparseWeightedGraph <double>(8, false);
            ReadWeightedGraph            readGraph4 = new ReadWeightedGraph(wgraph4, "testG1.txt");

            Console.WriteLine("test  in weighted sparse graph ");

            wgraph4.Show();

            Console.WriteLine("Test MinHeap");
            int           n    = 100000;
            MinHeap <int> heap = new MinHeap <int>(n);
            Random        rand = new Random();

            for (int i = 0; i < n; i++)
            {
                heap.Add(rand.Next(n));
            }
            List <int> list = new List <int>();

            for (int i = 0; i < n; i++)
            {
                list.Add(heap.ExtractMin());
            }
            for (int i = 0; i < n - 1; i++)
            {
                if (list[i] > list[i + 1])
                {
                    throw new Exception("MinHeap error");
                }
            }


            Console.WriteLine("===========================================");
            Console.WriteLine("Test MST");

            SparseWeightedGraph <double> wgraph5    = new SparseWeightedGraph <double>(8, false);
            ReadWeightedGraph            readGraph5 = new ReadWeightedGraph(wgraph5, "testG1.txt");
            LazyPrimeMST <double>        mst        = new LazyPrimeMST <double>(wgraph5);
            List <Edge <double> >        mstPath    = mst.MstEdges();

            for (int i = 0; i < mstPath.Count; i++)
            {
                Console.WriteLine(mstPath[i]);
            }

            Console.WriteLine("Test Index MinHeap");

            IndexMinHeap <int> heap1 = new IndexMinHeap <int>(n);

            for (int i = 0; i < n; i++)
            {
                heap1.Add(i, rand.Next(n));
            }

            for (int i = 0; i < n / 2; i++)
            {
                heap1.Update(i, rand.Next(n));
            }

            List <int> list1 = new List <int>();

            for (int i = 0; i < n; i++)
            {
                list1.Add(heap1.ExtractMin());
            }

            for (int i = 0; i < n - 1; i++)
            {
                if (list1[i] > list1[i + 1])
                {
                    throw new Exception("IndexMinHeap error");
                }
            }


            Console.WriteLine("===========================================");
            Console.WriteLine("Test MST Optimization");

            SparseWeightedGraph <double> wgraph6    = new SparseWeightedGraph <double>(8, false);
            ReadWeightedGraph            readGraph6 = new ReadWeightedGraph(wgraph6, "testG1.txt");
            PrimMST <double>             mst1       = new PrimMST <double>(wgraph6);
            List <Edge <double> >        mstPath1   = mst1.MstEdges();

            for (int i = 0; i < mstPath1.Count; i++)
            {
                Console.WriteLine(mstPath1[i]);
            }
        }
예제 #16
0
 public void StartFindPath(AstarNode[] pathfindingNetwork, DefinitionNode[] definitionNodes, int startNodeIndex)
 {
     _openSet.AssignArray(pathfindingNetwork);
     _closedSet.Clear();
     _openSet.Add(startNodeIndex);
 }
 public void Add()
 {
     _addMinHeap.Add(_addMinHeap.Count);
 }