我正在解决这个问题,我们有一个图,并试图从节点 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。但在大多数情况下,我们会有几种可能的路径。

最佳答案

遵循 Dijkstra 算法并为每个节点 v 维护一个距离标签 D[v](像往常一样),以及一个额外的流标签 F[v]。目标是最大化比率 F[v]/D[v]。算法接下来应该选择的顶点 u 是使该比率最大化的顶点。

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

// 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

关于algorithm - 使用 Dijkstra 时如何加权其他因素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59331663/

10-12 14:13