모든 피어스 숏스트 경로 문제 이해

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])는 채택하기 위해 실질적으로 만듭니다.