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


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.