改进的Dijkstra算法

时间:2016-11-07 14:53:11

标签: algorithm graph dijkstra shortest-path heuristics

我们得到一个边缘权重W位于0和1之间的有向图。从源节点到目标节点的路径成本是位于从源节点到目标节点的路径上的边缘权重的乘积。我想知道一种算法,它可以在多项式时间内找到最小成本路径或使用任何其他启发式算法。

我认为沿着获取边权重的对数值(采用mod值),然后对此图应用dijkstra,但认为会出现无法计算的精度问题。

还有其他更好的方法,还是我可以改进日志方法。

1 个答案:

答案 0 :(得分:1)

在Dijkstra的算法中,当您访问节点时,您知道此节点没有更短的路径。如果将边数乘以0..1之间的权重,则情况并非如此,就像访问更多顶点一样,您将获得更小的数字。

基本上这相当于在图中找到最长的路径。这也可以通过使用你的对数的想法来看到,因为0和1之间的数字的对数是负的。如果取对数的对数的绝对值,则最长路径对应于乘法图中的最短路径。

如果您的图表是非循环的,则会有一个简单的算法(从Longest path problem修改)。

  1. 查找DAG的拓扑排序。
  2. 对于每个顶点,您需要存储路径的成本。在开头将其初始化为一个。
  3. 从开始顶点开始以拓扑顺序遍历DAG。在每个顶点检查所有子节点,如果成本小于以前,则更新它。存储以最低成本到达此顶点的顶点。
  4. 到达最终顶点后,您可以使用存储的顶点从末端顶点返回找到“最短”路径。

    当然,如果你的图形不是非循环的,你可以通过无限重复循环来达到零终端成本。