네트워크에서 가장 짧은 경로를 찾는 최적의 알고리즘이 있습니까?


13

나는 많은 선형 네트워크를 가지고 있으며 네트워크를 따라 서로 가장 멀리 떨어져있는 각 네트워크의 두 끝을 찾고 싶습니다 (아래 이미지에서 D에서 K까지). 이 문제의 가장 강력한 해결책은 각 원점 쌍에 대해 네트워크를 따라 가장 짧은 경로를 계산하는 것이지만 수천 개의 끝을 가진 수백 개의 네트워크가 있으므로 가능한 각 경로를 계산하는 것은 상당히 무겁습니다.

무차별 힘을 사용하지 않고 이것을 계산하는 최적의 방법이 있습니까? 영리한 규칙에 따라 일부 포인트를 제외 할 수 있습니까?

효율적으로 빨간색 경로를 찾는 방법은 무엇입니까?

편집 : 내 질문을 명확히하기 위해 @Alex Tereshenkov가 언급 한 가장 긴 경로의 그림을 추가했습니다. 검은 색 경로는 가장 긴 경로 알고리즘 (정점을 반복하지 않는 가장 긴 경로)의 결과입니다. 제 경우에는 어떤 글자로든 네트워크에 들어가서 가능한 한 빨리 다른 글자로 운전해야한다고 상상해보십시오. 가입하기 가장 어려운 두 글자는 무엇입니까? 여기에 이미지 설명을 입력하십시오


미친 페인트 스킬즈!
Adam

답변:


6

네트워크 의 그래프 지름 을 찾고 있다고 생각합니다 . 이 주제를 언급하는 stackexchange에 대한 몇 가지 질문이 있습니다.

대부분의 알고리즘은 "모든 쌍의 최단 경로"를 먼저 계산하고 그 중 가장 긴 것을 선택하도록 제안 하지만 Koushik Narayanan 의 블로그 게시물에서 더 최적의 대안을 제안합니다 (확인하지 않았습니다). 각 정점을 반복하고 가장 먼 쌍을 찾습니다.

V1과 버텍스 중 하나 사이의 최단 경로이고 다른 버텍스 사이의 최단 경로보다 길도록 버텍스 V1의 경로를 계산할 수 있습니다. 알고리즘 은 이 게시물 을 참조하십시오 . 그런 다음 모든 정점을 반복하고 모든 정점이 루트 인 가장 긴 경로를 찾을 수 있습니다. 가장 긴 최단 경로 목록이 있으면 최대 값을 가진 경로를 찾아 반환 할 수 있습니다.


덕분에 그래프 직경은 내가 찾던 것과 정확히 같았습니다. 방금 새로운 단어를 배웠습니다!
radouxju

7

Wikipedia 페이지 최장 경로 문제에 따르면이 문제는

... NP-hard이므로 P = NP가 아닌 한 임의의 그래프에 대해 다항식 시간으로 해결할 수 없습니다 . 더 강한 경도 결과는 또한 근사하기 어렵다는 것으로 알려져있다. 그러나 방향성 비순환 그래프를위한 선형 시간 솔루션 이 있으며, 이는 문제 스케줄링에서 중요한 경로를 찾는 데 중요한 애플리케이션을 가지고 있습니다.

당신이 작업 (또는 그래프 표시 할 수있는 경우 DAG를 ) 다음 networkx파이썬 패키지는 당신이 그것을 계산하게됩니다. 기능을 찾으십시오 dag_longest_path.

내가 빠진 것이 아니라면 그래프 노드 사이의 길이를 계산하고 불행히도 선형 시간 에서만 작동하는 정렬해야 합니다. 이에 는 효율적인 알고리즘 이 없습니다 .


정보 때문에 이미 + 1 답변에 대한 thnks. 그러나 네트워크에서 가장 긴 경로 중 가장 긴 경로를 찾고 있습니다 (예에서는 B 또는 H로 우회하지 않음). 따라서 "브 루트 포스"가 아마도 유일한 해결책이라고 암시하더라도 귀하의 솔루션은 내가 찾고있는 것이 아닙니다.
radouxju

@ radouxju, 아 알 겠어. 유전자 가 이것을 알아 차릴 수 있는지 보자. 그래프에 대한 많은 경험이 있고, 아마도 밝은 아이디어가 있을지도 모른다.
Alex Tereshenkov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.