我们给出了一个带有两个源和两个目标顶点(比如s1,s2,d1,d2)的加权无向图。 对于从源1到目的地1以及从源2到目的地2,成本定义为:
总之,如果两条路径使用相同的边缘,则总成本增加“1.5 x weight”而不是“2 x weight”。鼓励使用共同边缘。
如果路径使用具有相反方向的边缘,则不会降低成本。
确定最小化总费用的算法的任何帮助,想法或建议?
答案 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)
对应于原始图表中两个节点a
和b
的组合。此新图表的节点连接如下:(a, b)
和(c, d)
之间有一条边iff:
a
到c
或a == b
有一条边,b
到d
或b == d
。此新边的成本对应于原始图中两条边的总和,除非 a = b
和c = d
,在这种情况下,成本是原始图形的总和边缘乘以1.5。
此新图表还包含两个节点(s1, s2)
和(d1, d2)
。只需确定这两个节点之间的最短路径,就可以很容易地推导出原始图中的各个路径。
附录:
基于Floyd的方法的主要优点是,您可以在问题陈述的修改方面获得更大的灵活性。例如,可以解决问题的变化,其中只有当两个旅行者在相同的“步骤”中共享边缘时才授予“共享折扣”:您需要做的就是相应地调整权重。