public void CreateGraph()
        {
            graph = new AdjacencyGraph <string, Edge <string> >(true);

            // Add some vertices to the graph
            graph.AddVertex("A");
            graph.AddVertex("B");

            graph.AddVertex("D");
            graph.AddVertex("C");
            graph.AddVertex("E");

            // Create the edges
            var a_b = new Edge <string>("A", "B");
            var a_c = new Edge <string>("A", "C");
            var b_e = new Edge <string>("B", "E");
            var c_d = new Edge <string>("C", "D");
            var d_e = new Edge <string>("D", "E");

            // Add edges to the graph
            graph.AddEdge(a_b);
            graph.AddEdge(a_c);
            graph.AddEdge(c_d);
            graph.AddEdge(d_e);
            graph.AddEdge(b_e);

            // Define some weights to the edges
            var weight = new Dictionary <Edge <string>, double>(graph.EdgeCount);

            weight.Add(a_b, 30);
            weight.Add(a_c, 30);
            weight.Add(b_e, 60);
            weight.Add(c_d, 40);
            weight.Add(d_e, 4);

            algo = new DijkstraShortestPathAlgorithm <string, Edge <string> >(graph, weight);

            // Attach a Vertex Predecessor Recorder Observer to give us the paths
            predecessorObserver = new VertexPredecessorRecorderObserver <string, Edge <string> >();

            using (ObserverScope.Create <IVertexPredecessorRecorderAlgorithm <string, Edge <string> > >(algo, predecessorObserver))
            {
                // Run the algorithm with A set to be the source
                algo.Compute("A");
            }

            path = new List <string>();
            PopulatePath("E");

            Assert.IsTrue(algo.Distances["E"] == 74);
            path.Reverse();

            Console.WriteLine(String.Join(" -> ", path.ToArray()));
        }
Пример #2
0
        public void Scenario()
        {
            AdjacencyGraph <string, Edge <string> > graph = new AdjacencyGraph <string, Edge <string> >(true);

            // Add some vertices to the graph
            graph.AddVertex("A");
            graph.AddVertex("B");
            graph.AddVertex("C");
            graph.AddVertex("D");
            graph.AddVertex("E");
            graph.AddVertex("F");
            graph.AddVertex("G");
            graph.AddVertex("H");
            graph.AddVertex("I");
            graph.AddVertex("J");

            // Create the edges
            Edge <string> a_b = new Edge <string>("A", "B");
            Edge <string> a_d = new Edge <string>("A", "D");
            Edge <string> b_a = new Edge <string>("B", "A");
            Edge <string> b_c = new Edge <string>("B", "C");
            Edge <string> b_e = new Edge <string>("B", "E");
            Edge <string> c_b = new Edge <string>("C", "B");
            Edge <string> c_f = new Edge <string>("C", "F");
            Edge <string> c_j = new Edge <string>("C", "J");
            Edge <string> d_e = new Edge <string>("D", "E");
            Edge <string> d_g = new Edge <string>("D", "G");
            Edge <string> e_d = new Edge <string>("E", "D");
            Edge <string> e_f = new Edge <string>("E", "F");
            Edge <string> e_h = new Edge <string>("E", "H");
            Edge <string> f_i = new Edge <string>("F", "I");
            Edge <string> f_j = new Edge <string>("F", "J");
            Edge <string> g_d = new Edge <string>("G", "D");
            Edge <string> g_h = new Edge <string>("G", "H");
            Edge <string> h_g = new Edge <string>("H", "G");
            Edge <string> h_i = new Edge <string>("H", "I");
            Edge <string> i_f = new Edge <string>("I", "F");
            Edge <string> i_j = new Edge <string>("I", "J");
            Edge <string> i_h = new Edge <string>("I", "H");
            Edge <string> j_f = new Edge <string>("J", "F");

            // Add the edges
            graph.AddEdge(a_b);
            graph.AddEdge(a_d);
            graph.AddEdge(b_a);
            graph.AddEdge(b_c);
            graph.AddEdge(b_e);
            graph.AddEdge(c_b);
            graph.AddEdge(c_f);
            graph.AddEdge(c_j);
            graph.AddEdge(d_e);
            graph.AddEdge(d_g);
            graph.AddEdge(e_d);
            graph.AddEdge(e_f);
            graph.AddEdge(e_h);
            graph.AddEdge(f_i);
            graph.AddEdge(f_j);
            graph.AddEdge(g_d);
            graph.AddEdge(g_h);
            graph.AddEdge(h_g);
            graph.AddEdge(h_i);
            graph.AddEdge(i_f);
            graph.AddEdge(i_h);
            graph.AddEdge(i_j);
            graph.AddEdge(j_f);

            // Define some weights to the edges
            Dictionary <Edge <string>, double> edgeCost = new Dictionary <Edge <string>, double>(graph.EdgeCount);

            edgeCost.Add(a_b, 4);
            edgeCost.Add(a_d, 1);
            edgeCost.Add(b_a, 74);
            edgeCost.Add(b_c, 2);
            edgeCost.Add(b_e, 12);
            edgeCost.Add(c_b, 12);
            edgeCost.Add(c_f, 74);
            edgeCost.Add(c_j, 12);
            edgeCost.Add(d_e, 32);
            edgeCost.Add(d_g, 22);
            edgeCost.Add(e_d, 66);
            edgeCost.Add(e_f, 76);
            edgeCost.Add(e_h, 33);
            edgeCost.Add(f_i, 11);
            edgeCost.Add(f_j, 21);
            edgeCost.Add(g_d, 12);
            edgeCost.Add(g_h, 10);
            edgeCost.Add(h_g, 2);
            edgeCost.Add(h_i, 72);
            edgeCost.Add(i_f, 31);
            edgeCost.Add(i_h, 18);
            edgeCost.Add(i_j, 7);
            edgeCost.Add(j_f, 8);

            // We want to use Dijkstra on this graph
            DijkstraShortestPathAlgorithm <string, Edge <string> > dijkstra = new DijkstraShortestPathAlgorithm <string, Edge <string> >(graph, edgeCost);

            // Attach a Vertex Predecessor Recorder Observer to give us the paths
            VertexPredecessorRecorderObserver <string, Edge <string> > predecessorObserver = new VertexPredecessorRecorderObserver <string, Edge <string> >();

            using (ObserverScope.Create <IVertexPredecessorRecorderAlgorithm <string, Edge <string> > >(dijkstra, predecessorObserver)) {
                // Run the algorithm with A set to be the source
                dijkstra.Compute("A");
            }

            foreach (KeyValuePair <string, Edge <string> > kvp in predecessorObserver.VertexPredecessors)
            {
                Console.WriteLine("If you want to get to {0} you have to enter through the in edge {1}", kvp.Key, kvp.Value);
            }

            foreach (string v in graph.Vertices)
            {
                double distance = AlgoUtility.ComputePredecessorCost(
                    predecessorObserver.VertexPredecessors,
                    edgeCost,
                    v);
                Console.WriteLine("A -> {0}: {1}", v, distance);
            }
        }