2016-09-09 7 views
7

그래프 이론을 처음 사용했습니다.QuickGraph 그래프에서 연결된 구성 요소 얻기

QuickGraph library으로 인접 그래프를 만들었고 궁극적으로 그래프에서 연결된 구성 요소를 갖고 싶습니다. undirGraph.Edges에서

open QuickGraph 

let tup = [(1M,1M); (2M, 18M); (3M, 3M); (4M, 5M); (5M, 24M); (24M, 6M); (7M, 6M); (8M, 9M); (10M, 9M)] 

type Vertex = {decimal: decimal} 

let edges = 
    tup 
    |> List.map (fun x -> ({decimal = fst x}, {decimal = snd x})) 
    |> List.map (fun x -> Edge<Vertex> x) 

//Undirected Graph 
let undirGraph = edges.ToUndirectedGraph() 

undirGraph.Edges 
undirGraph.Vertices 

let x = QuickGraph.Algorithms.ConnectedComponents.ConnectedComponentsAlgorithm(undirGraph) 

출력은 :

val it : Collections.Generic.IEnumerable<Edge<Vertex>> = 
seq 
[FSI_0227+Vertex->FSI_0227+Vertex {Source = {decimal = 1M;}; 
             Target = {decimal = 1M;};}; 
FSI_0227+Vertex->FSI_0227+Vertex {Source = {decimal = 2M;}; 
            Target = {decimal = 18M;};}; 
FSI_0227+Vertex->FSI_0227+Vertex {Source = {decimal = 3M;}; 
            Target = {decimal = 3M;};}; 
FSI_0227+Vertex->FSI_0227+Vertex {Source = {decimal = 4M;}; 
            Target = {decimal = 5M;};}; ...] 

undirGraph.Vertices에서

:

val it : Collections.Generic.IEnumerable<Vertex> = 
seq 
[{decimal = 1M;}; {decimal = 2M;}; {decimal = 18M;}; {decimal = 3M;}; ...] 

예상대로.

무향 그래프가 성공적으로 생성되었지만 이제 막혔습니다. 여기에서 그래프의 연결된 구성 요소를 얻는 방법을 모르거나 솔직히 올바른 그래프 구조를 사용하고 있는지 알 수 없습니다.

내가 FSI에 x;;에서 그래프 만 출력의 구성 요소를 포함 할 x을 기대했을 것이다

은 다음과 같습니다

output from x in the FSI

tuple list가에 BillToShipTo 고객 ID 값을 나타내는 예제 값 데이터 베이스.

QuickGraph 라이브러리의 문서는 드문 드문, 특히 "바로 배우기"위해 노력합니다.

이 질문은 previous question I posted을 대신합니다. 나는 이전의 질문을 수정하는 것을 고려해 보았으나 이것은 완전히 별개의 질문이므로 그대로두기로 결정했다.

+0

다른 시도를 해보셨습니까? R의 igraph는 원하는 것을 할 수 있으며 RProvider를 통해 호출 할 수 있습니다. 실제로 그래프를 그리는 것이 더 쉽습니다. – s952163

+0

있습니다. 나는 그래프를 생성하고'R'의'iGraph' 패키지에서 연결된 구성 요소를 추출 할 수 있습니다. 꽤 쉽게'F # '을 사용하기를 원했습니다. 'F #'에서 할 수 있어야하며,'QuickGraph' 라이브러리가 이미 존재한다는 점을 감안할 때 상대적으로 간단해야합니다. 나는 해결책을 놓치고 있어야한다. – Steven

+0

아하. 몇 가지 간단한 데이터에 대한 스크린 샷과 예상 결과를 표시 할 수 있습니까? 그래프로 작업하는 대부분의 사람들이 .NET을 사용하지 않는다고 생각할 수 있습니다. Btw 위의 경우 그래프가 올바르게 생성되었는지 잘 모르겠습니다. 어쩌면 quickgraph에서 다른 네임 스페이스를 열어야 할 수도 있습니다. – s952163

답변

3

QuickGraph 라이브러리에는 F # 프로그래머에게 확실한 인터페이스가 없습니다 (C# 프로그래머가이 정보를 즉시 얻을 수 있음). 알고리즘을 실제로 실행하려면 Compute 메서드를 호출해야합니다.

나는 Compute에 샘플 코드와 방금 추가 전화를했다 : 이렇게되면

let x = QuickGraph.Algorithms.ConnectedComponents. 
      ConnectedComponentsAlgorithm(undirGraph) 
x.Compute() 

x.Components 당신이 정점의 그룹을 원한다면, 각 정점에 구성 요소의 인덱스를 지정 사전을 포함 (구성 요소를 나타내는)을 수행 할 수 있습니다 단지 그룹 Value에 의한 결과 (구성 요소 지수가) : 이것은 다음주는

x.Components 
|> Seq.groupBy (fun kv -> kv.Value) 
|> Seq.map (fun (comp, vertices) -> 
    comp, vertices |> Seq.map (fun kv -> kv.Key)) 

:

,
[ (0, [{decimal = 1M;}]); 
    (1, [{decimal = 2M;}; {decimal = 18M;}]); 
    (2, [{decimal = 3M;}]); 
    (3, [{decimal = 4M;}; {decimal = 5M;}; {decimal = 24M;}; 
     {decimal = 6M;}; {decimal = 7M;}]); 
    (4, [{decimal = 8M;}; {decimal = 9M;}; {decimal = 10M;}]) ] 
+0

니스! 고마워요! – s952163

+0

@ s952163 내가 받아 들인 대답을이 문장으로 바꾸면 너무 화가 나겠니? 이것은 정말로 원래의 질문에 대한 답입니다! – Steven

+1

@ 당연하지. 결국 Q! 그리고 그것이 현상금의 핵심이었습니다. 가능하다면 그렇게하십시오! ;-) 나 자신에게 그것을 제안하려고했다. – s952163

7

이 제품은 찾고 계신 것입니다.

Graph

나는 R에 코드를 전송하고이를 생성 한 후 필요한 경우 DLL에 그것을 포장하기 위해 RProvider을 사용하여 사용할 수 있습니다. 그런 다음 components, clusters, groups 등을 사용하여 연결을 추출 할 수 있습니다. 경우

# In R: 
g1 <- graph( edges=c("1","1", "2", "18", "3", "3", "4", "5", "5", "24", "24", "6", "7", "6", "8", "9", "10", "9"),n=9,directed=T) 
plot(g1) 
comp1 <- components(g1) 
comp1 
groups(comp1) 
cl <- clusters(g1) 
lapply(seq_along(cl$csize)[cl$csize > 1], function(x) 
    V(g1)$name[cl$membership %in% x]) 

당신은 아직도 당신이 형, 소수의 진수라고 한 멤버가 Vertex라는 레코드 타입을 정의하고 있기 때문에 당신이 FSI에서보고있는 것은, QuickGraph에 충실하기로 결정. 이것은 약간 비트 혼란, 그래서 처음에 나는 당신이 int에 충실 그냥 그래프를 다음과 같은 방법으로 생성 제안 : 당신은 또한 단지 데이터 구조와 같은 사전의 일종을 쓸 수

let tup = [(1,1); (2, 18); (3, 3); (4, 5); (5, 24); (24, 6); (7, 6); (8, 9); (10, 9)] 
let edges = 
    tup |> List.map (fun x -> SEdge<int>(fst x, snd x)) 
let graph = edges.ToAdjacencyGraph() 
let uniGraph = edges.ToUndirectedGraph() 

의 기록/수를 유지 참조.

+0

이 답변과는 별도로, 이것이 내가 끝낸 것입니다. 모든 것을 RProvider를 통해 'igraph'로 보냅니다. 나는 그것이 아이디어 해결책이라고 생각하지 않지만 지금은 효과가있다. 미래는'QuickGraph'와 그래프 이론에 더 많은 시간을 할애해야합니다. – Steven