Floyd-Warshall, Dijkstra 및 Bellman-Ford 알고리즘의 차이점에 대해 맞습니까?


12

나는 세 가지를 공부하고 아래에서 그들로부터 내 추론을 진술하고 있습니다. 내가 충분히 정확하게 이해했는지 알 수 있습니까? 감사합니다.

  1. Dijkstra의 알고리즘은 단일 소스가 있고 한 노드에서 다른 노드로 가장 작은 경로를 알고 싶을 때만 사용되지만 다음과 같은 경우에는 실패 합니다.

  2. Floyd-Warshall의 알고리즘은 모든 노드 중 하나가 소스가 될 수있을 때 사용되므로 가장 짧은 거리가 모든 소스 노드에서 대상 노드에 도달하려고합니다. 마이너스 사이클이있는 경우에만 실패

(이것이 가장 중요합니다. 제 생각에는 이것이 가장 확실하지 않은 것입니다.)

3.Bellman-Ford는 소스가 하나만있을 때 Dijkstra와 같이 사용됩니다. 이것은 음의 가중치를 처리 할 수 ​​있으며 그 작동은 Floyd-Warshall과 동일합니다. 하나의 소스를 제외하고는 그렇습니까?

살펴 봐야 할 경우 해당 알고리즘은 다음과 같습니다 (무료 위키 백과).

벨맨 포드 :

 procedure BellmanFord(list vertices, list edges, vertex source)
   // This implementation takes in a graph, represented as lists of vertices
   // and edges, and modifies the vertices so that their distance and
   // predecessor attributes store the shortest paths.

   // Step 1: initialize graph
   for each vertex v in vertices:
       if v is source then v.distance := 0
       else v.distance := infinity
       v.predecessor := null

   // Step 2: relax edges repeatedly
   for i from 1 to size(vertices)-1:
       for each edge uv in edges: // uv is the edge from u to v
           u := uv.source
           v := uv.destination
           if u.distance + uv.weight < v.distance:
               v.distance := u.distance + uv.weight
               v.predecessor := u

   // Step 3: check for negative-weight cycles
   for each edge uv in edges:
       u := uv.source
       v := uv.destination
       if u.distance + uv.weight < v.distance:
           error "Graph contains a negative-weight cycle"

다이크 스트라 :

 1  function Dijkstra(Graph, source):
 2      for each vertex v in Graph:                                // Initializations
 3          dist[v] := infinity ;                                  // Unknown distance function from 
 4                                                                 // source to v
 5          previous[v] := undefined ;                             // Previous node in optimal path
 6                                                                 // from source
 7      
 8      dist[source] := 0 ;                                        // Distance from source to source
 9      Q := the set of all nodes in Graph ;                       // All nodes in the graph are
10                                                                 // unoptimized - thus are in Q
11      while Q is not empty:                                      // The main loop
12          u := vertex in Q with smallest distance in dist[] ;    // Start node in first case
13          if dist[u] = infinity:
14              break ;                                            // all remaining vertices are
15                                                                 // inaccessible from source
16          
17          remove u from Q ;
18          for each neighbor v of u:                              // where v has not yet been 
19                                                                                 removed from Q.
20              alt := dist[u] + dist_between(u, v) ;
21              if alt < dist[v]:                                  // Relax (u,v,a)
22                  dist[v] := alt ;
23                  previous[v] := u ;
24                  decrease-key v in Q;                           // Reorder v in the Queue
25      return dist;

플로이드 워샬 :

 1 /* Assume a function edgeCost(i,j) which returns the cost of the edge from i to j
 2    (infinity if there is none).
 3    Also assume that n is the number of vertices and edgeCost(i,i) = 0
 4 */
 5
 6 int path[][];
 7 /* A 2-dimensional matrix. At each step in the algorithm, path[i][j] is the shortest path
 8    from i to j using intermediate vertices (1..k−1).  Each path[i][j] is initialized to
 9    edgeCost(i,j).
10 */
11
12 procedure FloydWarshall ()
13    for k := 1 to n
14       for i := 1 to n
15          for j := 1 to n
16             path[i][j] = min ( path[i][j], path[i][k]+path[k][j] );

Dijkstra의 알고리즘이 음수 가중치 노드를 처리 할 수 ​​있다고 확신합니다. 가중치 사이클이 음수이면 알고리즘에 관계없이 가장 짧은 경로가 정의되지 않습니다.
케빈 클라인

1
@kevincline : Wikipedia는 귀하의 주장을지지하지 않습니다 (위키 백과가 옳다고 주장하지는 않지만 AlgTheory 서적이 수백 마일 떨어져 있습니다) 그러나 실제 시간 기반 또는 속도 기반 라우팅 문제에는 부정적인 가장자리가 없으므로 필요에 따라 일반적으로 Dijsktra 또는 Floyd를 수행합니다. 내가 기억하는 한, 대부분의 실제지도 제작 라우팅 알고리즘은 현대화 된 버전의 Dijsktra를 기반으로하지만 이전 직장에서 읽은 일부 과학 논문에서 기억합니다.
Aadaam

@Aadaam : 나는 틀렸다. Dijkstra는 모든 비 방문을 피하기 위해 비 음성을 이용합니다.
케빈 클라인

예, 당신은 올바르게 이해했습니다. :)
이상현

답변:


3

내가 당신을 올바르게 이해한다면, 당신의 이해는 정확합니다.

  • Djikstra 's는 음의 가중치 에지가있는 경우를 제외하고 그래프에서 소스 노드에서 다른 모든 노드로가는 최소 비용 경로를 찾습니다. Dijkstra는 대상 노드를 찾은 후 중지하도록 휴리스틱을 추가하여 변경하면 A * 알고리즘으로 쉽게 변환 할 수 있습니다.
  • Bellman-Ford는 Dijkstra와 동일하지만 속도가 느립니다. 그러나 음의 무게를 다룰 수 있습니다.
  • Floyd-Warshall은 각 노드에서 다른 모든 노드까지 가장 작은 비용 경로의 비용을 찾습니다. (숫자 행렬을 반환합니다.) Djikstra 또는 Bellman-Ford보다 훨씬 느립니다. 작성한 것과 달리 음수 사이클이 발생해도 실패하지 않으며 일부 노드 비용 자체에 의미없는 음수를보고합니다.

1
Floyd-Warshall은 경로 길이뿐만 아니라 Djikstra 및 Bellman-Ford와 마찬가지로 경로 자체를 계산할 수 있습니다.
Konrad Rudolph

물론 수정으로.
Ceasar Bautista

3
대상 노드에서 중지되었지만 휴리스틱을 사용하지 않은 경우 Dijkstra의 첫 번째 것으로 생각합니다.
Eliot Ball

1
@CSA-Floyd Warshall은 O (n ^ 3)이므로 이러한 큰 그래프에는 약 10 ^ 300 작업이 필요합니다. 각 작업에 플랑크 시간이 걸린다고 가정하면, 계산이 완료 될 때까지 우주의 일반 물질에있는 모든 양성자가 붕괴되고 초 거대 블랙홀 만 남게 됩니다. 내부 루프를 병렬화하는 것이 가능할 수 있다고 생각합니다. 이것이 사실이라면, 태양 덩어리로 시작된 모든 검은 구멍이 증발하기 전에 마무리하기에 운이 좋을 수도 있습니다.
Jules

1
(프로세스 당 하나 이상의 원자를 사용하여 처리 노드를 구축 할 수 있고 관찰 가능한 유니버스의 모든 원자를 사용할 수 있다고 가정합니다. 그러나 아마도 데이터를 저장하기 위해 모든 원자가 필요할 수 있습니다.)
Jules
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.