使用Dijkstra时如何权衡其他因素

时间:2019-12-14 01:41:41

标签: algorithm graph

我正在解决这个问题,我们有一个图,并尝试从节点1到节点N。边权重是“成本”,每个边也有“流”值。对于从节点1到节点N的任何路径,总成本将是路径上边缘的所有成本之和,而流量将是边缘之间的最小流量值。我们要最大化流量/成本比率。

我有个想法,就是使用Dijkstra来找到从1到N的最小成本路径,当我尝试以这种方式找到路径时,我意识到我没有考虑流量。我想执行修改过的Dijkstra,在计算最佳路径时要考虑到每个边缘的流动,但是我不确定该怎么做。

我应该通过减少或增加额外的流量来控制边缘成本,还是因为我们正在查看比率,所以这行不通吗?

我还尝试查找通过BFS的每条路径,但是存在时间限制,我也无法做到这一点。

有人可以给我一些解决此问题的提示吗?

编辑: 一个示例有3个节点,1、2和3。1和2的边缘成本为2,流为4。2和3的边缘成本为5,流为3。从1到N只有一条路径。其流量为min(3,4)= 3,其成本为2 + 5 = 7。因此该比率将为3/7。但是在大多数情况下,我们将有几种可能的路径。

2 个答案:

答案 0 :(得分:1)

遵循Dijkstra的算法,为每个节点 v 保持距离标签D [v](通常),以及流标签F [v]。目标是使比率F [v] / D [v]最大化。算法应该选择的顶点 u 是最大化该比率的顶点。

然后,在任何入射边缘 e =(u,v)松弛期间,执行以下计算以查看从起始顶点到 v的新可能路径的比率使用 u 作为中间顶点的比以前找到的任何路径都要好。

// relaxing edge e = (u,v)
newDistance = min{ D[u], D[v] + cost(e) }
newFlow = min{ F[u], flow(e) }

if ( (newFlow / newDistance) > (F[v] / D[v]) )
    v.parent = u
    F[v] = newFlow
    D[v] = newDistance

答案 1 :(得分:0)

我不确定,但是您可以仅将流量/成本比率用作节点权重。 Dijkstra算法可以。

顺便说一句,我有一个关于同一主题的课程,我有长度和速度成本,并且使用长度/速度比对我来说很有效。您可以在GitHub上查看所有来源。