我正在尝试理解图论的主要概念和其中的算法。大多数算法似乎包含一个“松弛条件”,我不确定这是什么。
有人能给我解释一下吗?
其中一个例子是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[]谢谢
发布于 2010-04-07 21:47:20
松弛步骤:
u和u每个节点,您与源节点之间有一个暂定的距离(对于除源节点之外的所有节点,它从正无穷大开始,直到达到最小值时才会减小)。放松的步骤基本上是这样问的:
dist[v]的路径到达v。我可以通过u转到v来改进这一点吗?(其中后者的距离为dist[u] + weight(u, v))图形化:
s ~~~~~~~> v
\ ^
\ |
\~~~~~> u你知道一些有距离的路径s~>v,还有一些有距离dist[v]的路径s~>u。如果为dist[u] + weight(u, v) < dist[v],则路径s~>u->v比s~>v短,因此最好使用该路径!
(我写a~>b是指从a到b的任意长度的路径,而a->b我指的是从a到b的直接单边)。
发布于 2010-04-07 21:43:27
英语单词"relaxation“的意思之一就是减少一些东西。因为在第14、15和16行,你本质上是在检查是否可以减少(优化)当前计算的距离,我猜这就是为什么它被称为“松弛条件”。
发布于 2022-01-16 12:40:21
记住的一种方法是:
。对肌肉施加张力或压力( reduce relax or reduce)
所以我们说:
。Dijkstra's算法中最近点的relax outgoing edges
。Bellman-Ford算法中的relax edges repeatedly
两者都意味着尝试减少从起始节点到到达边另一端的顶点的距离
https://stackoverflow.com/questions/2592769
复制相似问题