2016-05-17 11 views
1

私はエッジがユーザと彼/彼女の関心事を結ぶところで、無向2部グラフを作成したいと思う。グラフは、ユーザーが緑色の円と関心のある赤い円で表されるこのような模擬のように見えます。クイックグラフ内の2つの頂点間のすべての可能なパスを見つける

Interest graph

二人のユーザ間の類似性を見つけるために、私は、第1ユーザと第2ユーザとの間のすべての可能な経路を見つけることを試みます。例えば、ユーザ0とユーザ4との間に2つの可能な経路が存在する(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); 
    } 
} 

上記のコードは1回だけ印刷されますが、2回のパスと同じように2回印刷する必要があります。

私はまたthis回答で与えられた解決策を実装しようとしました。しかし、これは1つの可能なパスを出力します。では、どのようにしてQuickGraphを使用して、2つの頂点間のすべての可能なパスを印刷できますか?

答えて

1

実際には、ユーザー数と選択肢が増えると、パスの数が急激に増加することがあります。 100人のユーザーとアイテムについて、すべてのユーザーがほとんどのアイテムを好む場合は、可能なパスの数がint64のmaxvalueを超える可能性があります。

+0

うーん。私はこのプロジェクトを、同様のアイテムに基づいてユーザに推薦するリコメンダを構築する一環として行っていました。私はグラフを使用して実装して視覚化するのが簡単だと考えていました。しかし、正しいです、それは非常に多くのパスにつながる可能性があります。何か提案はありますか? – avidProgrammer

+0

1つの方法は、制限された長さのパスに集中することです。たとえば、長さがkよりも小さいO(n^k)パスを超えないようにします。 n = 100およびk = 3の場合、これは100万パスであり、場合によっては許容される。 2人のユーザーの類似度を調べるには、共通のお気に入りアイテムのサイズ、または(共通アイテムの数)/(User1 + User2のアイテム)の数を数えます。これは簡単です。 EDIT:このO(n^k)について心配しないでください。あなたは、n <10^6、k <10のように、より良い方法である時間O(nk)の動的計画法を使って簡単にこれを数えることができます。 SHORT接続をより重要なものとして扱いたいと思うかもしれません。 –

+0

このコンテキストで動的プログラミングを使用することはどういう意味ですか? – avidProgrammer

関連する問題