エッジがユーザーを自分の興味と結び付ける無向二部グラフを構築したいと考えています。グラフはこのモックアップのようなもので、ユーザーは緑色の円で、関心は赤色の円で表されます。
2 人のユーザーの類似点を見つけるために、最初のユーザーと 2 番目のユーザーの間で考えられるすべてのパスを見つけようとします。たとえば、ユーザー 0 とユーザー 4 (0 --> 6 --> 2 --> 8 --> 4 と 0 --> 5 --> 1 --> 7 --> 3 の間には 2 つの可能なパスがあります。 --> 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 回印刷されるはずです。
また、この回答に記載されているソリューションを実装しようとしました。ただし、これは 1 つの可能なパスを出力します。では、 QuickGraphを使用して 2 つの頂点間のすべての可能なパスを出力するにはどうすればよいでしょうか?