【问题标题】:Finding all possible paths between two vertices in quickgraph在快速图中查找两个顶点之间的所有可能路径
【发布时间】:2016-05-17 08:49:26
【问题描述】:

我想构建一个无向二分图,其中一条边将用户与他/她的兴趣联系起来。该图类似于这个模型,其中用户由绿色圆圈表示,兴趣由红色圆圈表示。

为了找到两个用户之间的相似性,我尝试找到第一个用户和第二个用户之间的所有可能路径。例如,用户 0 和用户 4 之间有两种可能的路径(0 --> 6 --> 2 --> 8 --> 4 和 0 --> 5 --> 1 --> 7 --> 3 --> 8 --> 4)。这是我迄今为止尝试过的:

private int v = 4;
public static void Main()
{
    var graph = new UndirectedGraph<int, SEdge<int>>();
    List<int> vertices = new List<int>();
    for (int i = 0; i < 11; i++)
    {
        vertices.Add(i);
    }

    graph.AddVertexRange(vertices);
    //Edges incident to 0
    graph.AddEdge(new SEdge<int>(vertices[0], vertices[5]));
    graph.AddEdge(new SEdge<int>(vertices[0], vertices[6]));  
    //Edges incident to 1
    graph.AddEdge(new SEdge<int>(vertices[1], vertices[5]));
    graph.AddEdge(new SEdge<int>(vertices[1], vertices[6]));
    //Edges incident to 2
    graph.AddEdge(new SEdge<int>(vertices[2], vertices[6]));
    graph.AddEdge(new SEdge<int>(vertices[2], vertices[8]));
    //Edges incident to 3
    graph.AddEdge(new SEdge<int>(vertices[3], vertices[7]));
    graph.AddEdge(new SEdge<int>(vertices[3], vertices[8]));
    //Edges incident to 4
    graph.AddEdge(new SEdge<int>(vertices[4], vertices[8]));

    Func<SEdge<int>, double> edgeWeights = se => 1.0;
    //Vertex distance observer
    var observer = new UndirectedVertexPredecessorRecorderObserver<int, SEdge<int>>();

    //DFS Algortihm
    var dfs = new UndirectedDepthFirstSearchAlgorithm<int, SEdge<int>>(graph);
//    dfs.FinishVertex += VertexFinished;
//    dfs.ForwardOrCrossEdge += TransverseEdge;
    dfs.TreeEdge += TransverseEdge;
    dfs.Compute(0);        
}

public void TransverseEdge(object sender, EdgeEventArgs<int, SEdge<int>> ed){
    if(ed.Edge.Source == v){
        Console.WriteLine("Visited {0}", ed.Edge.Source);
    }
}

上面的代码只打印了一次,但应该打印两次,因为有两条路径。

我还尝试实现this 答案中给出的解决方案。但是,这会打印出一种可能的路径。那么,如何使用QuickGraph 打印两个顶点之间的所有可能路径?

【问题讨论】:

    标签: c# graph graph-theory quickgraph


    【解决方案1】:

    实际上,当用户数量和选择增加时,路径的数量可能会呈指数增长。对于 100 个用户和项目,如果所有用户都喜欢大多数项目,那么可能的路径数很可能会超过 int64 的最大值。

    【讨论】:

    • 嗯..谢谢你提出这个问题。我正在做这个项目,作为构建推荐器的一部分,该推荐器根据用户的相似项目推荐用户。我正在考虑使用图表,因为它们易于实现和可视化。但是,您是对的,这可能会导致大量路径。你有什么建议吗?
    • 一种方法是关注有限长度的路径 - 例如,长度低于 k 的路径不超过 O(n^k) 个。对于 n=100 和 k=3,这是一百万条路径,在某些情况下是可以接受的。要找到 2 个用户的相似度,您可以计算他们共同喜欢的项目的大小,或者可能是(共同项目数)/(用户 1 的项目 + 用户 2 的项目);这个很简单。编辑:不要担心这个 O(n^k)。您可以使用时间 O(nk) 中的动态编程轻松计算这一点,这对于 n
    • 在这种情况下使用动态编程是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2012-03-21
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多