2012-10-24 2 views
5

시스템에 있음 정상적인 그래프와 같이 연결된 노드 목록이 있습니다. 우리는 전체 시스템과 모든 연결을 알고 있고 우리는 또한 출발점을 가지고 있습니다. 내 모든 가장자리에는 방향이 있습니다.연결된 노드 목록에서 그래프 그리기

이제이 모든 노드와 가장자리를 자동으로 그립니다. 문제는 실제 그림이 아니라 (x, y) 좌표를 계산하는 것입니다. 그래서 기본적으로이 전체 그래프를 그리기 원합니다. 이 문제에 대한

class node: 
string text 
List<edge> connections 

이 있어야합니다 몇 가지 잘 알려진 알고리즘 :

내 자료 구조는 같은 것입니까? 나는 아무 것도 찾을 수 없었지만 잘못된 키워드를 사용하고있을 수도 있습니다.

내 생각 :

한 가지 방법은 (0,0)에서 우리의은 StartNode를 배치 한 다음 "거리"인 어떤 일정을 가지고하는 것입니다. 그런 다음 각 이웃에 대해 y 위치에 거리를 추가하고 이웃 인 각 노드에 대해 x = distance * n을 설정합니다.

그러나 이것은 많은 문제를 실제로 일으킬 것입니다 - 그래서 그것은 갈 길이 멀지 않습니다.

답변

9

가장 일반적인 방법은 결정적 방법 대신 force-directed layout을 사용하는 것입니다. 요지는 모든 노드가 서로 반발하고 (반 중력) 노드가 연결된 모든 쌍이 서로 끌어 당기는 것입니다. 물리 시뮬레이션을 여러 번 반복하면 합리적인 레이아웃을 얻을 수 있습니다.

사용할 수있는 레이아웃 알고리즘이 많이 있으며 그 결과는 매우 다릅니다. GraphViz fdp (Fruchterman & Reingold '91) 및 neato (Kamada & Kawai '89) 알고리즘은 작동하지만 오히려 오래되었고 더 나은 대안이 있습니다. Fruchterman & Reingold '91 알고리즘은 파이썬에서 NetworkX으로 이용할 수 있습니다.

Prefuse은 매우 빠르고 좋은 ForceDirectedLayout Java class을 제공합니다. Hachul & Jünger '05은 FM^3 알고리즘을 상세히 설명합니다. 이는 실제로 잘 작동하는 것으로 보이며 (Hachul & Jünger '06) C++에서 Tulip으로 사용할 수 있습니다.

NodeXL (C 번호)와 같은 그래프를 시각화하기 위해 엑셀 2007/2010에 네트워크 분석을 통합하는 큰 입문 도구 다른 오픈 소스 도구의 톤이있다 (면책 조항 : 나는 그것을에 대한 고문 해요). 다른 훌륭한 도구는 Gephi (Java) 및 Cytoscape (Java)이며, Pajek, UCINet, yEdTom Sawyer은 독점적 인 대안입니다.

2

일반적으로 가장자리 라우팅을 처리하고보기가 좋게 보이기를 원하면 특히 까다로운 문제입니다. http://www.graphviz.org/을보고 명령 행 도구를 사용하거나 graphviz 라이브러리를 사용하여 레이아웃을 작성하고 애플리케이션 내에서 x, y 좌표를 얻을 수 있습니다.