Dijkstra在两个顶点之间具有平行边

时间:2015-07-09 11:44:43

标签: algorithm routing dijkstra

我遇到了路由问题,我需要检索两点之间的最佳解决方案。我正在使用Dijkstra获得最佳解决方案,并使用Yen Top K算法来获得最佳解决方案。

然而,它有一个扭曲,你可以在顶点之间有多个平行边。让我们想象一下公交网络:

Line A: a -> b -> c -> d -> e
Line B: b -> c -> d -> e -> f
Line C: a -> b -> c -> g -> h

构建图形时,如何处理这些并行连接? 我正在考虑构建图形:

Line A: a->b,a->c,a->d a->e,b->c,b->d,b->d,b->e,c->d,c->e,d->e
Line B: b->c,b->d,b->e,e->f,c->d,c->e,c->f,d->e,d->f,e->f
Line C: a->b,a->c,a->g,a->h,b->c,b->g,b->h,c->g,c->h,g->h

因此,当我不必改变公共汽车时,我有直接的优势。 对于每个Vertex,我会通过添加连接惩罚权重。

因此,如果我想从a-> e开始,我可能会使用线路C获得A线a-> b,B线b-> e因为连接时间可能会更长,即使时间也是如此线C a-> b和线B b-> e可能比线A上的路线快。

但是我仍然需要处理并行连接。所以我想我需要按重量对平行边缘进行排序。

目前,这是基于静态定时信息,但在某些时候,它应该考虑实际的时间表信息。并且取决于两个顶点之间的权重可能会发生变化。例如。当你到达b点时,通过线路C的最快连接将不再是最快的,因为你会错过线路C等。

是否有任何资源可以解释如何处理这些更复杂的情况?

1 个答案:

答案 0 :(得分:2)

一种方法可能是通过“拆分节点”将问题简化回简单的图形(没有平行边缘)

这意味着,如果您有一个带有边u的节点(v,u)_1, (v,u)_2, ..., (v,u)_k,则可以将u拆分为:u, u_1, u_2,...,u_k,边缘为:(u_1,u), (u_2,u), ..., (u_k,u), (v,u_1), (v,u_2), ...., (v,u_k),和重量: w(u_i,u) = 0 for all iw(v,u_i) = w((v,u)_i) for all i

现在,您可以轻松运行任何为简单图形设计的算法,其中顶点数量以平行边缘数量的线性因子增加。