Esempio n. 1
0
        /// <summary>
        /// Computes total wieghts from start node for all nodes in graph
        /// </summary>
        public Dijkstra Compute(DijkstraGraph graph)
        {
            while (graph.HasUnvisited())
            {
                var current = graph.NearestUnvisited();
                foreach (var node in graph.Linked(current))
                {
                    var weightFromCurrent = current.TotalWeigth + current.LinkWeight(node);

                    // if this way shorter
                    if (!node.TotalWeigth.HasValue || weightFromCurrent < node.TotalWeigth)
                    {
                        node.TotalWeigth = weightFromCurrent;
                        node.Previous = current;
                    }
                }

                current.IsVisited = true;
            }

            return this;
        }
        public void NearestUnvisited_ReturnsFirstUnvisitedWithMinimalMark_Test()
        {
            // Arrange
            var node1 = Mock.Of<DijkstraNode>(t => t.IsVisited == false && t.TotalWeigth == 3);
            var node2 = Mock.Of<DijkstraNode>(t => t.IsVisited == false && t.TotalWeigth == 3);
            var node3 = Mock.Of<DijkstraNode>(t => t.IsVisited == false && t.TotalWeigth == 10);
            var node4 = Mock.Of<DijkstraNode>(t => t.IsVisited == true && t.TotalWeigth == 1);
            var graph = new DijkstraGraph()
            {
                Nodes = new[]
                {
                    node1, node2, node3, node4
                }
            };

            // Act
            var nearest = graph.NearestUnvisited();

            // Assert
            Assert.AreEqual(nearest, node1);
        }
        public void NearestVisited_ThrowsIfHasNotUnvisited_Test()
        {
            // Arrange
            var graph = new DijkstraGraph()
            {
                Nodes = new[]
                {
                    Mock.Of<DijkstraNode>(t => t.IsVisited),
                    Mock.Of<DijkstraNode>(t => t.IsVisited == false && t.TotalWeigth == null)
                }
            };

            // Assert
            Assert.Throws<GraphHasNotUnvisitedNodesException>(() => graph.NearestUnvisited());
        }