我试图理解图论的主要概念及其中的算法。大多数算法似乎包含“松弛条件”我不确定这是什么。
请有人向我解释一下。
这方面的一个例子是dijkstras算法,这里是伪代码。
1 function Dijkstra(Graph, source):
2 for each vertex v in Graph: // Initializations
3 dist[v] := infinity // Unknown distance function from source to v
4 previous[v] := undefined // Previous node in optimal path from source
5 dist[source] := 0 // Distance from source to source
6 Q := the set of all nodes in Graph
// All nodes in the graph are unoptimized - thus are in Q
7 while Q is not empty: // The main loop
8 u := vertex in Q with smallest dist[]
9 if dist[u] = infinity:
10 break // all remaining vertices are inaccessible from source
11 remove u from Q
12 for each neighbor v of u: // where v has not yet been removed from Q.
13 alt := dist[u] + dist_between(u, v)
14 if alt < dist[v]: // Relax (u,v,a)
15 dist[v] := alt
16 previous[v] := u
17 return dist[]
由于
答案 0 :(得分:36)
放松步骤:
u
和v
放松步骤基本上是问这个:
v
到达dist[v]
。我可以转而v
通过u
改进吗? (后者的距离为dist[u] + weight(u, v)
)图形:
s ~~~~~~~> v
\ ^
\ |
\~~~~~> u
您知道某条距离为s~>v
的路径dist[v]
,并且您知道某条距离为s~>u
的路径dist[u]
。如果dist[u] + weight(u, v) < dist[v]
,则路径s~>u->v
比s~>v
短,所以您最好使用该路径!
(我写a~>b
表示从a
到b
的任何长度的路径,而a->b
我指的是直接单边从a
到b
)。
答案 1 :(得分:9)
英语单词“relax”的意思之一就是减少某些东西。因为在第14,15和16行,你基本上检查你是否可以减少(优化)当前计算的距离,我想这就是为什么它被称为“放松条件”。