나는 세 가지를 공부하고 아래에서 그들로부터 내 추론을 진술하고 있습니다. 내가 충분히 정확하게 이해했는지 알 수 있습니까? 감사합니다.
Dijkstra의 알고리즘은 단일 소스가 있고 한 노드에서 다른 노드로 가장 작은 경로를 알고 싶을 때만 사용되지만 다음과 같은 경우에는 실패 합니다.
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의 알고리즘이 음수 가중치 노드를 처리 할 수 있다고 확신합니다. 가중치 사이클이 음수이면 알고리즘에 관계없이 가장 짧은 경로가 정의되지 않습니다.
—
케빈 클라인
@kevincline : Wikipedia는 귀하의 주장을지지하지 않습니다 (위키 백과가 옳다고 주장하지는 않지만 AlgTheory 서적이 수백 마일 떨어져 있습니다) 그러나 실제 시간 기반 또는 속도 기반 라우팅 문제에는 부정적인 가장자리가 없으므로 필요에 따라 일반적으로 Dijsktra 또는 Floyd를 수행합니다. 내가 기억하는 한, 대부분의 실제지도 제작 라우팅 알고리즘은 현대화 된 버전의 Dijsktra를 기반으로하지만 이전 직장에서 읽은 일부 과학 논문에서 기억합니다.
—
Aadaam
@Aadaam : 나는 틀렸다. Dijkstra는 모든 비 방문을 피하기 위해 비 음성을 이용합니다.
—
케빈 클라인
예, 당신은 올바르게 이해했습니다. :)
—
이상현