Table of Contents
모든 피어스 숏스트 경로 문제 이해
APSP는 모든 경로를 가장 짧은 경로(APSP) 문제를 통해 무게를 띠는 그래프에서 가장 짧은 거리를 추구합니다. 네트워크 설계, 트래픽 흐름 최적화, 소셜 네트워크 분석 및 물류에 대한 직접적인 의미를 가진 그래프 이론에 대한 기본적인 도전입니다. 단일 리소스 간략한 경로 문제와 달리 APSP는 각 버텍스에서 다른 모든 노드와 동등한 거리를 계산해야 합니다.
이 문제의 일반적인 접근법은 하지만 얼굴 거래 오프. Floyd-Warshall, 동적 프로그래밍 알고리즘, dense 그래프에서 작동하지만 O(V]3]])]]]]에서 실행하고 부정적인 무게주기를 처리 할 수 없습니다. Dijkstra의 알고리즘은 각 버텍스에서 실행할 때 ) 무게 (V)]]]의 차이를 처리하는 것이 가장 좋은 방법입니다.
Common Algorithms의 비교
Johnson의 알고리즘을 평가하려면 가장 자주 사용되는 APSP 해결사에 대비하는 데 도움이 됩니다.
- Floyd-Warshall] - 구현하기 쉬운, 트리플 루프를 통해 2D 거리 매트릭스를 사용하여 업데이트. 부정적인 가장자리에 작동하지만 부정적인 사이클. 입방 시간에 인해 수천의 vertices와 그래프에 대한 실제.
- Repeated Dijkstra – 각 버텍스에서 Dijkstra를 실행합니다. 비소 그래프에서 빠른 (]O(V E log V)] Fibonacci heaps를 사용하여, 하지만 비 부정적인 무게에 제한.
- Bellman-Ford (repeated) – 음극을 처리하지만 O(V]2]E)], 두 대안보다 더 느리게 됩니다.
- Johnson의 Algorithm] – 모든 가장자리가 비 부정적 인 것으로 간주하므로 그래프를 재량, 그 후 반복 Dijkstra를 적용합니다. 그것은 O (V E + V]]2 log V)를 바이너리 헬리콥터로 사용하여 신체의 무게를 띠는 것을 선호합니다.
Johnson의 알고리즘이 어떻게 작동합니까?
Johnson의 알고리즘은 부정적인 가장자리를 하나의 비 중립적 인 가장자리 무게로 포함하는 그래프를 변환하고 가장 짧은 경로의 구조를 보존합니다. 이 변환은 ]potential function에서 Bellman‐Ford의 단일 실행에서 파생됩니다. 재중량되면 Dijkstra의 알고리즘은 각 노드에서 안전하게 사용할 수 있습니다. 알고리즘은 4 단계로 구성됩니다.
단계 1: 슈퍼 소스 노드 추가
새로운 vertex s은 그래프에 추가되어, 모든 기존의 vertex에 무게 0의 가장자리에 연결됩니다. 이 추가 노드는 를 사용하는 경로가 아니라 비용이 부과될 수 있기 때문에 가장 짧은 경로 거리를 변경하지 않습니다.]]는 비용이 없이 부과될 수 있습니다.
2 단계 : Bellman-Ford와 잠재적 인 기능을 계산
슈퍼 소스에서 Bellman-Ford 알고리즘을 실행 s]. ]]s]은 모든 vertices에 0-weight 가장자리를 가지고 있기 때문에, 알고리즘은 가장 짧은 거리 h(v)]]는 s]에서 각 vertices ]의 짧은 거리가 존재한다는 것을 나타냅니다. 이 경우, 이것은 부정적인 주기의 부족을 발견하지 않습니다.
단계 3: 그래프를 재비화
잠재적인 사용 h(v), 각 가장자리 (u, v)] 원래 무게 w(u, v)
w'(u, v) = w(u, v) + h(u) - h(v)
이 변환은 모든 재중량 가장자리 무게가 비정상적 인 것을 보장합니다. 증거는 삼각형 불평에 의존합니다. h(v) ≤ h(u) + w(u, v) (Belleman‐Ford의 출력), 그것은 그 w'(u, v) ≥ 0. 그래프는, 두 가지의 그래프가 짧게 보존하는 그래프는 다음과 같습니다.
단계 4: Dijkstra의 알고리즘을 실행
무겁고 부정적인 가장자리를 포함하는 재중량한 도표로, Dijkstra의 알고리즘은 각 vertex에서 한 번 달에 달립니다. 각 뛰기는 다른 모든 vertices에 가장 짧은 거리를 따릅니다. 유래 거리는 그 때 공식을 사용하여 본래 가장자리 무게로 돌아갑니다:
distoriginal(u, v) = distreweighted(u, v) – h(u) + h(v)]]
이 최종 단계는 보고된 거리를 본래 도표를 위해 정확합니다 지킵니다.
복잡성 및 성능 분석
Johnson의 알고리즘은 O(V E + V2] log V)]의 전체 시간 복잡성을 달성한다. 이그제한 헬리콥터 우선 큐에 구현할 때 Bellman‐Ford 단계는 O(V E), 그리고 그 후속 [[FLTLTLTLTLTLT][FLT]][FLT]]]]]][FLT]]]]]]]]]]]]]]][FLT:]]]]]]]]]]][FLT:[FLT:]]]]]]]]]]][FLT:[FLT:[FLT:[FLT:[FLT:[FLT:[FLT:[FLT:[FLT:]]]]]]]]]]]]]
Fibonacci heap을 사용하여 Dijkstra의 일부를 O(V E + V]2] log V)] amortized, 그러나 바이너리 heaps는 더 간단 하 고 자주 충분히 빠른. 메모리 발자국은 O(V]2]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]][Fluxfxfxfxfxfxfxfxfxfx[fx[[[fx[[[[[[[f[fx[f]]]]]]]]]]]]]]]]]]]]]]f]]]][f]]]
Practical 신청
Johnson의 알고리즘은 그래프 가장자리가 부정적인 비용을 수행 할 수 있으며 모든 쌍의 가장 짧은 거리가 필요합니다. Real‐world 예제는 다음과 같습니다.
- Network routing: 인터넷 서비스 제공업체 및 통신망 사용은 두 개의 라우터 사이의 가장 저렴한 경로를 계산해야 하는 분산 라우팅 프로토콜을 사용, 심지어 링크 비용 변동 또는 부정적인 (예를 들어, 혼잡 또는 정책 할인).
- Urban 수송 계획: 매핑 및 물류 회사 (예: Google Maps, OpenStreetMap routing 엔진)는 함대 최적화에 대한 많은 기원의 세속 쌍 사이의 가장 짧은 경로가 계산됩니다. 부정적인 무게는 하위 또는 시간 기반 할인을 모델 할 수 있습니다.
- 공급 체인 비용 최소화: 멀티단계 생산 네트워크에서 하나의 노드에서 다른 비용으로 부정적인 (예를들면, 리베이트)가 될 수 있습니다. Johnson의 알고리즘은 전체 공급망 전반에 가장 수익성 있는 루트를 찾습니다.
- 소셜 네트워크 분석: 측정 가깝성 중심성 또는 간섭 중앙성은 모든 쌍 거리를 요구합니다. 부정적인 가장자리는 “친구 ‐친구 ‐친구 ‐친구 ‐친구 ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─────── ─ ─ ─ ─ ────────
- Economic input‐output model: Leontief model and flow analysiss often involve negative 계수; Johnson의 알고리즘은 상호 연결 경제를 통해 전파 변화의 순응을 준수합니다.
수학 기초에 대한 자세한 내용을 보려면 Wikipedia의 상세한 항목]과 Donald B. Johnson (1977)의 원본 논문을 참조하십시오. Python의 실제 구현은 NetworkX의 GitHub 저장소에서 찾을 수 있으며, Johnson의 알고리즘을 표준 함수로 포함합니다. 재중량 기술에 대한 깊은 이해를 위해 NetworkX의 GitHub 저장소를 참조하십시오.
관련 기사
Johnson의 알고리즘은 부정적인 가장자리 무게가 현재 있을 때 모든 쌍의 가장 짧은 경로 문제에 우아하고 실용적인 솔루션으로 나뉩니다. Bellman-Ford의 견고성을 결합함으로써 ( 부정적인 사이클과 컴퓨팅 잠재력을 감지하기 위해) Dijkstra의 속도 (비 부정적인 그래프를 위해), 그것은 스파우 네트워크에 우수한 성능을 달성합니다. 재중량 기술은 잠재적 인 기능의 아름다운 응용 프로그램입니다-이 개념은 최소의 경로와 같은 거의 동일한 영역으로 확장하는 최소의 알고리즘을 확장하는 것입니다.
그래프가 비소인 실제 APSP 문제로 직면하면 부정적인 가장자리를 포함 할 수 있습니다. Johnson의 알고리즘은 첫 번째 고려 사항이어야합니다. 이론적 보증 및 라이브러리에서 광범위한 구현 (예 : [[FLT : 0]]NetworkX[[FLT :1]], [[FLT : 2]]Boost Graph Library[FLT : 3])는 채택하기 위해 실질적으로 만듭니다.