-1

특정 꼭지점부터 시작하여 그 꼭지점을 기준으로 가장 긴 경로를 찾는 방법은 무엇입니까? 나는 모든 것을 탐색 해 왔고 DAG의 모든 가능한 경우에 대해 실제로 작동하는이 문제에 대한 해결책을 찾을 수 없습니다. NetworkX의 소스 코드가 선호되지만 일반 파이썬도 좋습니다. 진정으로 호기심이 궁금해서 적절한 작업 예제를 찾을 수없는 이유는 그것이 NP 유형 문제라는 것을 이해합니다. 그러나 나는 그것이 수행 된 가장 효율적인 방법을 알고 싶습니다.NetworkX 가장 좋은 방법은 오류없이 시작점에서 DAG의 가장 긴 경로를 찾는 것입니다.

+0

스택 오버플로에 오신 것을 환영합니다! 어떤 코드를 작성해달라고 요청하는 것 같습니다. 스택 오버플로는 질문 및 응답 사이트이며 코드 작성 서비스는 아닙니다. 효과적인 질문을 작성하는 법을 배우려면 [여기를보십시오] (http://stackoverflow.com/help/how-to-ask)를 참조하십시오. – JGreenwell

답변

0

먼저이 그래프가 연결되어 있는지 확인합니다. 그렇다면 가장 긴 경로는 모든 노드의 경로입니다. 그렇지 않은 경우이 꼭지점이 연결된 구성 요소에 포함되어 있음을 의미합니다. 그런 다음이 버텍스가있는 가장 큰 구성 요소를 찾으려면 connected_component_subgraphs을 사용합니다. 그 후 가장 긴 경로는이 가장 큰 구성 요소의 모든 노드에 걸친 경로입니다.

물론 경로에서 사이클을 허용하지 않는 경우에만 작동합니다.

import networkx as nx 
G = nx.DiGraph() 
G.add_edges_from([(0,1),(0,4),(4,5),(4,6),(5,6),(6,1),(0,2),(2,3),(1,2)]) 
for path in nx.all_simple_paths(G, source=0, target=3): 
    print(path) 

결과 :

[0, 1, 2, 3] 
[0, 2, 3] 
[0, 4, 5, 6, 1, 2, 3] 
[0, 4, 6, 1, 2, 3] 

세 번째는 당신이 좋아하는 것입니다.

+0

나는이 논리 뒤에있는 논리를 이해하지만이 문제를 해결하기 위해 오랜 시간을 노력했다. 정확한 소스 코드를 배울 필요가있다. – tohnotakaki

+0

매우 효율적이다. 그렇게하는 방법은 무자비한 길을 길가는 것이 내가하고 싶어하는 것이 아닙니다. 좀 더 효율적인 "무차별 대입"라인을 따라 소스 코드를 원합니다. 즉, 정점에서 시작하는 경로를 계산하는 것입니다. 정점이 다른 반복에서 발견되는 경우 곧 바로 현재 경로를 추가하여 끝낼 수 있습니다 이미 계산 된 경로로 – tohnotakaki

+0

NetworkX의 모든 그래프 검색 알고리즘은 무차별적인 힘이라고 생각합니다. 또한 왜'dfs_tree'가 당신의 필요를 충족시키지 못하는지 모르겠습니다. – mengg