public static void DijkstraAlgorithm(Dictionary<Node, List<Connection>> graph, Node source)
        {
            PriorityQueue<Node> queue = new PriorityQueue<Node>();

            foreach (var item in graph)
            {
                item.Key.DijkstraDistance = long.MaxValue;
            }

            queue.Enqueue(source);
            source.DijkstraDistance = 0;

            while (queue.Count != 0)
            {
                var currentNode = queue.Dequeue();

                foreach (var connection in graph[currentNode])
                {
                    var dist = connection.Distance + currentNode.DijkstraDistance;

                    if (dist < connection.ToNode.DijkstraDistance)
                    {
                        connection.ToNode.DijkstraDistance = dist;
                        queue.Enqueue(connection.ToNode);
                    }
                }
            }
        }
예제 #2
0
        public PathFinder(Grid graph, Cell start, Cell goal)
        {
            //  Priority Queue which contains cells that are candidates for examining, lowest priority to the node with the lowest f value
            var frontier = new PriorityQueue<Cell>();
            frontier.Enqueue(start, 0);

            cameFrom[start] = start;
            costSoFar[start] = 0;

            while (frontier.Count > 0)
            {
                var current = frontier.Dequeue();

                // Exit the search if goal have discovered
                if (current.Equals(goal)) { break; }

                // discovers the neighbours
                foreach (var next in graph.Neighbors(current))
                {
                    int newCost = costSoFar[current] + graph.Cost(current, next);

                    if (!costSoFar.ContainsKey(next) || newCost < costSoFar[next])
                    {
                        costSoFar[next] = newCost;

                        // f = g + h
                        int priority = newCost + Heuristic(next, goal);

                        frontier.Enqueue(next, priority);
                        cameFrom[next] = current;
                    }
                }
            }
        }
예제 #3
0
        public void PriorityQueue()
        {
            PriorityQueue<int> pq = new PriorityQueue<int>(LinqExt.TakeMore);
            pq.Enqueue(1, 1);
            pq.Enqueue(9, 9);
            pq.Enqueue(2, 2);
            pq.Enqueue(5, 5);

            Assert.IsTrue(pq.First() == 9, "Wrong Priority");
            Assert.IsTrue(pq.Dequeue() == 9, "Wrong Priority");
            Assert.IsTrue(pq.Dequeue() == 5, "Wrong Priority");

            pq.ChangePriority(1, 29);
            Assert.IsTrue(pq.First() == 1, "Wrong Priority, 1 should be first priority now with priority 29");

            pq.Enqueue(3, 2); //add item with same priority
            pq.Enqueue(4, 2); //add item with same priority

            Assert.IsTrue(pq.Last() == 4, "Wrong Priority, 4 should be last");

            pq.Enqueue(30, 30); // mix case
            Assert.IsTrue(pq.First() == 30, "Wrong Priority, 30 should be first priority");

            pq.Enqueue(31, 30); // mix case
            Assert.IsTrue(pq.First() == 30, "Wrong Priority, 30 should still be first priority");

            pq.Enqueue(5, 2); //add item with same priority
            pq.Enqueue(6, 2); //add item with same priority

            Assert.IsTrue(pq.Last() == 6, "Wrong Priority, 6 should be last");
        }
        public ForegroundNotificationService()
        {
            _workQueue = new PriorityQueue();
            _lastProcessedTimeInMS = Environment.TickCount;

            Task.Factory.SafeStartNewFromAsync(ProcessAsync, CancellationToken.None, TaskScheduler.Default);
        }
예제 #5
0
        public void Remove()
        {
            PriorityQueue<int> p = new PriorityQueue<int>(delegate(int i, int j) { return i - j; });
            Random r = new Random();
            for(int i = 0; i < 10000; ++i) {
                p.Enqueue(r.Next(1000));
            }

            int removed = 0;
            while(removed < 100) {
                int count = p.Count;
                p.Remove(r.Next(1000));
                if(count > p.Count) {
                    ++removed;
                }
            }

            int item = p.Dequeue();
            while(p.Count > 0) {
                int next = p.Dequeue();
                if(next < item) {
                    Assert.Fail("bad order detected");
                }
            }
        }
예제 #6
0
        static void Main(string[] args)
        {
            var pq = new PriorityQueue<int, int>();

            pq.Insert(new KeyValuePair<int, int>(0, 0));
            pq.Insert(new KeyValuePair<int, int>(1, 1));
            pq.Insert(new KeyValuePair<int, int>(4, 5));
            pq.Insert(new KeyValuePair<int, int>(1, 1));
            pq.Insert(new KeyValuePair<int, int>(3, 3));
            pq.Insert(new KeyValuePair<int, int>(2, 2));
            pq.Insert(new KeyValuePair<int, int>(5, 5));
            pq.Insert(new KeyValuePair<int, int>(4, 4));

            KeyValuePair<int, int> pair;

            for (var i = 0; i < 10; i++)
            {
                if (pq.TryExtractMinimum(out pair))
                {
                    Console.WriteLine("key: {0}, value: {1}", pair.Key, pair.Value);
                }
                else
                {
                    Console.WriteLine("Not extracted");
                }
            }

            Console.ReadLine();
        }
예제 #7
0
        static void Solve(Dictionary<int, Node> allNodes, Node startNode)
        {
            foreach (var node in allNodes.Values)
            {
                node.Distance = int.MaxValue;
            }

            startNode.Distance = 0;

            PriorityQueue<Node> nodes = new PriorityQueue<Node>();
            nodes.Enqueue(startNode);

            while (nodes.Count > 0)
            {
                var node = nodes.Dequeue();

                if (node.Distance == int.MaxValue)
                {
                    break;
                }

                for (int i = 0; i < node.Connections.Count; i++)
                {
                    var newDistance = node.Distance + node.Connections[i].Distance;
                    if (newDistance < node.Connections[i].ToNode.Distance)
                    {
                        node.Connections[i].ToNode.Distance = newDistance;
                        nodes.Enqueue(node.Connections[i].ToNode);
                    }
                }
            }
        }
예제 #8
0
        private static void Dijkstra(Graph<int> graph, Node<int> source)
        {
            var queue = new PriorityQueue<Node<int>>();
            foreach (var node in graph.NodesCollection.Keys)
            {
                node.DijkstraDistance = double.PositiveInfinity;
            }

            source.DijkstraDistance = 0.0d;
            queue.Enqueue(source);

            while (queue.Count != 0)
            {
                var currentNode = queue.Dequeue();

                if (double.IsPositiveInfinity(currentNode.DijkstraDistance))
                {
                    break;
                }

                foreach (var neighbor in currentNode.Collection)
                {
                    var potDistance = currentNode.DijkstraDistance + neighbor.Distance;
                    if (potDistance < neighbor.Target.DijkstraDistance)
                    {
                        neighbor.Target.DijkstraDistance = potDistance;
                        queue.Enqueue(neighbor.Target);
                    }

                }
            }
        }
예제 #9
0
 public void Enqueue_into_empty_queue()
 {
     var queue = new List<PriorityQueue<string>.Element>();
     var sut = new PriorityQueue<string>(queue);
     sut.Enqueue("a", 10);
     Assert.That(queue, Is.EqualTo(new[]{new PriorityQueue<string>.Element("a", 10)}));
 }
예제 #10
0
        public static void Main()
        {
            // 1.
            var priorityQueue = new PriorityQueue<int>();
            priorityQueue.Enqueue(2);
            priorityQueue.Enqueue(7);
            priorityQueue.Enqueue(17);
            priorityQueue.Enqueue(19);
            priorityQueue.Enqueue(26);
            priorityQueue.Enqueue(29);
            priorityQueue.Dequeue();
            priorityQueue.Enqueue(3);
            priorityQueue.Enqueue(1);
            priorityQueue.Dequeue();
            priorityQueue.Enqueue(25);
            priorityQueue.Enqueue(36);
            priorityQueue.Dequeue();

            Console.WriteLine();

            // 2.
            PrintFirst20Products();

            Console.WriteLine();

            // 3.
            CountWords();
        }
        // Dijkstra's shortest paths algorithm, implemented
        // with priority queue. Running time: O(M * log M)
        // Learn more at: https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Using_a_priority_queue
        public static void DijkstraAlgorithm(
            Dictionary<Node, List<Edge>> graph,
            Node sourceNode)
        {
            var queue = new PriorityQueue<Node>();

            foreach (var node in graph)
            {
                node.Key.Distance = double.PositiveInfinity;
            }
            sourceNode.Distance = 0.0d;
            queue.Enqueue(sourceNode);

            while (queue.Count != 0)
            {
                var currentNode = queue.Dequeue();

                if (double.IsPositiveInfinity(currentNode.Distance))
                {
                    // All nodes processed --> algorithm finished
                    break;
                }

                foreach (var childEdge in graph[currentNode])
                {
                    var newDistance = currentNode.Distance + childEdge.Distance;
                    if (newDistance < childEdge.Node.Distance)
                    {
                        childEdge.Node.Distance = newDistance;
                        childEdge.Node.PreviousNode = currentNode;
                        queue.Enqueue(childEdge.Node);
                    }
                }
            }
        }
예제 #12
0
        static void Main(string[] args)
        {
            var queue = new PriorityQueue<int>();

            queue.Enqueue(5);
            queue.Enqueue(8);
            queue.Enqueue(3);
            queue.Enqueue(4);
            queue.Enqueue(11);

            foreach (var i in queue)
            {
                Console.WriteLine(i);
            }


            Console.WriteLine("*******Removed value:{0}",queue.Dequeue());
            foreach (var i in queue)
            {
                Console.WriteLine(i);
            }
            Console.WriteLine("*******Removed value:{0}", queue.Dequeue());
            foreach (var i in queue)
            {
                Console.WriteLine(i);
            }
        }
예제 #13
0
        public static IEnumerable<int?> Find(DirectedWeightedGraph graph, int source)
        {
            var dist = new int?[graph.NodesCount];
            dist[source] = 0;

            var closestNodes = new PriorityQueue<int, int>(dist.Select((d, i) => new KeyValuePair<int, int>(i, d.GetValueOrDefault(int.MaxValue))));
            var exploredNodes = new HashSet<int>();

            while (closestNodes.Count != 0)
            {
                var node = closestNodes.ExtractHighestPriorityElement();
                exploredNodes.Add(node);
                foreach (var edge in graph.GetEdges(node).Where(e => !exploredNodes.Contains(e.EndNode)))
                {
                    if (dist[node] != null)
                    {
                        var alt = dist[node].Value + edge.Weight;
                        if (alt < dist[edge.EndNode].GetValueOrDefault(int.MaxValue))
                        {
                            dist[edge.EndNode] = alt;
                            closestNodes.ChangePriority(edge.EndNode, alt);
                        }
                    }
                }
            }

            return dist;
        }
예제 #14
0
 /// <summary>
 /// Creates a new EventQueue instance and starts the main thread.
 /// </summary>
 public EventQueue()
 {
     q = new PriorityQueue<INaoEvent>(4);
     thread = new Thread(new ThreadStart(Run));
     thread.IsBackground = true;
     thread.Start();
 }
예제 #15
0
        public static void Main()
        {
            //Heap test

            //Heap<int> testHeap = new Heap<int>();
            //testHeap.Push(3);
            //testHeap.Push(4);
            //testHeap.Push(5);
            //testHeap.Push(1);
            //testHeap.Push(6);

            //while (testHeap.Count > 0)
            //{
            //    testHeap.Pop();
            //    testHeap.Print();
            //}

            //Queue test
            PriorityQueue<int> queue = new PriorityQueue<int>();
            queue.Enqueue(3);
            queue.Enqueue(4);
            queue.Enqueue(5);
            queue.Enqueue(1);
            queue.Enqueue(6);

            queue.Print();

            while (queue.Count > 0)
            {
                queue.Dequeue();
                queue.Print();
            }
        }
예제 #16
0
        public static void FindMinimalPaths(Dictionary<Node, List<Street>> graph, Node source)
        {
            PriorityQueue<Node> queue = new PriorityQueue<Node>();

            foreach (var node in graph)
            {
                if (source.ID != node.Key.ID)
                {
                    node.Key.DijkstraDistance = ulong.MaxValue;
                }
            }

            source.DijkstraDistance = 0;
            queue.Enqueue(source);

            while (queue.Count != 0)
            {
                Node currentNode = queue.Dequeue();

                foreach (var neighbour in graph[currentNode])
                {
                    ulong potDistance = currentNode.DijkstraDistance + neighbour.Distance;

                    if (potDistance < neighbour.Node.DijkstraDistance)
                    {
                        neighbour.Node.DijkstraDistance = potDistance;
                        // adds only modified elements in the queue
                        // thus reordering the queue after each iteration is avoided
                        queue.Enqueue(neighbour.Node);
                    }
                }
            }
        }
예제 #17
0
        public WordTranslation(string orginalWord, IEnumerable<Tuple<int, Word>> words)
        {
            OrginalWord = orginalWord;
            WordsList = new PriorityQueue<int, Word>(Comparer<int>.Default);

            CompleteList(words);
        }
예제 #18
0
        public void WorkPriorityQueue()
        {
            //throw new NotImplementedException();
            PriorityQueue<int> testQueue = new PriorityQueue<int>();
            testQueue.Enqueue(1, 0);
            testQueue.Enqueue(2, 0);
            testQueue.Enqueue(3, 0);
            testQueue.Enqueue(4, 0);
            testQueue.Enqueue(5, 0);

            testQueue.Enqueue(1, 2);
            testQueue.Enqueue(2, 2);
            testQueue.Enqueue(3, 3);
            testQueue.Enqueue(4, 3);
            testQueue.Enqueue(5, 5);

            Console.WriteLine();
            Console.WriteLine("First test {0}", testQueue.First());  // 1
            Console.WriteLine("Last test {0}", testQueue.Last());    // 5

            Console.WriteLine("First test {0} с приоритетом {1}", testQueue.First(2), 2);  //1
            Console.WriteLine("Last test {0} с приоритетом {1}", testQueue.Last(3), 3);    // 4

            int p1 = 0;
            Console.WriteLine("число элементов с приоритетом {0} = {1}", p1, testQueue.GetCount(p1));  //5
            p1 = 2;
            Console.WriteLine("число элементов с приоритетом {0} = {1}", p1, testQueue.GetCount(p1));  //2
            p1 = 5;
            Console.WriteLine("число элементов с приоритетом {0} = {1}", p1, testQueue.GetCount(p1));  //1

            Console.ReadKey();
        }
예제 #19
0
        public static void Main(string[] args)
        {
            PriorityQueue<Student> payQueue = new PriorityQueue<Student>();

            for (int i = 0; i < 5; i++)
            {
                payQueue.Enqueue(new Student("Student" + i, 12, true));
            }

            for (int i = 5; i < 10; i++)
            {
                payQueue.Enqueue(new Student("Student" + i, 12, false));
            }

            for (int i = 0; i < 5; i++)
            {
                payQueue.Enqueue(new Student("StudentVer2" + i, 12, true));
            }

            int payQueueLength = payQueue.Count;

            for (int i = 0; i < payQueueLength; i++)
            {
                Console.WriteLine(payQueue.Dequeue().ToString());
            }
        }
예제 #20
0
        public async void OnTick(IWeiboAccessToken at)
        {
            if (_tick++%57 != 0)
                return;
            var resp = await WeiboClient.suggestions_statuses_hot_async(at.get(), 20, true, 1, _type);
            if(++_type == hot_status_type.count)
                _type = hot_status_type.musement;

            if (resp.Failed() || resp.Value.Length == 0)
                return;
            var queue = new PriorityQueue<long, Status>();
            foreach(var s in resp.Value)
            {
                queue.Enqueue(EvalMark(s),s);
            }
            while (queue.Size > 5)
                queue.Dequeue();
            while(!queue.IsEmpty)
            {
                var s = queue.Dequeue();
                var ws = new WeiboStatus();
                ws.assign_sina(s);
                await DispatcherHelper.UIDispatcher.BeginInvoke(DispatcherPriority.SystemIdle, (Action) (() =>
                {
                    if(statuses.Count > 10)
                        statuses.RemoveAt(0);
                    statuses.Add(ws);
                }));
            }
        }
예제 #21
0
        static void Main(string[] args)
        {
            PriorityQueue<int> queue = new PriorityQueue<int>();
            queue.Enqueue(5);
            queue.Enqueue(3);
            queue.Enqueue(16);
            queue.Enqueue(4);
            queue.Enqueue(8);
            queue.Enqueue(10);
            queue.Enqueue(20);
            queue.Enqueue(33);
            queue.Enqueue(6);
            queue.Enqueue(24);
            queue.Enqueue(68);
            queue.Enqueue(19);
            queue.Enqueue(61);
            queue.Enqueue(638);
            queue.Enqueue(213);
            queue.Enqueue(2132);

            int count = queue.Count;
            Console.WriteLine("Get elements from Priority queue one by one:");
            for (int i = 0; i < count; i++)
            {
                Console.WriteLine(queue.Dequeue());
            }
        }
예제 #22
0
 public void PriorityQueueEnqueueOneElementIncrementsCount()
 {
     var q = new PriorityQueue<int>();
     var count = q.Count;
     q.Enqueue(AnyInt);
     Assert.Equal(count + 1, q.Count);
 }
예제 #23
0
        public void CopyConstructorTest()
        {
            List<string> collection = new List<string> { "Granville", "Barnett", "Luca", "Del", "Tongo" };
            PriorityQueue<string> actual = new PriorityQueue<string>(collection);

            Assert.AreEqual(5, actual.Count);
        }
        public static void DijkstraAlgorithm(Dictionary<Node, List<Connection>> graph, Node source)
        {
            PriorityQueue<Node> queue = new PriorityQueue<Node>();
            foreach (var node in graph)
            {
                node.Key.DijkstraDistance = long.MaxValue;
            }

            source.DijkstraDistance = 0;
            queue.Enqueue(source);

            while (queue.Count != 0)
            {
                Node currentNode = queue.Dequeue();
                if (currentNode.DijkstraDistance == long.MaxValue)
                {
                    break;
                }

                foreach (var connection in graph[currentNode])
                {
                    var potDistance = currentNode.DijkstraDistance + connection.Distance;
                    if (potDistance < connection.ToNode.DijkstraDistance)
                    {
                        connection.ToNode.DijkstraDistance = potDistance;
                        queue.Enqueue(connection.ToNode);
                    }
                }
            }
        }
예제 #25
0
 public static int distance(bool[,] passable, int startX, int startY, int goalX, int goalY)
 {
     int[,] distanceMatrix = new int[passable.GetLength(0), passable.GetLength(1)];
     for (int i = 0; i < distanceMatrix.GetLength(0); i++)
     {
         for (int j = 0; j < distanceMatrix.GetLength(1); j++)
         {
             distanceMatrix[i, j] = -1;
         }
     }
     distanceMatrix[startX, startY] = 0;
     PriorityQueue<Node> openSet = new PriorityQueue<Node>();
     Node initial = new Node(startX, startY, 0, euclideanDistance(startX, startY, goalX, goalY));
     openSet.Add(initial);
     while (true)
     {
         if (openSet.IsEmpty())
         {
             // we failed to find the goal
             return -1;
         }
         Node current = openSet.PopFront();
         if (current.x == goalX && current.y == goalY)
         {
             // we found it!
             return current.costToGetHere;
         }
         // search all the neighbours
         List<Node> neighbours = current.generateNeighbours(passable, distanceMatrix, goalX, goalY);
         openSet.AddRange(neighbours);
     }
 }
예제 #26
0
        public void AddRemove()
        {
            PriorityQueue<string, int> pq = new PriorityQueue<string, int>(10);
            Assert.AreEqual<int>(10, pq.Capacity);
            Assert.AreEqual<int>(0, pq.Count);

            pq.Enqueue("A", 1);
            Assert.AreEqual<int>(1, pq.Count);
            Assert.AreEqual<string>("A", pq.Dequeue(false));

            pq.Enqueue("B", 2);
            Assert.AreEqual<int>(2, pq.Count);
            Assert.AreEqual<string>("B", pq.Dequeue(false));

            pq.Enqueue("C", 1);
            Assert.AreEqual<int>(3, pq.Count);
            Assert.AreEqual<string>("B", pq.Dequeue(false));

            Assert.AreEqual<string>("B", pq.Dequeue());
            Assert.AreEqual<string>("A", pq.Dequeue(true));
            Assert.AreEqual<string>("C", pq.Dequeue());

            Assert.AreEqual<int>(0, pq.Count);
            Assert.AreEqual<int>(10, pq.Capacity);

            pq.Enqueue("A", 1);
            pq.Enqueue("B", 2);
            pq.Enqueue("C", 3);

            pq.Clear();

            Assert.AreEqual<int>(0, pq.Count);
            Assert.AreEqual<int>(10, pq.Capacity);
        }
예제 #27
0
        public static void DijkstraAlgorithm(Dictionary<Node, List<Connection>> graph, Node source)
        {
            var queue = new PriorityQueue<Node>();

            foreach (var node in graph)
            {
                node.Key.DijkstraDistance = double.PositiveInfinity;
            }

            source.DijkstraDistance = 0.0d;
            queue.Enqueue(source);

            while (queue.Count != 0)
            {
                var currentNode = queue.Dequeue();

                if (double.IsPositiveInfinity(currentNode.DijkstraDistance))
                {
                    break;
                }

                foreach (var neighbor in graph[currentNode])
                {
                    var potDistance = currentNode.DijkstraDistance + neighbor.Distance;
                    if (potDistance < neighbor.Node.DijkstraDistance)
                    {
                        neighbor.Node.DijkstraDistance = potDistance;
                        queue.Enqueue(neighbor.Node);
                    }
                }
            }
        }
예제 #28
0
파일: AI.cs 프로젝트: TheProjecter/netbreak
        public int[] makeNextMove(Grid board)
        {
            PriorityQueue<MoveNode> q = new PriorityQueue<MoveNode>();
              	q.initialize(expandNodes(board, null, 1));
               	MoveNode current = q.Dequeue();

              	while ((current.Ply < depth) && !(q.isEmpty))
              	{
               		MoveNode next = q.Dequeue();
               	if(next.Rank> current.Rank)
               	{
                    current = next;
                    MoveNode[] expnd = expandNodes(current.Board, current, (current.Ply + 1));
                    if(expnd.Length > 0)
                        q.EnqueueArray(expnd);
                }
             	}

              	while(current.Ply > 1)
              	{
               		current = current.PreviousMove;
              	}
             	//this will be the best move to make after expanding down to depth plys.
              	int[] result = { current.Group.X, current.Group.Y };
              	Console.WriteLine("rank: " + current.Rank);

               	return result;
        }
예제 #29
0
파일: Core.cs 프로젝트: CONANLXF/AIO
        public static Path<Node> FindPath(
            Node start,
            Node destination,
            Func<Node, Node, double> distance,
            Func<Node, double> estimate)
        {
            var closed = new HashSet<Vector2>();
            var queue = new PriorityQueue<double, Path<Node>>();
            queue.Enqueue(0, new Path<Node>(start));

            while (!queue.IsEmpty)
            {
                var path = queue.Dequeue();
                if (closed.Contains(path.LastStep.Point))
                {
                    continue;
                }

                if (path.LastStep.Point.Equals(destination.Point))
                    return path;

                closed.Add(path.LastStep.Point);
                foreach (Node n in path.LastStep.Neightbours)
                {
                    double d = distance(path.LastStep, n);
                    var newPath = path.AddStep(n, d);
                    queue.Enqueue(newPath.TotalCost + estimate(n), newPath);
                }
            }

            return null;
        }
예제 #30
0
        static void Main(string[] args)
        {
            //var queue = new PriorityQueue<int>();
            //queue.Enqueue(99);
            //queue.Enqueue(2);
            //queue.Enqueue(10);
            //queue.Enqueue(25);
            //queue.Enqueue(11);
            //queue.Enqueue(3);
            //queue.Enqueue(7);
            //queue.Enqueue(22);
            //queue.Enqueue(5);
            //queue.Enqueue(1);
            //queue.Enqueue(45);
            //queue.Enqueue(31);

            var queue = new PriorityQueue<Student>();

            queue.Enqueue(new Student() { Name = "Ivan", Age = 27 });
            queue.Enqueue(new Student() { Name = "Pesho", Age = 21 });
            queue.Enqueue(new Student() { Name = "Dragan", Age = 24 });
            queue.Enqueue(new Student() { Name = "Gosho", Age = 18 });
            queue.Enqueue(new Student() { Name = "Todor", Age = 25 });

            while (queue.Count > 0)
            {
                Console.WriteLine(queue.Dequeue().ToString());
            }
        }