如何计算网络中的平均权重最短路径

时间:2016-05-06 20:16:57

标签: algorithm networking dijkstra

输入

我有一个无向图G(V,E),它有一组顶点V和一组边E.每个边都有一个正权w_ij。有一个起始节点v_1和一个结束节点v_3。

问题/算法

是否有可能找到最佳的"路径,在某种意义上是最优的,路径中每个使用边缘的权重最小化?也不应该多次访问任何节点。

请注意,经典的Dijkstra算法会失败,因为它会查找权重总和最小的路径: 最小(Sum(w_ij))

但是,我正在寻找满足的路径:Min(Sum(w_ij)/ number_of_edges)

示例

为了澄清,我创造了一个小人物。 红色数字对应于边缘的权重,黑色字母对应于顶点的标签。 如果我使用Dijkstra算法计算顶点v1和v3(图1)之间的最短路径,则最短路径为v1-> v2-> v3,因为 这给出了最低的总重量:

w = 2 + 2 = 4。

但是,我想拥有"平均重量最短路径长度",这样路径的每一步的平均重量低于每一步  其他路径。在上面提到的 例如"平均体重最短路径"是v1-> v4-> v5-> v6-> v7-> v3,因为平均重量将是

w = 1/5(1 + 1 + 1 + 1 + 1)= 1,

而在另一条路径上,它是v1-> v2-> v3给出

w = 1/2(2 + 2)= 2。

第一种方法:Dijkstra 只需计算起始节点和结束节点之间的所有路径(无循环)。然后计算总重量和总长度并将它们分开。这种方法对于体积适中的网络来说会占用太多内存,我最终会想到这一点(n = 200000)。

第二种方法:Dijkstra并发长度计算 在计算最短路径(最小权重总和)时,您还要保存到目前为止的路径长度。通过这种方式,您可以了解每条边缘重量的当前最佳路径。

问题

1)是否存在解决此问题的解决方案?

2)如何实现这个问题的解决方案?

1 个答案:

答案 0 :(得分:1)

您需要修改Dijkstra算法中的成本函数才能使其工作。对于每个节点,您应该计算所需的平均值(而不是实际重量),并在访问新节点时存储和更新它。您应该为每个访问过的节点存储两个数量:average_so_far(而不是之前的最短路径长度)和number_of_edges(以跟踪已经有多少边缘)在你的道路上)。如果你知道每个已经访问过的顶点,那么一旦你访问了一个新的顶点,你应该检查一个边缘(average_so_far*number_of_edges+weight(new edge))/(number_of_edges+1)的新平均值是否有所改善。

这些方面的某些东西最终应该有用。