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

Algorithm 如何计算网络中的平均权最短路径,algorithm,networking,dijkstra,Algorithm,Networking,Dijkstra,输入 我有一个无向图G(V,E),它有一组顶点V和一组边E。每条边都有一个正权重w_ij。有一个起始节点v_1和一个结束节点v_3 问题/算法 是否有可能找到一条“最优”路径,即路径中每个使用的边的权重最小化,在某种意义上是最优的?此外,任何节点都不应访问一次以上 请注意,经典的Dijkstra算法将失败,因为它寻找的路径权重之和最小: 最小值(总和) 但是,我正在寻找满足以下条件的路径:Min(求和(w_ij)/边的数量(u) 示例 为了澄清,我创建了一个小数字。 红色数字对应于边的权重,黑色

输入

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

问题/算法

是否有可能找到一条“最优”路径,即路径中每个使用的边的权重最小化,在某种意义上是最优的?此外,任何节点都不应访问一次以上

请注意,经典的Dijkstra算法将失败,因为它寻找的路径权重之和最小: 最小值(总和)

但是,我正在寻找满足以下条件的路径:Min(求和(w_ij)/边的数量(u)

示例

为了澄清,我创建了一个小数字。 红色数字对应于边的权重,黑色字母对应于顶点的标签。 如果我用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

第一种方法:迪克斯特拉 只需计算开始节点和结束节点之间的所有路径(无循环)。然后计算总重量和总长度并将其除以。对于一个大小适中的网络来说,这种方法会占用太多内存,这是我最终想到的(n=200000)

第二种方法:同时计算长度的Dijkstra 在计算最短路径(最小权重和)时,还可以保存到目前为止的路径长度。这样,您就可以知道关于每条边的权重的当前最佳路径

问题

1) 有解决这个问题的办法吗


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

您需要修改Dijkstra算法中的成本函数,以使其工作。对于每个节点,您应该计算所需的平均值(而不是实际权重),并在访问新节点时存储和更新它。您应该为每个访问的节点存储两个数量:
average\u sou\u far
(而不是像以前一样存储最短路径的长度)和
number\u of\u edges
(以跟踪路径中已有多少边)。如果对每个已访问的顶点都知道这一点,则在访问新顶点后,应检查具有多条边的新平均值<代码>(迄今为止的平均值*边数+权重(新边))/(边数+1)


这些方法最终应该会奏效。

“1)是否存在一个库来查找“平均重量最短路径长度”?“=>
要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于堆栈溢出来说是离题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。
。“2)到目前为止,我使用Boost库的Dijkstra算法来计算最短路径-是否可以调整它?”=>太宽。我正在寻找一种算法(在最好的情况下是现有库)来解决我的上述问题。显然这还不够清楚。现在是。我只提到boost,因为我想展示我以前尝试过的东西。我还通读了一大堆关于Dijkstra/Bellman Ford/Floyd Warshall/a*/Min加上矩阵乘法的文献(这些文献对我毫无帮助)。现在我在这里寻求帮助。我不认为我的问题太宽泛。正如前面提到的,你的问题在这里是离题的,实际上有两个原因。如果您有疑问,可以参考帮助页面。(目前已经登记了4张接近票数的选票,似乎改善了我的理由)那么,我应该如何改进我的问题,或者如果这是一个错误的提问地点,那么哪里会是更好的提问地点?你有什么建议吗?我真的找不到正确的算法。如果什么事都没有发生,我明天会自己解决这个问题,以避免其他人的麻烦。我想我很抱歉浪费了你的时间。好的,我删除了图书馆的评论。请删除保留的文件。这个问题纯粹是关于算法的。