コード例 #1
0
        public void BellmanFordExecuteTest()
        {
            Func <IGraphEdge, Double> weightFunction = edge => Convert.ToDouble(edge["Weight"]);

            IDictionary <OperationParameter, Object> parameters = new Dictionary <OperationParameter, Object>();

            parameters[GraphOperationParameters.SourceVertex] = _sourceVertex;
            parameters[GraphOperationParameters.WeightMetric] = weightFunction;

            BellmanFordAlgorithm operation = new BellmanFordAlgorithm(_sourceGraph, parameters);

            operation.Execute();

            Assert.AreEqual(_resultGraph.VertexCount, operation.Result.VertexCount);
            Assert.AreEqual(_resultGraph.EdgeCount, operation.Result.EdgeCount);

            foreach (IGraphVertex resultVertex in operation.Result.Vertices)
            {
                IGraphVertex vertex = _resultGraph.GetVertex(resultVertex.Coordinate);

                Assert.IsNotNull(vertex);
                Assert.AreEqual(vertex["Distance"], resultVertex["Distance"]);

                Assert.IsTrue(operation.Result.OutEdges(resultVertex).All(edge => _resultGraph.GetAllEdges(edge.Source.Coordinate, edge.Target.Coordinate).Count == 1));
            }
        }
コード例 #2
0
        public void NegativeCircleGraph()
        {
            //Arrange
            var graph = CreateGraph3();

            //Act + Assert
            Assert.ThrowsException <ArgumentException>(() => BellmanFordAlgorithm.Compute(graph, true));
        }
コード例 #3
0
        public void NegativeWeightsGraph()
        {
            //Arrange
            var graph    = CreateGraph2();
            var expected = CreateShortestPaths2(graph);

            //Act
            var actual = BellmanFordAlgorithm.Compute(graph);

            //Assert
            AssertAlgoResult(graph, expected, actual);
        }
            public void Test03()
            {
                const int numberOfVerteces = 4;
                var       graph            =
                    new GraphBuilder(numberOfVertices: numberOfVerteces, isDirected: false)
                    .AddEdge(0, 1, 1)
                    .AddEdge(0, 2, 2)
                    .AddEdge(0, 3, 17)
                    .AddEdge(1, 2, 5)
                    .AddEdge(2, 3, 4)
                    .ToGraph();
                const int startingVertex = 2;

                var result = BellmanFordAlgorithm.ShortestPaths(new GraphWithTracking(graph), startingVertex);

                result.Count.Should().Be(numberOfVerteces);
                result.ShouldBeEquivalentTo(new[] { 2, 3, 0, 4 });
            }
            public void Test01()
            {
                var numberOfVerteces = 5;
                var graph            =
                    new GraphBuilder(numberOfVertices: numberOfVerteces, isDirected: true)
                    .AddEdge(3, 0, 7)
                    .AddEdge(3, 4, 6)
                    .AddEdge(2, 3, 2)
                    .AddEdge(0, 2, 9)
                    .AddEdge(0, 1, -3)
                    .AddEdge(4, 0, 8)
                    .AddEdge(2, 1, 7)
                    .AddEdge(1, 4, -2)
                    .AddEdge(4, 2, -4)
                    .ToGraph();
                var startingVertex = 3;

                var result = BellmanFordAlgorithm.ShortestPaths(new GraphWithTracking(graph), startingVertex);

                result.Count.Should().Be(numberOfVerteces);
                result.ShouldBeEquivalentTo(new[] { 7, 4, -2, 0, 2 });
            }
コード例 #6
0
        public void ExecuteTest()
        {
            IGraph <string, string> graph = new AdjacencyMapGraph <string, string>();
            IVertex <string>        A     = graph.addVertex("A");
            IVertex <string>        B     = graph.addVertex("B");
            IVertex <string>        C     = graph.addVertex("C");
            IVertex <string>        D     = graph.addVertex("D");
            IVertex <string>        E     = graph.addVertex("E");
            IVertex <string>        F     = graph.addVertex("F");
            IVertex <string>        G     = graph.addVertex("G");
            IVertex <string>        H     = graph.addVertex("H");
            IVertex <string>        I     = graph.addVertex("I");
            IVertex <string>        J     = graph.addVertex("J");
            IVertex <string>        K     = graph.addVertex("K");
            IVertex <string>        L     = graph.addVertex("L");
            IVertex <string>        M     = graph.addVertex("M");
            IVertex <string>        N     = graph.addVertex("N");

            graph.addEdge(A, B, "1", 3);
            graph.addEdge(C, B, "2", 3);
            graph.addEdge(A, E, "3", 2);
            graph.addEdge(A, I, "4", 5);
            graph.addEdge(I, E, "5", 3);
            graph.addEdge(E, D, "6", 4);
            graph.addEdge(D, C, "7", 2);
            graph.addEdge(C, G, "8", 5);
            graph.addEdge(D, F, "9", 3);
            graph.addEdge(F, G, "10", 3);
            graph.addEdge(G, H, "11", 4);
            graph.addEdge(H, F, "12", 2);
            graph.addEdge(E, M, "13", 1);
            graph.addEdge(E, J, "14", 5);
            graph.addEdge(M, N, "15", 5);
            graph.addEdge(M, J, "16", 2);
            graph.addEdge(M, F, "17", 3);
            graph.addEdge(M, K, "18", 2);
            graph.addEdge(J, K, "19", 3);
            graph.addEdge(K, L, "20", 1);

            BellmanFordAlgorithm <string, string> d = new BellmanFordAlgorithm <string, string>(graph);

            d.Execute(A);

            StringBuilder sb = new StringBuilder();

            foreach (IVertex <string> v in d.getPredecessors().Keys)
            {
                if (d.getPredecessors()[v] != null)
                {
                    sb.Append(v.ToString() + " from " + d.getPredecessors()[v].ToString() + Environment.NewLine);
                }
                else
                {
                    sb.Append(v.ToString() + " from <null> (start)" + Environment.NewLine);
                }
            }

            var tree = d.getSpanningForest()[0];
            var pos  = tree.PositionContaining(K);
            // MessageBox.Show(pos.ToString());
            List <IVertex <string> > path = new List <IVertex <string> >();

            foreach (var p in tree.PathToRoot(pos))
            {
                path.Add(p.Element());
            }
            // MessageBox.Show(path.Count.ToString());

            string res = "";

            foreach (var vert in path)
            {
                res += vert.ToString() + " -> ";
            }

            /*
             * MessageBox.Show(res.ToString());
             * MessageBox.Show(sb.ToString());
             * MessageBox.Show(d.getSpanningForest()[0].ToString());
             */
        }
コード例 #7
0
        private static void P5DijkstraBellman()
        {
            Console.WriteLine("-------------------------------");
            Console.WriteLine("Neuer Graph");
            var hFileName = GraphFileRessources.P4GraphWege1;
            var hGraph    = AdjacentListGraphImporter.ImportAdjacentList(hFileName, EdgeKind.DirectedWeighted);

            var hDijkstraAlgorithm = new Dijkstra(hGraph);

            hDijkstraAlgorithm.Execute(2, 0);

            var hBellmanFordAlgorithm = new BellmanFordAlgorithm(hGraph);

            hBellmanFordAlgorithm.Execute(2, 0);

            Console.WriteLine("-------------------------------");
            Console.WriteLine("Neuer Graph");
            Console.WriteLine("Gerichtet");
            hFileName = GraphFileRessources.P4GraphWege2;
            hGraph    = AdjacentListGraphImporter.ImportAdjacentList(hFileName, EdgeKind.DirectedWeighted);

            hDijkstraAlgorithm = new Dijkstra(hGraph);
            hDijkstraAlgorithm.Execute(2, 0);

            hBellmanFordAlgorithm = new BellmanFordAlgorithm(hGraph);
            hBellmanFordAlgorithm.Execute(2, 0);

            Console.WriteLine("-------------------------------");
            Console.WriteLine("Neuer Graph");
            Console.WriteLine("Gerichtet");
            hFileName = GraphFileRessources.P4GraphWege3;
            hGraph    = AdjacentListGraphImporter.ImportAdjacentList(hFileName, EdgeKind.DirectedWeighted);


            hDijkstraAlgorithm = new Dijkstra(hGraph);
            hDijkstraAlgorithm.Execute(2, 0);

            hBellmanFordAlgorithm = new BellmanFordAlgorithm(hGraph);
            hBellmanFordAlgorithm.Execute(2, 0);

            Console.WriteLine("-------------------------------");
            Console.WriteLine("Neuer Graph");
            Console.WriteLine("Gerichtet");
            hFileName = GraphFileRessources.P4GraphG12;
            hGraph    = AdjacentListGraphImporter.ImportAdjacentList(hFileName, EdgeKind.DirectedWeighted);

            hDijkstraAlgorithm = new Dijkstra(hGraph);
            hDijkstraAlgorithm.Execute(0, 1);

            hBellmanFordAlgorithm = new BellmanFordAlgorithm(hGraph);
            hBellmanFordAlgorithm.Execute(0, 1);


            Console.WriteLine("-------------------------------");
            Console.WriteLine("Neuer Graph");
            Console.WriteLine("Ungerichtet");
            hFileName = GraphFileRessources.P4GraphG12;
            hGraph    = AdjacentListGraphImporter.ImportAdjacentList(hFileName, EdgeKind.UndirectedWeighted);

            hDijkstraAlgorithm = new Dijkstra(hGraph);
            hDijkstraAlgorithm.Execute(0, 1);

            hBellmanFordAlgorithm = new BellmanFordAlgorithm(hGraph);
            hBellmanFordAlgorithm.Execute(0, 1);
        }
コード例 #8
0
        static void Main(string[] args)
        {
            BellmanFordAlgorithm bellmanFordAlgorithm = new BellmanFordAlgorithm();

            bellmanFordAlgorithm.StartAlgorithm();
        }