创建一个无向图并使用QuickGraph中的BFS遍历它

时间:2010-02-27 17:24:14

标签: c# quickgraph

我正在试图弄清楚如何使用QuickGraph for C#创建一个无向加权图的新实例。我的目标是创建一个无向加权图,其中填充了随机数量的节点和随机生成的开始和结束节点,其最短路径可以使用广度优先搜索算法找到。文档并不多,所以如果有人能提供任何可以理解的帮助。

3 个答案:

答案 0 :(得分:2)

理查德,QuickGraph不会为您做任何此类操作,它只会使您可以订阅的活动可用。通过订阅这些活动,您可以做出相应的回应。在深度优先搜索中缺少QuickGraph文档(是的,我意识到你正在做BFS而不是DFS,但是如何订阅事件的概念是相同的):

  1. 在开始计算之前在每个顶点上调用的InitializeVertex
  2. 在第一次遇到顶点时调用的DiscoverVertex
  3. ExamineEdge,在每个顶点被发现后在每个顶点上调用,
  4. TreeEdge,当它成为构成搜索树的边缘的成员时,在每个边缘上调用。
  5. FinishVertex,在其所有外边缘已添加到搜索树并且已发现所有相邻顶点之后(但在检查其外边缘之前)在顶点上调用。
  6. 顺便说一句,打开Reflector并查看QuickGraph.Algorithms.Observers。使用与BFS不同的方法,您的最短路径要求会更容易。

答案 1 :(得分:1)

此算法尚无文档;但是还有下一个最好的东西(或者甚至是更好的东西):单元测试!

如果您下载QuickGraph源代码并找到BreadthFirstAlgorithmSearchTest.BreadthFirstSearchAll(),您将看到算法的示例用法,该算法在测试项目中的所有有向图上运行BFS。

答案 2 :(得分:0)

Github上有一个简短的主题,其中有一个有用的基本示例,说明了如何设置BFS并从中获得一些结果。

特定于您的应用程序的其他详细信息(创建随机图等)显然不属于本示例。

来源: https://github.com/YaccConstructor/QuickGraph/issues/189#issuecomment-487493207

这是一个完整的例子:

UndirectedGraph<string, Edge<string>> g = new UndirectedGraph<string, Edge<string>>();

g.AddVerticesAndEdge(new Edge<string>("0", "1"));
g.AddVerticesAndEdge(new Edge<string>("0", "2"));
g.AddVerticesAndEdge(new Edge<string>("2", "3"));

var algo = new UndirectedBreadthFirstSearchAlgorithm<string, Edge<string>>(g);

var observer = new UndirectedVertexPredecessorRecorderObserver<string, Edge<string>>();

var rootVertex = "0";
using (observer.Attach(algo))
{
    algo.Compute(rootVertex);
}

var targetVertex = "3";
bool foundPath = observer.TryGetPath(targetVertex, out IEnumerable<Edge<string>> path);

路径将包含两个边缘:

[0]: "0"->"2"
[1]: "2"->"3"