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}"); } } }
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); }
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); }
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); } }
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); }
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}"); }
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]}"); } }
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); } }
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); } }
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); }
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]); } }
public void StartFindPath(AstarNode[] pathfindingNetwork, DefinitionNode[] definitionNodes, int startNodeIndex) { _openSet.AssignArray(pathfindingNetwork); _closedSet.Clear(); _openSet.Add(startNodeIndex); }
public void Add() { _addMinHeap.Add(_addMinHeap.Count); }