c# - 最近使用过 QuickGraph 库的人可以帮助我解决从旧示例中发现的语法问题吗?

标签 c# quickgraph

我正在为一个学校项目研究 Quick Graph 库,希望不必使用图形的 C++/CLI 实现。现在,我只想运行一个在 QuickGraph 讨论板上找到的示例程序。

由于四个语法错误,我无法编译我找到的示例。我认为我可以自己解决其中两个错误,但第一个错误我无法理解为什么会发生前两个错误。

我正在尝试编译的代码,也可以在这里找到 Quick Graph Demo

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
//Error here "The best overloaded method match for 'QuickGraph.Algorithms.ShortestPath.DijkstraShortestPathAlgorithm<string,QuickGraph.Edge<string>>.DijkstraShortestPathAlgorithm(QuickGraph.IVertexListGraph<string,QuickGraph.Edge<string>>, System.Func<QuickGraph.Edge<string>,double>)' has some invalid arguments"

 DijkstraShortestPathAlgorithm<string, Edge<string>> dijkstra = new DijkstraShortestPathAlgorithm<string, Edge<string>>(graph, edgeCost);

// attach a distance observer to give us the shortest path distances
//Error here "'QuickGraph.Algorithms.Observers.VertexDistanceRecorderObserver<string,QuickGraph.Edge<string>>' does not contain a constructor that takes 0 arguments"

 VertexDistanceRecorderObserver<string, Edge<string>> distObserver = new VertexDistanceRecorderObserver<string, Edge<string>>();
 distObserver.Attach(dijkstra);

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

// Run the algorithm with A set to be the source
 dijkstra.Compute("A");

foreach (KeyValuePair<string, int> kvp in distObserver.Distances)
 Console.WriteLine("Distance from root to node {0} is {1}", kvp.Key, kvp.Value);

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 );

// Remember to detach the observers
 distObserver.Detach(dijkstra);
 predecessorObserver.Detach(dijkstra);

我假设该示例在过去的某个时候有效,但在库可能发生的任何更新期间,某些语法发生了变化。给我错误的两行是代码的原始创建者在边缘成本声明下方实例化 DijkstraShortestPathAlgorithm 和 VertexDistanceRecorderObserver 时的行。 我希望有人最近使用过这个库来帮助我理解这些答案,或者如果可能的话引导我找到一些最新的快速图表示例。提前致以诚挚的谢意。

最佳答案

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)
{
    {a_b, 4},
    {a_d, 1},
    {b_a, 74},
    {b_c, 2},
    {b_e, 12},
    {c_b, 12},
    {c_f, 74},
    {c_j, 12},
    {d_e, 32},
    {d_g, 22},
    {e_d, 66},
    {e_f, 76},
    {e_h, 33},
    {f_i, 11},
    {f_j, 21},
    {g_d, 12},
    {g_h, 10},
    {h_g, 2},
    {h_i, 72},
    {i_f, 31},
    {i_h, 18},
    {i_j, 7},
    {j_f, 8}
};

Func<Edge<string>, double> getWeight = edge => edgeCost[edge];

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

//// attach a distance observer to give us the shortest path distances
VertexDistanceRecorderObserver<string, Edge<string>> distObserver = new VertexDistanceRecorderObserver<string, Edge<string>>(getWeight);

using (distObserver.Attach(dijkstra))
{

    //// Attach a Vertex Predecessor Recorder Observer to give us the paths
    VertexPredecessorRecorderObserver<string, Edge<string>> predecessorObserver = new VertexPredecessorRecorderObserver<string, Edge<string>>();
    using (predecessorObserver.Attach(dijkstra))
    {
        //// Run the algorithm with A set to be the source
        dijkstra.Compute("A");

        foreach (KeyValuePair<string, double> kvp in distObserver.Distances)
            Console.WriteLine("Distance from root to node {0} is {1}", kvp.Key, kvp.Value);

        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);

    }
}

关于c# - 最近使用过 QuickGraph 库的人可以帮助我解决从旧示例中发现的语法问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16692446/

相关文章:

c# - QuickGraph 3.6 中的 .NET 二进制序列化

c# - 反射:Property-GetValue by Class-Type(因此没有实例化的对象)

c# - 在 ASP.NET Core 3.1 中上传和下载大文件?

c# - EF LINQ 空间查询在 SQL Server 中使用 Contains() 方法超时

c# - 如何将 QuickGraph 中的自定义 BidirectionalGraph 应用到 Graph# 中的 GraphLayout?

QuickGraph - 如何将边与类相关联? (即就像你可以使用顶点一样)

asp.net-mvc - 图和 ASP.Net MVC

c# - .Net MVC - 从 View 中访问数据库不仅仅是不好的做法?

c# - 如何在WPF应用程序上修复 “The calling thread cannot access this object because a different thread owns it.”

c# - 如何使用 QuickGraph 查找两个顶点之间的所有路径