我如何 select 最小化图中其他节点的最大最短距离的节点?
How do I select the node that minimizes the maximum shortest distance to the other nodes in a graph?
我有一个无向、连通、正加权图 G = <V,E>
。我需要在 V
中找到 一个节点 v_min
以使 v_min
与其他节点之间的最大距离最小化。我了解到这是 k-center 问题(即 k=1
)的一个特殊问题,已知它是 NP-Hard。但是,由于我们限制 k
等于 1,我认为问题仍然可以有效解决。
我现在的方法是:计算V
中节点之间的所有对距离,例如,使用Floyd-Warshall,或重复调用Dijkstra。然后,我们向下查看节点列表,找到使该节点与其他节点之间的最大距离最小的节点。如果满足这个条件的节点不止一个,就挑一个。
- 这种方法正确吗?
- 有没有更好的方法(即更有效)?
请注意,我对近似算法不感兴趣,只对精确算法感兴趣。
您正在寻找的节点称为图形中心或约旦中心,您找到它们的方法是常用方法。 Floyd-Warshall 是找到节点之间所有距离的快速方法,迭代结果以找到最小最大值将花费更少的时间。
对于大多数用途来说,这应该足够快了,不可能做得更好。如果性能是最重要的,您可以看看 this 2019 paper,它引入了一种新算法,他们声称该算法可更好地并行化,并且通常比 Floyd-Warshall 稍快。
加速重复 Dijkstra
如果您使用重复的 Dijkstra 来计算所有成对距离(这是稀疏图的更有效选择),有一个简单的观察可以节省您执行许多迭代的时间——我预计大约平均一半。
因为图是无向的,一旦我们计算了到某个根顶点 v 的所有距离,我们也知道距离 从 每个其他顶点 到 v. 令 u 为距 v 最大距离处的顶点;称这个距离为d。那么 u 不可能是比 v 更好的选择,因为我们只关心它到任何其他顶点的最大距离,并且我们已经知道它与某个顶点(即 v)的距离为 d,因此它的最大值距离不能小于这个。因此,运行从 u 开始的 Dijkstra 搜索没有意义。
IOW,在从某个特定的起始顶点 运行ning Dijkstra 之后,我们可以从我们需要 运行 Dijkstra 最短路径的顶点列表中以最大距离交叉所有顶点从中搜索。可能有多个这样的顶点。
注意这个优化并没有改变渐近时间复杂度,在最坏的情况下,它只节省了1次迭代(可能是除了第一次之外,所有的最大距离顶点都已经被处理过了) ).但在最好的情况下——当所有顶点与最初选择的顶点的距离相等时——我们可以在 运行 完成初始 Dijkstra 搜索后完成。
我有一个无向、连通、正加权图 G = <V,E>
。我需要在 V
中找到 一个节点 v_min
以使 v_min
与其他节点之间的最大距离最小化。我了解到这是 k-center 问题(即 k=1
)的一个特殊问题,已知它是 NP-Hard。但是,由于我们限制 k
等于 1,我认为问题仍然可以有效解决。
我现在的方法是:计算V
中节点之间的所有对距离,例如,使用Floyd-Warshall,或重复调用Dijkstra。然后,我们向下查看节点列表,找到使该节点与其他节点之间的最大距离最小的节点。如果满足这个条件的节点不止一个,就挑一个。
- 这种方法正确吗?
- 有没有更好的方法(即更有效)? 请注意,我对近似算法不感兴趣,只对精确算法感兴趣。
您正在寻找的节点称为图形中心或约旦中心,您找到它们的方法是常用方法。 Floyd-Warshall 是找到节点之间所有距离的快速方法,迭代结果以找到最小最大值将花费更少的时间。
对于大多数用途来说,这应该足够快了,不可能做得更好。如果性能是最重要的,您可以看看 this 2019 paper,它引入了一种新算法,他们声称该算法可更好地并行化,并且通常比 Floyd-Warshall 稍快。
加速重复 Dijkstra
如果您使用重复的 Dijkstra 来计算所有成对距离(这是稀疏图的更有效选择),有一个简单的观察可以节省您执行许多迭代的时间——我预计大约平均一半。
因为图是无向的,一旦我们计算了到某个根顶点 v 的所有距离,我们也知道距离 从 每个其他顶点 到 v. 令 u 为距 v 最大距离处的顶点;称这个距离为d。那么 u 不可能是比 v 更好的选择,因为我们只关心它到任何其他顶点的最大距离,并且我们已经知道它与某个顶点(即 v)的距离为 d,因此它的最大值距离不能小于这个。因此,运行从 u 开始的 Dijkstra 搜索没有意义。
IOW,在从某个特定的起始顶点 运行ning Dijkstra 之后,我们可以从我们需要 运行 Dijkstra 最短路径的顶点列表中以最大距离交叉所有顶点从中搜索。可能有多个这样的顶点。
注意这个优化并没有改变渐近时间复杂度,在最坏的情况下,它只节省了1次迭代(可能是除了第一次之外,所有的最大距离顶点都已经被处理过了) ).但在最好的情况下——当所有顶点与最初选择的顶点的距离相等时——我们可以在 运行 完成初始 Dijkstra 搜索后完成。