最短路径算法的变种

时间:2014-02-25 21:32:05

标签: algorithm math graph mathematical-optimization shortest-path

我们给出了一个带有两个源和两个目标顶点(比如s1,s2,d1,d2)的加权无向图。 对于从源1到目的地1以及从源2到目的地2,成本定义为:

  • 如果边缘仅使用两条路径中的一条,则使用边缘的成本等于权重。
  • 如果边缘被使用两个路径(s1-> ...→d1和s2-> ...-> d2),则使用边缘的成本等于重量的1.5倍。

总之,如果两条路径使用相同的边缘,则总成本增加“1.5 x weight”而不是“2 x weight”。鼓励使用共同边缘。

如果路径使用具有相反方向的边缘,则不会降低成本。

确定最小化总费用的算法的任何帮助,想法或建议?

2 个答案:

答案 0 :(得分:7)

我建议首先在时间O(n ^ 3)中使用Floyd Warshall找到所有对最短路径,其中n是顶点数。

一旦你拥有它,你就可以计算沿着最短路径走s1-> d1和s2-> d2的成本,这为你提供了成本的上限。

做得更好的唯一方法是使用共享路径。如果是这样,则s1和s2将会聚在顶点A,然后沿共享路径前往顶点B,然后分割为d1和d2。

所以算法是尝试所有顶点对A,B并使用对之间的预计算最短路径d(x,y)计算最小值:

d(s1,A)+d(s2,A)+1.5*d(A,B)+d(B,d1)+d(B,d2)

此搜索为O(n ^ 2),因此整体成本为O(n ^ 2)+ O(n ^ 3)= O(n ^ 3)

答案 1 :(得分:0)

@Peter de Rivaz提供了一个基于Floyd算法在O(n^3)中运行的解决方案。以下备选方案基于Dijkstra算法并在O(n^4)中运行,但可能适用于更一般的问题设置(参见附录):

生成包含n^2个节点的新图表,其中图表中的每个节点(a, b)对应于原始图表中两个节点ab的组合。此新图表的节点连接如下:(a, b)(c, d)之间有一条边iff:

  • aca == b有一条边,
  • bdb == d
  • 有一条边
原始图表中的

。此新边的成本对应于原始图中两条边的总和,除非 a = bc = d,在这种情况下,成本是原始图形的总和边缘乘以1.5。

此新图表还包含两个节点(s1, s2)(d1, d2)。只需确定这两个节点之间的最短路径,就可以很容易地推导出原始图中的各个路径。

附录:

基于Floyd的方法的主要优点是,您可以在问题陈述的修改方面获得更大的灵活性。例如,可以解决问题的变化,其中只有当两个旅行者在相同的“步骤”中共享边缘时才授予“共享折扣”:您需要做的就是相应地调整权重。