2010-02-02 3 views
3

RGL을 사용하여 Ruby에서 방향 그래프를 구현했습니다. 주어진 노드에서 들어오는 연결과 나가는 연결이있는 노드 만 찾는 방법을 찾는 데 어려움이 있습니다 . 아마도 나는 간단한 것을 놓치고 있습니다.Ruby에서 RGL을 사용하는 방향성 그래프로 작업하기

+1

RGL은 자체 태그로 생각합니다. 그래서 나는 당신을 위해 하나를 만들었습니다. – Earlz

답변

0

Directed Edges가있는 것 같습니다 :


[RW] 소스
[RW] 대상

가 도움이됩니까 속성? 나는 당신의 질문을 이해할 수 있을지 잘 모르겠습니다.

3

방금이 문제가 발생했습니다.

require 'rgl/adjacency' 
require 'rgl/bidirectional' 

class RGL::DirectedAdjacencyGraph 
    def in_degree(v) 
    rdg = self.reverse 
    rdg.adjacent_vertices(v).size 
    end 

    def out_degree(v) 
    self.adjacent_vertices(v).size 
    end 
end 

dg=RGL::DirectedAdjacencyGraph[1,2 ,2,3 ,2,4, 4,5, 6,4, 1,6] 

p dg.in_degree(2) 
#=> 2 
p dg.out_degree(2) 
#=> 1 

p dg.in_degree(1) 
#=> 0 
p dg.out_degree(3) 
#=> 0 

더 이상 대답은 아직 구현 될 것으로 보이지 않는다는 것입니다 : 그것은 가장 우아한 방법이 될하지 않을 수도 있지만, 일 수있는 reverse method 사용.

작동 방식은 RGL :: Bidirectional 모듈을 유향 그래프 클래스와 함께 포함하면 모든 중요한 each_in_neighbor 메서드를 제공합니다. 따라서이 같은 작업을해야합니다 (그러나하지 않습니다) :이 것이 얼마나 많은 일을 볼 수있는 코드로 파고하지 않은

require 'rgl/adjacency' 
require 'rgl/bidirectional' 

class RGL::DirectedAdjacencyGraph 
    include RGL::BidirectionalGraph 
end 

dg=RGL::DirectedAdjacencyGraph[1,2 ,2,3 ,2,4, 4,5, 6,4, 1,6] 

dg.vertices 
#=> [5, 6, 1, 2, 3, 4] 

p dg.adjacent_vertices(2) 
#=> [3, 4] 

p dg.each_in_neighbor(2) 
#=> NotImplementedError :(
#=> Should be: [1] 

,하지만 사용자의 필요에 따라 더 좋은 옵션이 될 수 있습니다.

편집 : 소스 노드와 대상 속성에 하위 노드가 액세스 할 수 없다는 점을 잊어 버렸습니다. 그러나 대체 접근법은 그래프에서 관심있는 모든 모서리를 모으고 이들 중 어느 것이 관심 대상 노드를 목표로하는지 확인하기 위해 비교할 수 있습니다.

2

RGL :: DirectedAdjacencyGraph은 나가는 연결을 효율적으로 구현합니다. 들어오는 가장자리에 효율적으로 액세스하려는 경우 에 정의 된 개념을 효율적으로 구현해야합니다. RGL :: BidirectionalGraph 특정 지향 그래프 구현에서 RGL :: BidirectionalGraph # each_in_neighbor 메소드를 구현해야합니다.

외부 정점에 대해 DirectedAdjacencyGraph과 같은 목록에도 각 정점에 대한 이웃을 저장한다고 가정합니다. 그런 방법이 맘에 수 :

# Iterator providing access to the in-edges (for directed graphs) or incident 
# edges (for undirected graphs) of vertex _v_. For both directed and 
# undirected graphs, the target of an out-edge is required to be vertex _v_ 
# and the source is required to be a vertex that is adjacent to _v_. 
def each_in_neighbor (v, &block) 
    in_neighbors = (@vertice_dict_for_in_neighbors[v] or 
        raise NoVertexError, "No vertex #{v}.") 
    in_neighbors.each(&block) 
end 

삽입하거나 가장자리와 정점을 제거 할 때 두 정점 사전을 관리하기 위해 당신이이 방법을 사용.

관련 문제